COMMAND_LINEのマッピング
command-line で ワード移動とコピペが欲しかったので作ってみた。
- ワード移動(逆方向)
- ワード移動(順方向)
- ワード削除(順方向)
- ワード削除(逆方向)
- キャラ移動(順方向)
- キャラ移動(逆方向)
- 貼り付け
これらは、
editor.executeCommand(command, 1);
利用可能コマンド一覧はこちらにあります。
切り取りはbash っぽく実装が大変そうだったので、emacs っぽくしました。
(A-wは リージョンコピーなのですが、C-w すでに 埋まっていたので代用)
- mark set
- リージョン切り取り
なお、insert モードでも問題無く動きそうだったので、
そちらでも有効にしちゃってます。
(function(){ var aMode = [ modes.COMMAND_LINE, modes.INSERT, ]; var desc = "command line mapping"; function apply_command(map,command){ mappings.addUserMap(aMode, [map], desc, function(){ editor.executeCommand(command, 1); }); } //https://developer.mozilla.org/ja/XUL/List_of_commands cMap={ "<a-b>" : "cmd_wordPrevious", "<a-f>" : "cmd_wordNext", "<a-d>" : "cmd_deleteWordForward", "<a-h>" : "cmd_deleteWordBackward", "<c-f>" : "cmd_charNext", "<c-b>" : "cmd_charPrevious", "<c-y>": "cmd_paste", }; for(let [map,cmd] in Iterator(cMap)){ apply_command(map, cmd); } let(anchor=null){ mappings.addUserMap(aMode,["<C-Space>"],"mark set",function(){ let node = liberator.focus; if(!(node instanceof Ci.nsIDOMNSEditableElement)) return; let editor = node.editor; let sel = editor.selection; if(sel.rangeCount > 0){ anchor = sel.getRangeAt(0); } }); mappings.addUserMap(aMode,["<A-W>"],"mark set",function(){ if(!anchor) return; let node = liberator.focus; if(!(node instanceof Ci.nsIDOMNSEditableElement)) return; let editor = node.editor; let sel = editor.selection; if(anchor.commonAncestorContainer.ownerDocument !== node.ownerDocument) return; let focus = sel.getRangeAt(0); sel.removeAllRanges(); let r = node.ownerDocument.createRange(); let(src=anchor.compareBoundaryPoints(Range.START_TO_START, focus) < 0 ? anchor : focus) r.setStart(src.startContainer, src.startOffset); let(src=anchor.compareBoundaryPoints(Range.END_TO_END, focus) > 0 ? anchor : focus) r.setEnd(src.endContainer, src.endOffset); sel.addRange(r); editor.cut(); }); } })();