emacs-keybindings plugin の開発をしています。
ファイルの先頭や末尾にカーソルを移動するコマンドが emacs では alt-< や alt-> であるため、それらのキーに editor:go-doc-start や editor:go-doc-end を割り当ててみたのですが、< や > がshiftを押した状態で入力するキーであるため、選択領域が広がってしまいます。
editor:go-doc-start ではなく CodeMirror の goDocStart を実行してみましたが、やはり選択領域が広がってしまいました。
shiftを含むキーの組み合わせで、単純にカーソル移動のみを行うことをはできますか?
利用環境
Platform: (Manjaro Linux)
App Version: (4.6.0)
craftzdog
(Takuya Matsuyama)
May 1, 2020, 8:52am
2
Shunichiさん
こんにちは。
editor:go-doc-startは内部で goDocStart を呼び出しているので挙動は等価です。
このコマンドのCodeMirrorの内部実装を見てみました:
}),
delWrappedLineRight: cm => deleteNearSelection(cm, range => {
let top = cm.charCoords(range.head, "div").top + 5
let rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div")
return {from: range.from(), to: rightPos }
}),
undo: cm => cm.undo(),
redo: cm => cm.redo(),
undoSelection: cm => cm.undoSelection(),
redoSelection: cm => cm.redoSelection(),
goDocStart: cm => cm.extendSelection(Pos(cm.firstLine(), 0)),
goDocEnd: cm => cm.extendSelection(Pos(cm.lastLine())),
goLineStart: cm => cm.extendSelectionsBy(range => lineStart(cm, range.head.line),
{origin: "+move", bias: 1}
),
goLineStartSmart: cm => cm.extendSelectionsBy(range => lineStartSmart(cm, range.head),
{origin: "+move", bias: 1}
),
goLineEnd: cm => cm.extendSelectionsBy(range => lineEnd(cm, range.head.line),
{origin: "+move", bias: -1}
),
extendSelection はドキュメントによると:
Similar to setSelection , but will, if shift is held or the extending flag is set, move the head of the selection while leaving the anchor at its current place.
つまりアンカーは動きません。
なのでこの場合は setSelectionかsetSelections を代わりに呼び出せばよいかと思われます。
ご参考下さい。
setSelection で意図通りの挙動にできました。
ありがとうございます!
function beginningOfBuffer(cm) {
const newHead = Pos(cm.firstLine(), 0);
const newAnchor = cm.getExtending() ? cm.getCursor('anchor') : newHead;
cm.setSelection(newAnchor, newHead);
}
function endOfBuffer(cm) {
const newHead = Pos(cm.lastLine());
const newAnchor = cm.getExtending() ? cm.getCursor('anchor') : newHead;
cm.setSelection(newAnchor, newHead);
}
1 Like