VimでDvorakしよう2013年02月13日 00:02

この記事は Vim advent calendar の75日目です。74日目は Mi_Sawaさん の template/snippet plugin for Battle Programmer でした。

標準的には25日目までなはずですから、なんと3倍!クリスマスっていつでしたっけ。明日はバレンタインデーですよ。えっ……中止?

あなたはQWERTY派?それともDvorak派?

突然ですが、キーボードレイアウトの時間です。

みなさまおなじみQWERTY

+----+----+----+----+----+----+----+----+----+----+----+----+
| !  | @  | #  | $  | %  | ^  | &  | *  | (  | )  | _  | +  |
|  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 |  0 |  - |  = |
++---++---++---++---++---++---++---++---++---++---++---++---++
 |    |    |    |    |    |    |    |    |    |    | {  | }  |
 |  Q |  W |  E |  R |  T |  Y |  U |  I |  O |  P |  [ |  ] |
 ++---++---++---++---++---++---++---++---++---++---++---++---+
  |    |    |    |    |    |    |    |    |    | :  | "  |
  |  A |  S |  D |  F |  G |  H |  J |  K |  L |  ; |  ' |
  ++---++---++---++---++---++---++---++---++---++---++---+
   |    |    |    |    |    |    |    | <  | >  | ?  |
   |  Z |  X |  C |  V |  B |  N |  M |  , |  . |  / |
   +----+----+----+----+----+----+----+----+----+----+

Dvorak

+----+----+----+----+----+----+----+----+----+----+----+----+
| !  | @  | #  | $  | %  | ^  | &  | *  | (  | )  | {  | }  |
|  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 |  0 |  [ |  ] |
++---++---++---++---++---++---++---++---++---++---++---++---++
 | "  | <  | >  |    |    |    |    |    |    |    | ?  | +  |
 |  ' |  , |  . |  P |  Y |  F |  G |  C |  R |  L |  / |  = |
 ++---++---++---++---++---++---++---++---++---++---++---++---+
  |    |    |    |    |    |    |    |    |    |    | _  |
  |  A |  O |  E |  U |  I |  D |  H |  T |  N |  S |  - |
  ++---++---++---++---++---++---++---++---++---++---++---+
   | :  |    |    |    |    |    |    |    |    |    |
   |  ; |  Q |  J |  K |  X |  B |  M |  W |  V |  Z |
   +----+----+----+----+----+----+----+----+----+----+

私は、ながらくDvorakつかっています。Dvorak布教するつもりはあまりないので理由は延べませんが、使い始めてそろそろ11年経ったことに気づきました。うぎゃぁー

……えっと、残念ながらハードウェアでDvorakなキーボードは所持しておりませんが、ソフトウェアでDvorak設定にする派です。

プライベートで使ってる端末はすべてDebianのインストーラで真っ先にDvorakを選択しますし、 「いかんともしがたい理由により」Windowsな端末の場合でも、定番の「窓使いの憂鬱」やその後継の「のどか」を入れて、さくっと設定します。 場合によってはレジストリでもいいかもしれませんね!

大抵の場合は、キーボードレイアウトは、ソフトウェアレベルで比較的自由に設定できます。自由すばらしい。

私が本当にほしいのはたぶん自由ではなく「私に合った不自由」だと思うのですが、そんな意味不明な主張はさておきまして、やっとVimの話です。

DvorakでVim

Dvorak派のひとでも、Vimを使う場合、(特にノーマルモードの)コマンドのキーだけはQWERTYにしたい、という話をたびたび見かけます。 特に、QWERTY なら右手ホームポジション付近で横に並んでる HJKL が Dvorak では散り散りになってしまうののを嫌う向きは多いみたいです。

ですが、Dvorakのそのままでもいいじゃん、というひともいます

私はまさに、この考え方に同意します。HJKLを使う頻度ってそれほど高くない気はするものの

jk が隣り同士でしょ。hl は離れてるけど、きちんと左と右側に位置してるでしょ。

しゅごい!!

しゅごいのです!!!

補足しますと、垂直移動の jk が左手、水平移動の hl が右手に分かれているのが、なんともすばらしい。

ほとんど排反といっていい操作が同じ側の手に、独立であってほしい操作が違う側の手に、それぞれきれいに割り当てられています。 片手での操作の難易度が上がるというデメリットはあるものの、普通に使う分には Dvorak の方が効率的な操作が期待できます。

実に合理的です。Dvorak配列でVim、こわくないです

+----+----+----+----+----+----+----+----+----+----+----+----+
|    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |
++---++---++---++---++---++---++---++---++---++---++---++---++
 |    |    |    |    |    |    |    |    |    |    |    |    |
 |    |    |    |    |    |    |    |    |    |  L |    |    |
 ++---++---++---++---++---++---++---++---++---++---++---++---+
  |    |    |    |    |    |    |    |    |    |    |    |
  |    |    |    |    |    |    |  H |    |    |    |    |
  ++---++---++---++---++---++---++---++---++---++---++---+
   |    |    |    |    |    |    |    |    |    |    |
   |    |    |  J |  K |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+----+----+

……まあ、そういうことを考えてきめたというわけではないのですが、私はDvorakのままVimをカラダで覚えてしまっています。

立場をまとめてみます。

Vimつかってるよ派 (世界全体)
|
+-- QWERTYだよ派 (多数、保守)
|
+-+ Dvorakだよ派 (少数、革新)
  |
  +-- ノーマルモードとかのコマンドはQWERTYっぽいのがいいよ派 (穏健)
  |
  +-- Dvorakそのままでつかうよ派 (原理主義)  ← 私はココ

長くなりましたが、ここまで前置きです。

QWERTYでVim ……というディストピア(私限定)

ある日突然、QWERTYなキーボードで仕事することになったら……キーボードレイアウトの設定も変えられなかったら。 あんまり考えたくない事態です。でも、ありえないとは言い切れません。

もっとも、エディタはVim以外ありえません。ここはいいですね。先の図にも書いたとおり、Vimは世界全体です。

つまり、普段 DvorakのままVimを使っている私が、QWERTYでVimを使うことになったら何が起きるのか考えてみます。

たとえば、カーソル行とその一つ下の行を繋げたいとしましょう。もちろん J です。

Dvorakでは、左手中指下段です(私は人差し指で拾いますが)。アタマより先にカラダが動いてこのキーを押下!

結果……行末まで消えてしまいました。

そう、QWERTYキーボードでこの位置には C があります。

私はただ、次の行を繋げたかっただけなのに。行末まで消えてしまい、あまつさえ挿入モードに切り替わるだなんて。

こんなの絶対おかしいよ!

もうひとつ考えてみましょう。こんどは、カーソル行に新しく空行をつくりたいとしましょう。もちろん O です。

Dvorakでは、左手薬指ホームポジション!もちろん反射的に押下します。

結果……カーソル行の内容が消えてしまいました。

そう、QWERTYキーボードでこの位置には S があります。

たしかに空行はできましたが……私はあたらしい空行がほしかったのに。カーソル行の内容が犠牲になるだなんて。

こんなのってないよ!あんまりだよ!!!ひどすぎるよ……

たった2つだけの例ですが、恐ろしさは伝わりましたでしょうか。でもこれは氷山のほんの一角に過ぎません。

  • 左に動かそうとしたカーソルが下にいた。何を言ってるのかわからねーと思うが(ry
  • 行頭に挿入開始しようとおもったら最下行にいた。何を言ってのるかわか(ry
  • コロンを打ってみたつもりが反応がないのでもう一度打ったら、上書き保存されてVimが終了した。何を(ry

こんな環境に置かれ続けたら、私の魂はあっというまに穢れていくことでしょう。

VimでDvorak

取り越し苦労の最中、ふと気づいてしまいました。端末のキーボードレイアウトを設定できなくても、.vimrcで設定すれば、Vimの中でだけはDvorakが実現できるんじゃないか、と。 シェルには戻らずすべて :! とか徹底すれば、Vimの外に出ずに済むかもしれません……完璧!?

.vimrc は空に近いほどよいという私の好みには合いませんが、穢れきった私の魂が呪いを生み出す存在と成り果ててしまうよりはマシです。

Vimおねえちゃん、Dvorakを使い始める前の、ばかな私を、たすけてあげてくれないかな。

その結果、魂を対価に得られたものがこれです。

no - [
no! - [
no = ]
no! = ]
no q '
no! q '
no w ,
no! w ,
no e .
no! e .
no r p
no! r p
no t y
no! t y
no y f
no! y f
no u g
no! u g
no i c
no! i c
no o r
no! o r
no p l
no! p l
no [ /
no! [ /
no ] =
no! ] =
no a a
no! a a
no s o
no! s o
no d e
no! d e
no f u
no! f u
no g i
no! g i
no h d
no! h d
no j h
no! j h
no k t
no! k t
no l n
no! l n
no ; s
no! ; s
no ' -
no! ' -
no z ;
no! z ;
no x q
no! x q
no c j
no! c j
no v k
no! v k
no b x
no! b x
no n b
no! n b
no m m
no! m m
no , w
no! , w
no . v
no! . v
no / z
no! / z
no _ {
no! _ {
no + }
no! + }
no Q "
no! Q "
no W <
no! W <
no E >
no! E >
no R P
no! R P
no T Y
no! T Y
no Y F
no! Y F
no U G
no! U G
no I C
no! I C
no O R
no! O R
no P L
no! P L
no { ?
no! { ?
no } +
no! } +
no A A
no! A A
no S O
no! S O
no D E
no! D E
no F U
no! F U
no G I
no! G I
no H D
no! H D
no J H
no! J H
no K T
no! K T
no L N
no! L N
no : S
no! : S
no " _
no! " _
no Z :
no! Z :
no X Q
no! X Q
no C J
no! C J
no V K
no! V K
no B X
no! B X
no N B
no! N B
no M M
no! M M
no < W
no! < W
no > V
no! > V
no ? Z
no! ? Z

これをvimrcに貼り付けるなりsourceするなりで設定が効きます。

ちなみに こういうスクリプト で生成しました。

実際試してみて、ある程度Dvorakが実現できていることを確認しました。

……が、残念ながらCtrlのときはQWERTYのままです。

Ctrlのときの設定も少し挑戦してみましたが、ターミナルに奪われる場合とか、 Vimの外のことをやっぱり考えないといけない感じで、非常時に頼るわけにはいかない完成度です。今後の課題としましょう。

なお、Dvorakなキーボードレイアウトのときにこの設定をすると、大変なことになります(なりました)。注意しましょう。

明日は @tyruさん です。こんどこそ「ばよえ〜ん」ですね!おめでとうございます。