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