2014年3月30日日曜日

yamyで窓でもVimる-part2-

前回、Vimライクな動作の仕様を大雑把に(厳格に決めてないところはエンジニアとして致命的だと思うんだ)決めたわけですが、今回はそれを実装すべく、具体的に設定ファイルを書いていこうと思います。

まず、ファイル名は.mayuならなんでも良さそうなのでmyVim.mayuにしました。
そして、前回同様、Vimedit.mayuを参考に書いていきましょう。

まず、モードなんですが、ロック機能を使います。
L0 Normal Mode
L1 Insert Mode
L2 Overwrite Once
L3 Overwrite Continously
L4 Character-wise Visual Mode
L5 Block-wise Visual Mode
L6 Line-wise Visual mode

にしました。
ここまでパクって怒られないものかと...
ちなみに言いますと、Overwrite Onceを&Prefixを使って再現しようとして失敗しました。

keymap2 OverwirteOnce : Global
    key L0-*S-i = Delete *S-i #a~z,数字キー、記号キーも同様に定義してあるよ!
keymap Global
    key L0-r = &Prefix(OverwriteOnce)
    key L0-i = &Toggle(Lock1,on)

なんて書くと、一件よさそに見えるのですが、

abcdefg

のcとdの間でriって押すとするじゃないですか、すると

abciefg

ってなってくれるところまでは嬉しいのですが、本来はここでノーマルモードでなきゃいけないのですがインサートモードになってしまうんです。


この問題が解決できずに結局vimedit.mayuを参考にする結果となりました。

ちなみに、L0はVimモードのON,Offも兼ねるようにしてあります。
VimモードのOn,Offの切り替えにはAlt + 左ダイヤモンドキーを割り当てました。右ダイヤモンドキーはWindowsキーとして使います。
また、左ダイヤモンドキーを単独で押した場合にはL0~L9のすべてをOffにするようにしました。
すべてのロックを解除したいときに助かるかなと。

次に、と言ってもまたVimedit.mayuをパクるだけですが、安全のためにすべてのキーを無効にするんだそうです。
とは言っても、挿入モードと上書きモードはそのまま出力されたほうが嬉しいので、
key L0-~L1-~L2-~L3-*a = &Ignore
と言った感じで記述していきました。


そして、次に書いたのがキーでバッグです。
何がL0~L9のどれがOnでどれがOffかわからない時に重宝します。
一度、左ダイヤモンドキーのキーコードを間違えたがためにL0がOnになりっぱなしの自体に陥りましたが、この機能に救われて何とか原因を発見することができました。
  key ~L0-*L1-*L2-*L3-*L4-*L5-*L6-*L7-*L8-*L9-C-S-_0 = Space S-L o c k S-O f f _0 Space
  key *L0-~L1-*L2-*L3-*L4-*L5-*L6-*L7-*L8-*L9-C-S-_1 = Space S-L o c k S-O f f _1 Space
  key *L0-*L1-~L2-*L3-*L4-*L5-*L6-*L7-*L8-*L9-C-S-_2 = Space S-L o c k S-O f f _2 Space
  key *L0-*L1-*L2-~L3-*L4-*L5-*L6-*L7-*L8-*L9-C-S-_3 = Space S-L o c k S-O f f _3 Space
  key *L0-*L1-*L2-*L3-~L4-*L5-*L6-*L7-*L8-*L9-C-S-_4 = Space S-L o c k S-O f f _4 Space
  key *L0-*L1-*L2-*L3-*L4-~L5-*L6-*L7-*L8-*L9-C-S-_5 = Space S-L o c k S-O f f _5 Space
  key *L0-*L1-*L2-*L3-*L4-*L5-~L6-*L7-*L8-*L9-C-S-_6 = Space S-L o c k S-O f f _6 Space
  key *L0-*L1-*L2-*L3-*L4-*L5-*L6-~L7-*L8-*L9-C-S-_7 = Space S-L o c k S-O f f _7 Space
  key *L0-*L1-*L2-*L3-*L4-*L5-*L6-*L7-~L8-*L9-C-S-_8 = Space S-L o c k S-O f f _8 Space
  key *L0-*L1-*L2-*L3-*L4-*L5-*L6-*L7-*L8-~L9-C-S-_9 = Space S-L o c k S-O f f _9 Space
  key L0-*L1-*L2-*L3-*L4-*L5-*L6-*L7-*L8-*L9-C-S-_0 = Space S-L o c k S-O n _0 Space
  key *L0-L1-*L2-*L3-*L4-*L5-*L6-*L7-*L8-*L9-C-S-_1 = Space S-L o c k S-O n _1 Space
  key *L0-*L1-L2-*L3-*L4-*L5-*L6-*L7-*L8-*L9-C-S-_2 = Space S-L o c k S-O n _2 Space
  key *L0-*L1-*L2-L3-*L4-*L5-*L6-*L7-*L8-*L9-C-S-_3 = Space S-L o c k S-O n _3 Space
  key *L0-*L1-*L2-*L3-L4-*L5-*L6-*L7-*L8-*L9-C-S-_4 = Space S-L o c k S-O n _4 Space
  key *L0-*L1-*L2-*L3-*L4-L5-*L6-*L7-*L8-*L9-C-S-_5 = Space S-L o c k S-O n _6 Space
  key *L0-*L1-*L2-*L3-*L4-*L5-L6-*L7-*L8-*L9-C-S-_6 = Space S-L o c k S-O n _6 Space
  key *L0-*L1-*L2-*L3-*L4-*L5-*L6-L7-*L8-*L9-C-S-_7 = Space S-L o c k S-O n _7 Space
  key *L0-*L1-*L2-*L3-*L4-*L5-*L6-*L7-L8-*L9-C-S-_7 = Space S-L o c k S-O n _8 Space
  key *L0-*L1-*L2-*L3-*L4-*L5-*L6-*L7-*L8-L9-C-S-_9 = Space S-L o c k S-O n _9 Space

これは便利でした。

次に記述したのはEscとかCtrl + [を押した時にノーマルモードに戻る支持。
key L0-*ESC = &Toggle(Lock1,off) &Toggle(Lock2,off) &Toggle(Lock3,off) &Toggle(Lock4,off) &Toggle(Lock5,off)
  key L0-C-*LeftSquareBracket = &Toggle(Lock1,off) &Toggle(Lock2,off) &Toggle(Lock3,off) &Toggle(Lock4,off) &Toggle(Lock5,off)

次に、ノーマルモードでの命令をテキトーに書いてみましょう。
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-_0 = Home
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-S-_4 = End
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-h = Left
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-j = Down
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-k = Up
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-l = Right
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-y = C-c
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-S-y = Up End S-Down S-End C-c Right
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-p = C-v
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-S-p = Up End C-v
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-x = Delete
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-C-f = PageDown
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-C-b = PageUp
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-C-d = &Variable(0,10) &Repeat((Up))
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-C-u = &Variable(0,10) &Repeat((Down))
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-u = C-z
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-C-r = C-y
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-Tab = Space Space Space Space


keymap2 DeletePre : Global
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-S-_4 = S-End C-x
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-_0 = S-Home C-x
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-d = Up End S-Down S-End C-x

keymap2 LeftIndentPre : Global
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-S-Comma = Home &Variable(0,4) &Repeat((Delete))

keymap2 RightIndentPre : Global
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-S-Period = Home &Variable(0,4) &Repeat((Space))


keymap2 ChangePre : Global
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-S-_4 = S-End C-x &Toggle(Lock1,on)
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-_0 = S-Home C-x &Toggle(Lock1,on)

keymap Global
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-d = &Prefix(DeletePre)
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-S-Comma = &Prefix(LeftIndentPre)
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-S-Period = &Prefix(RightIndentPre)
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-c = &Prefix(ChangePre)

ただこれだけ。
大したことはありませんね。

あとは、コロンで始まる命令たちをどうしてあげるかですが、とりあえず放置する方向で。

次に、モードの切り替えはこんなもんで大丈夫でしょうか?
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-*S-i = &Toggle(Lock1,on)          
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-o = End Enter &Toggle(Lock1,on)    
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-S-o = Home Enter Up &Toggle(Lock1,on)
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-*S-a = &Toggle(Lock1,on)          
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-r = &Toggle(Lock2,on)
  key L0-~L1-~L2-~L3-~L4-~L5-~L6-~L7-~L8-~L9-S-r = &Toggle(Lock3,on)

インサートモードは多分何も記述しなくても大丈夫なのでは無いかと思うんですがどうなんでしょうね?

次に、上書き(1回)モードですが、
右辺をDelete *S-a &Toggle(Lock2,off)みたいにすれば大丈夫なんじゃないかな。
もう一個の方の上書きモードは最後の&Toggleをなくすことと、
ESC or Ctrl + [が押された時に&Toggle(Lock3,off)を発生させればいいのかなと。

あとはVisualモードですが、どうやるんだろうこれ(´・ω・`)
せっせとVimedit.mayuを参考にします。
それにしても、この設定ファイル綺麗だなぁと。
俺の作ってるファイルのベタ書き具合がひどいのなんのってwww
まぁ、とりあえずは動けばいいやで行くので。

矩形選択は...TeraPadのショートカットキーらしい。
なので実装しない方向で。

そして、基本的にノーマルモードの動きにシフトをつけているだけみたいなので、せっせとコピペして完成!

しかし、こんな設定ではVimライクとはなかなか言えないですね。
回数指定でコマンド実行とか、.コマンドが使えないあたりはなんというか...
しかも、矩形選択からの挿入ができないのも辛い。
やっぱりVimって優秀なんですよ。
しばらくはこれで使ってみて、見えてきた改善点を修正しながらバージョン2,バージョン3と作っていこうかなと思います。

最後に触れておきますが、今回俺が頑張って作ったように書いていますけれども、基本的にvimedit.mayuのパクリなので。
このブログの方には感謝です。





0 件のコメント:

コメントを投稿