ftjpn は 日本語編集時のf
,t
,F
,T
を使った移動、削除やヤンク、ビジュアルモードの範囲選択を便利にするための Vim Plugin です。
日本語編集ではあまり使われないという噂が絶えないf
とt
にもっと仕事をしてもらおう、というのがこのプラグインの主旨です。
f
F
t
T
にまつわる日本語と英語の操作を統一できます。- 新たにキーマップを増やさずに済みます。
- 独自のキー、組み合わせを無数に設定できます。
日本語(全角文字)の編集でf
やt
をまともに機能させるには、その都度IMEを切り替えるか、migemo や digraph を使う必要があります。
これらの方法は英語を使っているときに比べて大幅にタイプ数が増えるのが弱点です。かといって新たにキーをマッピングすると今度は覚える手間が増えます。
日本語のときはf<C-k>_.
で英語のときはf.
、というように操作が異なるのは混乱の元なので出来れば避けたいでしょう。たとえ短縮のマップを設定したとしても限度があり、根本的な解決にはなりません。
。
に移動したいのにうっかり <C-k>
を忘れて .
を押してしまったり、あるいはその逆を…なんてことがあるんじゃないでしょうか。
しかし、このプラグインを使えばf.
で。
と.
の両方に移動できるようになる。つまり、英語だろうが日本語だろうが全く同じ動作で仕事が済んでしまうということです。
もちろん「df.
で。
まで削除」、「vt.
で。
の手前まで選択」といったおなじみの操作も英語のときと同じように違和感なく使えます。まあ素敵。
let g:ftjpn_key_list = [
\ ['.', '。', '.'],
\ ]
たとえば vimrc で上のように設定すると以下のように動作します。
キー | 操作 |
---|---|
f. | 前方最寄りの. or 。 or . に移動 |
t. | 前方最寄りの. or 。 or . の手前まで移動 |
df. | 前方最寄りの. or 。 or . まで削除 |
dt. | 前方最寄りの. or 。 or . の手前まで移動 |
cf. | 前方最寄りの. or 。 or . まで削除して挿入モードへ入る |
ct. | 前方最寄りの. or 。 or . の手前まで削除して挿入モードへ入る |
yf. | 前方最寄りの. or 。 or . までヤンク |
yt. | 前方最寄りの. or 。 or . の手前までヤンク |
vf. | 前方最寄りの. or 。 or . まで選択 |
vt. | 前方最寄りの. or 。 or . の手前まで選択 |
1行の中に .
と 。
と .
が混在している場合、カーソルから最も近い文字が操作対象になります。しかし、そのような状況はほぼ皆無でしょう(このREADMEくらいなものです)。
F
、T
は後方。;
で順方向、,
で逆方向へ繰り返し。カウントにも対応しています。
vim-plug
Plug 'juro106/ftjpn'
let g:ftjpn_key_list = [
\ ['.', '。', '.'],
\ [',', '、', ','],
\ ['t', 'と'],
\ ['n', 'に'],
\ ['w', 'を'],
\ ['h', 'は'],
\ ['g', 'が'],
\ ['d', 'で'],
\ ['o', 'の'],
\ ['i', '何'],
\ ['c', '(', ')'],
\ ['k', '「', '」', '『', '』', '【', '】'],
\ ['!', '!'],
\ ['?', '?'],
\ [';', '!', '?', '^', '$', '#', ':', '&', '%', '~', '*', '!', '?'],
\ ]
各リストの先頭の文字がキーになります。
.
や,
以外にもアルファベットや数字、記号、あらゆる文字をいくつでも設定可能です(意味はありませんが全角文字をキーにすることも可能です)。
これによって半角の!
で全角の!
に対しても動作するようになるので、いちいちIMEを切り替えなくてもf!
で移動したりdf!
で削除、vt!
で手前まで選択といったことが可能になります。
['g', 'が']
、['t', 'と']
、['w', 'を']
、['h', 'は']
、['n', 'に']
など、文章の中で区切りになりやすい文字を設定しておくと移動がぐんと楽になります。
太郎と花子は新しいソファーを買うために街へ出掛けた。
上のような文章なら tw
で ソファーを
の1つ前の ー
に移動して ciw
。そして テーブル
へ書き換え、といった操作がスムーズに行えます。
また、キーは必ずしもペアである必要はなく、1つのキー対して複数の文字を設定することも可能です(便利になるかはさておき)。
;
に複数の記号を設定しておけば、f;
と打つだけで色々な記号に移動できるようになり、打ちにくいシフトキーとのペアを打鍵する手間が省けます(記号だらけの行では却って邪魔になることもあると思いますが)。
f
,t
,F
,T
を別なキーに設定したい場合。
let g:ftjpn_no_defalut_key_mappings = 1
let g:ftjpn_f = 'f'
let g:ftjpn_F = 'F'
let g:ftjpn_t = 't'
let g:ftjpn_T = 'T'
キーマップを変える場合、vimrcに let g:ftjpn_no_defalut_key_mappings = 1
としてから、各キーを設定して下さい。
カーソルが行頭にあり、私は日本人です。
の。
に直接移動したい時。f.
と打ってもHello World.
の.
が選ばれてしまいます。
こういう場合はf。
と打つか(めんどくさい…)、あるいはf.
f.
(ちょっと大変)と2回続けることでようやく私は日本人です。
の。
に移動出来ます。近いほうが選ばれてしまう弊害です。
この場合も同様の困難が待ち受けています。
行頭でf.
とすると、こんにちは世界。
の。
へと移動してしまいます。I am Jananese.
の.
に移動するにはf.
を2回繰り返さなければなりません。
もう1つの解決策はf
を押して1秒以上待つことです(timeoutやtimeoutlen等の設定を変えていなければ)。そうすればf
は通常のf
になり、.
を押しても。
は無視されてI am Japanes.
の.
へ移動出来ます。
逆に言えばデフォルトのオペレータ待機モードのように永遠に待ってくれず、さっさと入力しないと時間切れになるということです。df
やcf
、yf
、vf
のときも同様です。
さらにもう1つ、これは混乱を招きそうですが。
を.
ではないキーに設定してしまえば被ることはなくなります。独自のかな入力を使っている場合などは却って好都合かもしれません。
これらの欠点があなたにとって些細な問題であることを願います。
f
を押してから時間切れまでが短いと感じる時は vimrc
に set notiemout
と記述すれば f
の次のキーが入力されるまで永遠に待つようになるのでゆっくり入力できます。
または set timeoutlen=3000
ぐらいに設定するのもひとつの手です(デフォルトは1秒 timeoutlen=1000)。
しかし、ほかに設定しているキーマップが機能しなくなる場合もありますので事前に確認をお願いします。
nnoremap g<C-a> ggVG
nnoremap g<C-a>y ggVGy
上のような設定をしてある状態で set notimeout
としてしまうと、g<C-a>
は<CR>
を押さない限りいくら待っても発射されなくなります(それだとキーマップの威力が半減どころではありませんよね…)。
fe
があまり有効ではないのと同じように、日本語も出現率が高い文字を設定しても役に立たないでしょう。
かといって、そもそもあまり出てこない文字では全く意味がありません。
上手いこと区切りとして優秀な文字を設定できればf
の移動がより快適になるでしょう。制限された枠組みの中で最適解を導き出す…ワクワクしますね。
参考までに私が考えた例を掲載します。
日本語 | key 候補 | 意味合い |
---|---|---|
が | g | Subject, but |
を | w,o | Object |
は | h | is |
と | t,o | and, with |
て | t,e | and |
に | n,i | to |
の | n,o | 's |
で | d,e, | by |
主語や目的語の近くに現れる文字を設定しておきたいところです。
日本語 | key 候補 | 意味合い |
---|---|---|
へ | h,e | to |
で | d,e | by |
だ | d,a | $ |
な | n,a | like |
ば | b | and |
し | s,i | do |
す | s,u | do,$ |
る | r,u | do,$ |
た | t,a | did |
か | k | or |
こ | k,o | thing |
よ | y,o | by |
こ | k,o | |
ま | m,a |
る
やか
はたくさん出てきますが、案外微妙な場所に出現することが多い印象です。移動した後には当然消去かヤンクをしたいはずなので、「だったら別な場所行くわ」という扱いになってしまいます。
日本語 | key 候補 | 意味合い |
---|---|---|
何 | n,i,w | what,why |
時 | j,z,t,i | when |
誰 | w,h,d | who |
場 | b,w,a | where |
所 | t,w,s | where |
方 | h,o,u | how |
法 | h,o,u | how |
同 | = | |
一 | 1 | |
二 | 2 | |
三 | 3 | |
四 | 4 | |
五 | 5 | |
六 | 6 | |
七 | 7 | |
八 | 8 | |
九 | 9 |
漢字を目印にするのはあまり上手い作戦ではないような気がしていますが、あればあったで便利かもしれません。
カッコ | key 候補 |
---|---|
「」 | k |
「 | k |
」 | K |
() | c |
() | ( |
【】 | b, |
『』 | K |
‘’ | ' |
“” | " |
〈〉 | < |
〔〕 | |
{} |