レジスタ その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");
         }
       },