rcmdnk's blog

20170906_vimemu_200_200

前回 紹介したKarabiner-Elementsを使ったVim emulationで ESC等のモード変換キーを切り分けて、 さらにJKの同時押しなどSimultaneous keysによる モード変換を入れました。

Sponsored Links

Vim emulationでの変換モードの切り分け

manipulatorsのリストを別のruleとして分けたとしても特に問題は無いので 分けただけ。

ただ、入力キーが被ると前の方が優先されるのでちょっと注意が必要です。

同じキーでも条件によって違う動作をする場合は複数の設定がありますが、 特定の条件では同じになるものもあって順序が逆になると動作がおかしくなるものがあります 1

今のところ

  • ESC to enter normal mode
  • Ctrl-[ to enter normal mode
  • Simultaneous jk to toggle normal-insert mode
  • Simultaneous sd to toggle normal-insert mode
  • Vim emulation core part

の5つの設定がありますが、最後のものがVimライクな操作を設定するものなので必ず必要なもの。 後のはモードを変更するための設定でどれかをEnableすればOKです。

ただし、Simultaneousな2つの設定については JSがcoreの中で使われているので Enable listの中で必ずVim emulation core partより上にある必要があります。

Simultaneous keysの設定方法

Simultaneous jkという設定はJKを同時に押した時に その効果が発動する設定です。

JK単独で押した時には通常のJKもしくはそれに割り当てられた動作をします。

設定方法としては、まずJについてのマッピングで、

  • toset_variableで適当な変数の値を変える
  • to_if_aloneに本来のJの機能を与える(何もしてないなら"key_code": "j")。
  • to_after_key_upに変数の値を戻す設定をする。

次にK

  • conditionsvariable_ifの設定を行い、上で変更した変数の条件を設定して行いたい動作を与える。

な感じでやっています。

下のものはちょっと省略したものですが、Simultaneous jkの設定です。

Normal-InsertのトグルなのでJKについてそれぞれ2つずつの設定があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
{
  "description": "Simultaneous jk to toggle normal-insert mode",
  "extra_description_level": 1,
  "manipulators": [
    {
      "type": "basic",
      "from": {
        "key_code": "j"
      },
      "to": [
        {
          "set_variable": {
            "name": "vim_emu_simul",
            "value": 1
          }
        }
      ],
      "to_if_alone": [
        {
          "key_code": "down_arrow"
        }
      ],
      "to_after_key_up": [
        {
          "set_variable": {
            "name": "vim_emu_simul",
            "value": 0
          }
        }
      ],
      "conditions": [
        {
          "type": "frontmost_application_unless",
          "bundle_identifiers": [
          ...
          ]
        },
        {
          "type": "variable_if",
          "name": "vim_emu_normal",
          "value": 1
        }
      ]
    },
    {
      "type": "basic",
      "from": {
        "key_code": "j"
      },
      "to": [
        {
          "set_variable": {
            "name": "vim_emu_simul",
            "value": 1
          }
        }
      ],
      "to_if_alone": [
        {
          "key_code": "j"
        }
      ],
      "to_after_key_up": [
        {
          "set_variable": {
            "name": "vim_emu_simul",
            "value": 0
          }
        }
      ],
      "conditions": [
        {
          "type": "frontmost_application_unless",
          "bundle_identifiers": [
          ...
          ]
        },
        {
          "type": "variable_unless",
          "name": "vim_emu_insert",
          "value": 0
        }
      ]
    },
    {
      "type": "basic",
      "from": {
        "key_code": "k"
      },
      "to": [
        {
          "set_variable": {
            "name": "vim_emu_normal",
            "value": 0
          }
        },
        {
          "set_variable": {
            "name": "vim_emu_insert",
            "value": 1
          }
        },
      ],
      "conditions": [
        {
          "type": "frontmost_application_unless",
          "bundle_identifiers": [
          ...
          ]
        },
        {
          "type": "variable_if",
          "name": "vim_emu_simul",
          "value": 1
        },
        {
          "type": "variable_if",
          "name": "vim_emu_normal",
          "value": 1
        }
      ]
    },
    {
      "type": "basic",
      "from": {
        "key_code": "k"
      },
      "to": [
        {
          "set_variable": {
            "name": "vim_emu_normal",
            "value": 1
          }
        },
        {
          "set_variable": {
            "name": "vim_emu_insert",
            "value": 0
          }
        }
      ],
      "conditions": [
        {
          "type": "frontmost_application_unless",
          "bundle_identifiers": [
          ...
          ]
        },
        {
          "type": "variable_if",
          "name": "vim_emu_simul",
          "value": 1
        },
        {
          "type": "variable_unless",
          "name": "vim_emu_insert",
          "value": 0
        }
      ]
    }
  ]
},

現状のSimultaneous keysの問題点

実際にはちょっと完璧な設定ではなく、 Jを押している間にKが押されたらその動作をする、という設定です。

先にKを押してJを押すと発動しません。

なのでちょっと使うにしても慣れる必要があるかもしれません。

また、このキー設定をしてしまうと、 Jのリピート入力 (Jを押しっぱなしにした時にjjjjjj...と書き込む事) ができなくなります。

Vim emulationのノーマルモードでもJを押しっぱなしで 下に移動を続ける、ということが出来なくなります。

なので(Vimでは)余り押しっぱなしで使うことのないsdの方が使い勝手が良いかもしれません。

そもそもこのto_if_alone等の設定がSimultaneous keys用に作られたものでも無いと思いますが、 そのうち別にsimultaneous: ..みたいな設定が出来る様になるかもしれません。 (もしかすると既にその手の設定が既に出来る様になってるかもしれませんが。)

Sponsored Links
    • 条件Aの場合: a=>b
    • 条件なし: a=>c

    みたいな変換をした場合、この順番に書けばAの条件の時にはabが出ますが、 逆に書くとAの条件でもcが出ます。

Sponsored Links

« Vim以外でVimする: Mac+Karabiner-Elements編 ソニーの新しいワイヤレスノイズキャンセリングイヤホンWF-1000Xが気になる »