プログラマのためのキーマップを本気で考えてみた

最高傑作が出来た。これはおすすめせざるをえない。
まだ途中ではあるが。


(2008.12.10 z後の補完が不完全であったためdot.nodoka追加)

何を基準にするのか?

プログラムをするのに、現在のキーマップは不便すぎる。なにせ、重要な記号が上や右上に追いやられてしまっているからだ。そこで記号の打ちやすさを改善すべく作ってみた。

基本原則がある。頻繁に使うものを打ちやすい位置に。
そしてなるべく合理的に、覚え易く。


俺の一日の成果が以下だ。HHKpro2での使用を想定している。

修飾キーを何にするのか?

デフォルトでshiftを名乗る左右のそいつだ。
SandSの存在を知った時点で俺の勝ちは見えていた。
SandSとは、Shift and Spaceのことであり(Space and Shiftという意見もある)、Spaceを押しながら他のキーを押すとshiftとして機能し、Space単発で押すとSpaceとして機能するという機能のことだ。窓使いの憂鬱の後継である「のどか」他で実装出来る。1800円。


これでシフトキーが空くことになるわけだ。
以後、このシフトをSAK(Special Assigned Key)とでも呼ぶ。
このSAKを押している間だけ、キーマップが上図のようになる。

何が重要なのか?

「プログラムを行う上で最も重要な記号はなんだ?」と問われたら、俺は「イコールキーだ」と即答するだろう。今なら。
代入と等価演算子に使われるそれは、それだけで全てを凌駕する。
そこでイコールをホーム最容易打10年ランキング一位を誇る J に割り当てた。それと共に、四則演算周りの記号をその周辺に配置した。四則演算子はただ数学的演算に使われるのみならず、文字連結演算子やポインタ演算子ディレクトリの区切り等、重要な意味を持ちやすいからだ。
とは言えスラッシュが無いのはデフォルトで十分押し易いと考えたため。そのまま単発で押せ。



US,JISキーボードどちらでも良いのだが、デフォルトでの括弧の押し難さは異常だ。何が嬉しくてこんなに小指を酷使しないといけないのだろう。しかも打鍵もたまにミスるし。
この配置ではそのような悩みは全て無くした。最も指が長い二の指、三の指に配置した。もちろん頻出順に、括弧、角括弧、中括弧としている。さらにその下にはQuoteとDoubleQuoteを配置した。文字列はどの言語であっても最重要オブジェクトのひとつであるからだ。

何でそこにESCがあるのさ

俺がVimユーザであるためだ。Escは俺にとって重要な意味を持っている。
というかC-[をもっと近くにしたかった。
shiftキーでone-shot modifierにすれば良いという意見もあったが、押し間違いでEscになる煩わしさを俺は経験的に知った。
そして次回の拡張のためのキーでもある。

数字は押し難いよな

その通り。数字は押し難い。それゆえ数字もなるべく簡単に押せるよう考えた。
修飾キーはSAK+zキーだ。隣り同士であるのでそこまで押し難くはないだろう。
初めは3x3マトリックスにしようと思ったが、打ち辛く、配置が覚え辛くなる上に、そこまで分り易いというわけでもない。ということで2x5にした。

それで?

なんとこの配置を実装すると、記号と数字が全て「左手修飾キー」+「右手」で押せることになる。
押しやすく、覚えやすい位置で。

今後の課題

  • どこでもvimを実装する
  • どこでもカーソルキーを実装する
  • どこでもポインタを実装する

あほなの?

ハッカーになるべく生まれておきながら、何故躊躇する必要があるのだ。



ということで以下dot.nodoka.USキーボード(101,104)に対応。
以下言及していないけど入っている設定

  • SemiColonがEnter
    • 慣れると病みつきになる.
  • その右がColon
    • quoteの位置
  • Shift+ColonでSemiColon
    • Colonのほうが重要じゃん。
  • CandI(Ctrl and ImeSwitch)
    • おすすめ。打ち間違えても被害が少ないし。
# Shift and Space
mod shift += !!Space
key R-*Space = &Ignore

# Control and ImeSwitch
mod ctrl += !!LeftControl
key *LeftControl = *$ToggleIME

# Colon, Enter, Quote, etc
key Semicolon = Enter
key IC-Semicolon = Enter
key S-Semicolon = Semicolon
key S-IC-Semicolon = Semicolon
key Apostrophe = S-Semicolon
key IC-Apostrophe = S-SemiColon
key IL-Apostrophe = S-SemiColon
key S-Apostrophe = Semicolon

# C-h, C-d
key C-h = BackSpace
#key C-d = Delete

# user defined one-shot modifier key
def key LeftSpecialAssign = 0x2a
def key RightSpecialAssign = 0x36
mod mod4 += !!LeftSpecialAssign
mod mod4 += !!RightSpecialAssign
mod mod5 = !!z

# digit
key m4-q = _1
key m4-w = _2
key m4-e = _3
key m4-r = _4
key m4-t = _5
#
key m4-a = _6
key m4-s = _7
key m4-d = _8
key m4-f = _9
key m4-g = _0
#
key m4-m5-y = _1
key m4-m5-u = _2
key m4-m5-i = _3
key m4-m5-o = _4
key m4-m5-p = _5
#
key m4-m5-h = _6
key m4-m5-j = _7
key m4-m5-k = _8
key m4-m5-l = _9
key m4-m5-Semicolon = _0
key m4-m5-Apostrophe = EqualsSign
#
key m4-m5-n = S-EqualsSign
key m4-m5-m = S-HyphenMinus
key m4-m5-Comma = S-_8
key m4-m5-FullStop = FullStop
key m4-m5-Solidus = Solidus

# sign
key m4-_6 = S-_6
key m4-_7 = S-_4
key m4-_8 = S-LeftSquareBracket
key m4-_9 = S-RightSquareBracket
key m4-_0 = S-GraveAccent
key m4-HyphenMinus = GraveAccent
key m4-EqualsSign = &Ignore
#
key m4-y = S-_2
key m4-u = S-_5
key m4-i = LeftSquareBracket
key m4-o = RightSquareBracket
key m4-p = S-_1
key m4-LeftSquareBracket = S-_7
key m4-RightSquareBracket = S-ReverseSolidus
#
key m4-h = S-_8
key m4-j = EqualsSign
key m4-k = S-_9
key m4-l = S-_0
key m4-Semicolon = Escape
key m4-Quote = S-HyphenMinus
#
key m4-b = S-_3
key m4-n = S-EqualsSign
key m4-m = HyphenMinus
key m4-Comma = Apostrophe
key m4-FullStop = S-Apostrophe
key m4-Solidus = ReverseSolidus

# Complement after hitting z
key ~m4-m5-q = z q
key ~m4-m5-w = z w
key ~m4-m5-e = z e
key ~m4-m5-r = z r
key ~m4-m5-t = z t
#
key ~m4-m5-y = z y
key ~m4-m5-u = z u
key ~m4-m5-i = z i
key ~m4-m5-o = z o
key ~m4-m5-p = z p
#
key ~m4-m5-a = z a
key ~m4-m5-s = z s
key ~m4-m5-d = z d
key ~m4-m5-f = z f
key ~m4-m5-g = z g
#
key ~m4-m5-h = z h
key ~m4-m5-j = z j
key ~m4-m5-k = z k
key ~m4-m5-l = z l
key m5-Semicolon = z Enter
key ~m4-m5-S-Semicolon = S-Semicolon
#
#key m5-z = z z
key ~m4-m5-x = z x
key ~m4-m5-c = z c
key ~m4-m5-v = z v
key ~m4-m5-b = z b
#
key ~m4-m5-n = z n
key ~m4-m5-m = z m
key ~m4-m5-Comma = z Comma
key ~m4-m5-FullStop = z FullStop
key ~m4-m5-Solidus = z Solidus
#
key ~m4-IC-m5-q = z q
key ~m4-IC-m5-w = z w
key ~m4-IC-m5-e = z e
key ~m4-IC-m5-r = z r
key ~m4-IC-m5-t = z t
#
key ~m4-IC-m5-y = z y
key ~m4-IC-m5-u = z u
key ~m4-IC-m5-i = z i
key ~m4-IC-m5-o = z o
key ~m4-IC-m5-p = z p
#
key ~m4-IC-m5-a = z a
key ~m4-IC-m5-s = z s
key ~m4-IC-m5-d = z d
key ~m4-IC-m5-f = z f
key ~m4-IC-m5-g = z g
#
key ~m4-IC-m5-h = z h
key ~m4-IC-m5-j = z j
key ~m4-IC-m5-k = z k
key ~m4-IC-m5-l = z l
key m5-IC-Semicolon = z Enter
key ~m4-IC-m5-S-Semicolon = S-Semicolon
#
#key m5-IC-z = z z
key ~m4-IC-m5-x = z x
key ~m4-IC-m5-c = z c
key ~m4-IC-m5-v = z v
key ~m4-IC-m5-b = z b
#
key ~m4-IC-m5-n = z n
key ~m4-IC-m5-m = z m
key ~m4-IC-m5-Comma = z Comma
key ~m4-IC-m5-FullStop = z FullStop
key ~m4-IC-m5-Solidus = z Solidus
#
key ~m4-IL-m5-q = z q
key ~m4-IL-m5-w = z w
key ~m4-IL-m5-e = z e
key ~m4-IL-m5-r = z r
key ~m4-IL-m5-t = z t
#
key ~m4-IL-m5-y = z y
key ~m4-IL-m5-u = z u
key ~m4-IL-m5-i = z i
key ~m4-IL-m5-o = z o
key ~m4-IL-m5-p = z p
#
key ~m4-IL-m5-a = z a
key ~m4-IL-m5-s = z s
key ~m4-IL-m5-d = z d
key ~m4-IL-m5-f = z f
key ~m4-IL-m5-g = z g
#
key ~m4-IL-m5-h = z h
key ~m4-IL-m5-j = z j
key ~m4-IL-m5-k = z k
key ~m4-IL-m5-l = z l
key m5-IL-Semicolon = z Enter
key ~m4-IL-m5-S-Semicolon = S-Semicolon
#
#key m5-IL-z = z z
key ~m4-IL-m5-x = z x
key ~m4-IL-m5-c = z c
key ~m4-IL-m5-v = z v
key ~m4-IL-m5-b = z b
#
key ~m4-IL-m5-n = z n
key ~m4-IL-m5-m = z m
key ~m4-IL-m5-Comma = z Comma
key ~m4-IL-m5-FullStop = z FullStop
key ~m4-IL-m5-Solidus = z Solidus