窓使いの憂鬱でいろいろvi風キーバインドにしてみる

vimに慣れてくるとその他いろいろなところでvi風キーバインドが使いたくなってくる。
特にメールを書くときなどが顕著だ。
外部エディタとしてのvimも試してみたがやはりメーラからvimに遷移するところがいまいち使いにくい。
vim上で動かすメーラとかもあるみたいだが使い勝手は良いだろうか。少なくとも会社では使えなさそうなので、
窓使いの憂鬱
で、メーラをvi風キーバインドで操作できるようにしてみた。

以下、vi.mayu という名前で ViMode という keymap を定義している。
私の場合は、「Escape」もしくは「Ctrl + L」で ViMode に入るようにしている。
というのは、普段 vim を使う際にも Escape の代わりに C-L で 編集モードへ移行しているからだ。

※2008/9/19 v押下からはじまるビジュアルモードに対応。その他細かい修正。
※2008/10/5 cw等、ワード単位での編集に対応。rに対応。その他細かい修正。

# vi風モード設定

# ===============================================
keymap ViMode : Global

#################################################
# キーマスク(誤操作防止)
#################################################

key L0-*S-A =
key L0-*S-B =
key L0-*S-C =
key L0-*S-D =
key L0-*S-E =
key L0-*S-F =
key L0-*S-G =
key L0-*S-H =
key L0-*S-I =
key L0-*S-J =
key L0-*S-K =
key L0-*S-L =
key L0-*S-M =
key L0-*S-N =
key L0-*S-O =
key L0-*S-P =
key L0-*S-Q =
key L0-*S-R =
key L0-*S-S =
key L0-*S-T =
key L0-*S-U =
key L0-*S-V =
key L0-*S-W =
key L0-*S-X =
key L0-*S-Y =
key L0-*S-Z =

#################################################
# キーシーケンス定義
#################################################

keyseq $GoToHome = Home

#################################################
# vi風モード(編集モード)への入り方
# Lock0 = vimモード(編集モード)
#################################################

key C-L = &Toggle(Lock0,on)
key Escape = &Toggle(Lock0,on)

#################################################
# 通常モード(挿入モード)への入り方
#################################################

key L0-I = &Toggle(Lock0,off)
key L0-A = &Toggle(Lock0,off)
key C-M = Enter &Toggle(Lock0,off)

# 行頭から挿入
key L0-S-I = $GoToHome &Toggle(Lock0,off)

# 行末から挿入
key L0-S-A = End &Toggle(Lock0,off)

# 現在位置から行端までを削除して編集
key L0-S-C = S-End C-X &Toggle(Lock0,off)

# 次行から挿入
key L0-O = End Return &Toggle(Lock0,off)

# 前行から挿入
key L0-S-O = $GoToHome Return Up &Toggle(Lock0,off)

#################################################
# 両モード共通設定
#################################################

key *S-C-P = *S-Up
key *S-C-N = *S-Down

#################################################
# 通常モード(挿入モード)
#################################################

# Oneストロークだけ編集モード

keymap ViOneShot : ViMode

key P = C-V
key H = Left
key J = Down
key K = Up
key L = Right

keymap ViMode

key C-O = &Prefix(ViOneShot)

#################################################
# vi風モード(編集モード)
#################################################

#------------------------------------------------
# カーソル移動

key L0-*S-K = *S-Up
key L0-*S-J = *S-Down
key L0-*S-L = *S-Right
key L0-*S-H = *S-Left

key L0-*S-C-A = *S-Home
key L0-*S-C-E = *S-End

key L0-*S-C-U = PageUp
key L0-*S-C-D = PageDown

key L0-W = C-Right
key L0-B = C-Left

#------------------------------------------------
# カット&コピー
# Lock2 : 行コピーの場合にはon

### コピーモード

keymap ViCopyMode : ViMode

# 行コピー
key L0-Y = $GoToHome S-End C-C End &Toggle(Lock2,on)
# 単語コピー
key L0-W = &Toggle(Lock2,off) S-C-Right C-C Right 

### 切り取りモード

keymap ViDeleteMode : ViMode

# 行切り取り
key L0-D = $GoToHome S-End C-X Delete &Toggle(Lock2,on)
# 単語切り取り
key L0-W = &Toggle(Lock2,off) S-C-Right C-X 

### 置き換えモード

keymap ViReplaceMode : ViMode

# 行置き換え
key L0-C = &Toggle(Lock0,off) $GoToHome S-End C-X &Toggle(Lock2,on)  
# 単語置き換え
key L0-W = &Toggle(Lock2,off) &Toggle(Lock0,off) S-C-Right C-X  

### 一文字置き換えモード

keymap ViCharaReplaceMode : Global

### 編集モード

keymap ViMode

# コピーモードに入る
key L0-Y = &Prefix(ViCopyMode)
# 切り取りモードに入る
key L0-D = &Prefix(ViDeleteMode)
# 置き換えモードに入る
key L0-C = &Prefix(ViReplaceMode)
# 一文字置き換えモードに入る
key L0-R = S-Right &Prefix(ViCharaReplaceMode)

# 次行に貼り付け
key L2-L0-P = End Return $GoToHome C-V
# 前行に貼り付け
key L2-L0-S-P = $GoToHome Return Up C-V
# 貼り付け
key ~L2-L0-*S-P = C-V

# Delete
key L0-X = Delete

# 現在位置から行末までコピー
key L0-S-Y = S-End C-C End

# 現在位置から行末まで切り取り
key L0-S-D = S-End C-X

#------------------------------------------------
# Undo&Redo

key L0-U = C-Z
key L0-C-R = C-Y

#------------------------------------------------
# ビジュアルモード
# Lock2 : ビジュアルモードからのコピーの場合にはon

keyseq $VisualModeOff = Insert Insert &Toggle(Lock0,on) &Toggle(Lock1,off)

### Lock1 をビジュアルモードとする

key L0-V = &Toggle(Lock1,on)
key *L0-L1-V = $VisualModeOff
key *L0-L1-Escape = $VisualModeOff
key *L0-L1-C-L = $VisualModeOff

key L0-S-V = $GoToHome S-End &Toggle(Lock1,on)

### ビジュアルモード中のカーソル移動 

key L1-K = S-Up
key L1-J = S-Down
key L1-L = S-Right
key L1-H = S-Left
key L1-Up = S-Up
key L1-Down = S-Down
key L1-Right = S-Right
key L1-Left = S-Left

key L1-C-A = S-Home
key L1-C-E = S-End
key L1-Home = S-Home
key L1-End = S-End

key L1-C-U = S-PageUp
key L1-C-D = S-PageDown
key L1-PageUp = S-PageUp
key L1-PageDown = S-PageDown

key L1-W = S-C-Right
key L1-B = S-C-Left

### 選択範囲の操作

key L1-Y = &Toggle(Lock2,off) C-C $VisualModeOff
key L1-D = &Toggle(Lock2,off) C-X $VisualModeOff
key L1-C-C = &Toggle(Lock2,off) C-C $VisualModeOff
key L1-C-X = &Toggle(Lock2,off) C-X $VisualModeOff

#------------------------------------------------
# 検索

key L0-~S-N = F3
key L0-S-N = S-F3

# ===============================================

そして .mayu 側でのコール。
ここでは、BeckyとThunderbirdで使えるようにしています。

include "vi.mayu"  # vi風モード設定

# Becky用設定

window Becky /B2\.exe/ : ViMode
key S-C-H = C-H

# Thunderbird用設定

window Tunderbird /thunderbird\.exe/ : ViMode

というか、他にもやってる人たくさんいそうだなー。
だれかよく出来たvi風の設定を知っていたら教えてくださいっ!