読者です 読者をやめる 読者になる 読者になる

プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

KeySnailのKillLineをEmacs風に改良してみた

JavaScript KeySnail

 f:id:nodamushi:20151019022132p:plain

 KeySnailネタ。moozさんのアイコンかわいいよね。
 というわけで、なんか、Firefoxがバージョンアップしたら.keysnail.jsの「以前にコピーしたテキスト一覧から選択して貼り付け」のletでエラーが出るらしく、久しぶりに.keysnail.jsを編集しました。

すでに修正されてた(´・д・`)

 自分で修正しんたんすけど、もしかしてって見てみたら、keysnail/functions.js at f22a53fac0c693ccb939b5398494be63d7e1e011 · mooz/keysnail · GitHubにもう一ヶ月ぐらい前に更新されてましたよー。
 うん、Firefox自動更新してないんだ。ごめんね。

 というわけで、コピって貼り付け。

    if (!command.kill.ring.length)
        return;
    
    let ct = command.getClipboardText();
    if (!command.kill.ring.length || ct != command.kill.ring[0]) {
        command.pushKillRing(ct);
    }
    
    prompt.selector(
        {
            message: "Paste:",
            collection: command.kill.ring,
            callback: function (i) { if (i >= 0) key.insertText(command.kill.ring[i]); }
        }
    );



Kill Lineがなんか変

 日頃からどーもなんか気にくわないな、とおもっていたKeySnailのkill-line。


 というのもこれ。ここ(↓)で、Ctrl+Kを押すと………
f:id:nodamushi:20151019012224p:plain
f:id:nodamushi:20151019012230p:plain
 うん、問題ないね。

 でも、ここ(↓)でCtrl+Kを押すと………
f:id:nodamushi:20151019012243p:plain
f:id:nodamushi:20151019012247p:plain
 あっるぅぇえ?(´・д・`) なぜか私のパソコンではこんなんになってなまいます。


 私のパソコンでもこう(↓)なってほしいんですよね。

f:id:nodamushi:20151019012252p:plain


 あと、気になるのこれ。
f:id:nodamushi:20151019031717p:plain
f:id:nodamushi:20151019031726p:plain

 論理行で削除するんじゃなくって、テキストエリアの折り返し行までが削除されるの。これ気に入らないの。




 というわけで、ついでだったので、そうなるように修正したのがこちら。

key.setEditKey('C-k', function (ev) {
    if (command.marked(ev))
            command.resetMark(ev);
    let ta = ev.originalTarget;
    let str = ta.value;

    let i = ta.selectionStart;
    for(let e=ta.value.length;i<e;i++){
        let c = str.charAt(i);
        if(c == "\r" || c == "\n" || c=="\u0085"){
            break;
        }
    }
    ta.selectionEnd = i;
    let cstr = ta.value.substring(ta.selectionStart,ta.selectionEnd).trim();
    command.copySelectedText(ta);
    goDoCommand('cmd_delete');
    if(!cstr){
        goDoCommand('cmd_beginLine');
        let pos = ta.selectionStart;
        goDoCommand('cmd_endLine');
        if(pos != ta.value.length){
            goDoCommand('cmd_deleteCharForward');   
        }else{
            goDoCommand('cmd_deleteCharBackward');
        }
    }
}, 'カーソルから先を一行カット (Kill line)');

 Emacsのkill-lineは削除した文字が空(空白のみの文字列含む)だと、改行文字も消すっぽいので、その処理を追加してあります。


 ちなみに、どうもうまく動かない戦犯は"cmd_deleteToEndOfLine"らしく、こいつを使わないようにすることが重要。なんか、このコマンドって条件はよくわからないんだけど、正しく動作しないことがあるっぽいです。
 最初は、if(!str)ブロックの中身も"cmd_deleteToEndOfLine"を呼び出してただけなんだけど、なぜか2行目にカーソルがあるときに、正しく動かないという状況がまれに発生しました。発生条件は全くもって不明。というわけで、上記の形になっています。文字列処理は嫌ので、キャレットの位置変化から最後の行かどうか判定しています。



 あ、なお、これはFirefoxのバグか、私のプライグイン環境との相性のバグなのかのどっちかです。
 KeySnailのバグではありません。





 あと、ついでに、Ctrl+Jで次の行を生成して移動するってのを作っておいた。
 単に改行だけにしたい人は、goDoCommandを削除してください。

key.setEditKey("C-j",function(ev){
    goDoCommand("cmd_endLine");
    key.generateKey(ev.originalTarget,KeyEvent.DOM_VK_RETURN,true);
},"新しい行を作成",true);


 以上です。




 ところで、EdgeでFirefoxのプラグインが動かせるかもという噂ですが、KeySnailがEdgeで動くかなぁ。
 動けばいいなぁ~ヽ( ・∀・)ノ