レジスタ その4
文字挿入方法を改善しました。
undo/redoが 正常化しました。
あと、スクロールバーもちらつかなくなりました。
参考
http://d.hatena.ne.jp/murky-satyr/20100514/insertText
insertText スクロールバーやカーソルの管理しなくてすむんで素敵です。
diff -r ec761d655684 c_CTRL-R.js --- a/c_CTRL-R.js Wed May 12 21:35:15 2010 +0900 +++ b/c_CTRL-R.js Wed May 19 22:11:56 2010 +0900 @@ -1,7 +1,7 @@ -// vim: set fdm=marker : +// vim: set fdm=marker et : (function(self){ - //const key = self.PATH.toLowerCase(); - const key = self.NAME; + //const key = self.PATH.toLowerCase(); + const key = self.NAME; //{{{ Register Class function Register(){ @@ -76,35 +76,31 @@ let val = this.expand(arg); if(!val) return; let e = Editor.getEditor(); - let [text,start,end, left, top] = [e.value, e.selectionStart,e.selectionEnd, e.scrollLeft, e.scrollTop]; - e.value = text.substr(0, start) + val + text.substr(end); - e.selectionStart=e.selectionEnd= start+val.length; - - scrollIntoView(e, left, top); + e.editor.QueryInterface(Ci.nsIPlaintextEditor).insertText(val); } }; } //}}} - var conf = userContext[key] || (userContext[key]={ - copyToClipboard: util.copyToClipboard, + var conf = userContext[key] || (userContext[key]={ + copyToClipboard: util.copyToClipboard, reg: new Register(), - }); + }); modules.__defineGetter__("Register",function() userContext[key].reg); //{{{ hack paste action - const src = "clipboardHelper.copyString(str);"; + const src = "clipboardHelper.copyString(str);"; - var code = conf.copyToClipboard.toSource().replace(src, src + <> + var code = conf.copyToClipboard.toSource().replace(src, src + <> try{"{"} modules.userContext["{key}"].reg.swap10(str); {"}"}catch(ex){"{"} liberator.echoerr(ex); {"}"} - </>); + </>); - util.copyToClipboard = liberator.eval(<>(function() {code})()</>.toString(),util.copyToClipboard); + util.copyToClipboard = liberator.eval(<>(function() {code})()</>.toString(),util.copyToClipboard); //}}} function dateFormat(fmt) new Date().toLocaleFormat(fmt) @@ -126,7 +122,7 @@ } function scrollIntoView(e, left, top){ - [e.scrollLeft ,e.scrollTop] = [left, top]; + [e.scrollLeft ,e.scrollTop] = [left||0, top||0]; let(editor=e.editor||e.QueryInterface(Ci.nsIDOMNSEditableElement).editor){ let ctrl = editor.selectionController; ctrl.getSelection(Ci.nsISelectionController.SELECTION_NORMAL) @@ -140,22 +136,20 @@ if(modules.modes._modeStack.length > 0) return ""; let isCommand = liberator.mode & liberator.modules.modes.COMMAND_LINE; - let editor = Editor.getEditor(); - let [start,end, text, prompt, left, top] = [editor.selectionStart, editor.selectionEnd, editor.value, - commandline._currentPrompt, editor.scrollLeft, editor.scrollTop]; + let elem = Editor.getEditor(); + let [start,end, text, prompt] = [elem.selectionStart, elem.selectionEnd, elem.value, + commandline._currentPrompt]; commandline.input(extra.prompt || "",function(arg){ try{ commandline._completionList.hide(); let val = extra.action(arg); - text = text.substr(0,start)+val+text.substr(end); if(isCommand){ commandline.open(prompt, text, modes.EX); - }else{ - editor.value = text; + elem.selectionStart = start; + elem.selectionEnd = end; } - editor.selectionStart=editor.selectionEnd=start+val.length; - - scrollIntoView(editor, left, top); + + elem.editor.QueryInterface(Ci.nsIPlaintextEditor).insertText(val); }catch(ex){ liberator.echoerr(ex); } @@ -165,10 +159,10 @@ commandline._completionList.hide(); if(isCommand){ commandline.open(prompt, text, modes.EX); - editor.selectionStart = start; - editor.selectionEnd = end; + elem.selectionStart = start; + elem.selectionEnd = end; - scrollIntoView(editor, left, top); + scrollIntoView(elem); throw new Error("stop escape event"); } },