9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NYAGOSとconemuでキーボード操作の拡張

Last updated at Posted at 2015-11-08

Windows用コマンドラインシェル「NYAGOS」を使い始めたのですが、カーソルキーを多用する私の使い方だと、若干操作に悩ましい部分があったので、拡張してみました。

やりたいこと

  • コマンドラインで1単語単位で左右に移動したい
  • 上記を「CTRL+←」、「CTRL+→」で実現したい
  • NYAGOS単体ではなくて、conemuから動かすことを想定

参考にした解説記事

NYAGOSのマニュアルを見る

  • Lua拡張ができるとのことで、何ができるかを確認したところ、一文字単位の左右移動はLua側からできるようです。
  • 単語単位の情報は引数として渡ってきていないっぽいので、現在位置と動かしたい位置までを一文字ずつ移動させる手段が簡単そうです。文字列が多くなると重くなるかもしれませんが。
  • もう一つ問題は、バインド可能なキーの組み合わせが少なくて、CTRL+矢印とかバインドできないことです。これは後でconemu側でフックさせます。

NYAGOSでLua拡張

  • 左に動かす(戻る方向)は、現在位置から文字列を逆向きに調べて、最初に見つけたスペースまで移動できればいいのですが、Luaはrfind(逆向きサーチ)がなくて、まずそこで詰まりました。
  • stackoverflow先生によると、最長マッチでやりたいことができるよ!とのことで、なるほどと思いました。
  • 正規表現で()とすると、その位置をindex番号で戻すというのはLuaの仕様なんですね。
  • 右に動かす(進む方向)は簡単で、そのままfind使えばいけました。
  • スペースがない場合は、最初か最後まで進むことにしています。
  • バインドキーの割当は、私が使わないであろうキーとして「M_A(ALT+A)」,「M_B(ALT+B)」に割り当てています。
wordmove.lua
-- ref) http://stackoverflow.com/questions/17386792/how-to-implement-string-rfind-in-lua
nyagos.bindkey("M_A",
    function(this)
        local pos = (this.text:sub(1,this.pos-1)):match'.*() '
        if pos and (pos < this.pos) then
            for i = 1, this.pos-pos do
                this:call("BACKWARD_CHAR")
            end
        else
            this:call("BEGINNING_OF_LINE")
        end
        return nil
    end
)

nyagos.bindkey("M_B",
    function(this)
        local pos = this.text:find(' ',this.pos+1)
        if pos and (pos > this.pos) then
            for i = 1, pos-this.pos do
                this:call("FORWARD_CHAR")
            end
        else
            this:call("END_OF_LINE")
        end
        return nil
    end
)

conemuでHotkeyマクロを使う

  • conemuのHotKeyを使えばNYAGOSで割り当てたバインドキーを、別のキーアサインで実現することができます。
  • conemuの「Keys & Macro」で、空いているところ(Macro01とか)にHotkeyを割り当てます。
  • Hotkeyをctrl+LEFTとして、GUI Macroに、Keys("!a")とします。!a=ALT+AでNYAGOSだとM_Aに相当します。
  • Hotkeyをctrl+RIGHTとして、GUI Macroに、Keys("!b")とします。!b=ALT+BでNYAGOSだとM_Bに相当します。
  • これで、conemuから「ctrl+←」と入力すると、ALT+AがNYAGOSに送られて、設定したバインドキーで動作するという流れになります。

2015-11-08_224750.png

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?