COMMAND_LINEのマッピング

command-line で ワード移動とコピペが欲しかったので作ってみた。

基本 bash っぽい キーバインド です。

ワード移動(逆方向)
ワード移動(順方向)
ワード削除(順方向)
ワード削除(逆方向)
キャラ移動(順方向)
キャラ移動(逆方向)
貼り付け

これらは、

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();
		});
	}
})();