LoginSignup
5
5

More than 5 years have passed since last update.

vimのf移動を使いやすくするためにプラグイン(patet_f)を作ってみた

Last updated at Posted at 2016-11-13

経緯

※プラグインの説明とは無関係なので読み飛ばし可(読み飛ばす)

vimには色々な移動方法がありますが、その中でもf,F,t,Tによる(行の)指定した文字へ移動するという他のエディタにはない独特な移動方法ではないかと思います。
個人的にかなり気に入っており、割りと多用するのですが以下に関して使いにくさを感じることがあります。

  1. 移動したい文字の手前に同じ文字が複数ある
  2. d,y等のオペレータ待機モードとの併用

例えば、こんな文字列のとき、

public function getMemberName() ・・・・

Nameのeの位置にfで移動しようとした場合、コマンドは次のようになるのではないかと思います。
5fe fe;;;; frfe
※「;」はfの移動を繰り返すコマンド

これらのコマンドに対し、私は以下のようなことを感じます。

  • 5feはeの数を数える必要があるので面倒くさい。目も痛くなってくる。
  • fe;;;;はeと無関係な文字をうつのがワンアクション増えたようで煩わしい。
  • frfeはrを探すのが面倒くさい。この探すというのが鬱陶しい

また、d,y等の切り取り/コピーのコマンドと併用したい場合はさらに使いにくくなります。
実際、この場合は上記の1つ目の方法しか使用できず、しかも数を間違えると想定外の文字列を選択することになってしまいます。
※削除目的なら、まだ問題ないのですが貼り付け目的の場合はやり直しすることになるのでやはり使いづらい。

私の場合はそういった誤りをしないようvisualモードを利用しておりますが、切り取り/コピーの場合にvisualモードに切り替えするというのはワンアクション増えたようでやはり煩わしさを感じます。

そもそも、移動したい文字が行中に複数無いか常に注意する必要があるというのがよろしくない。

Vimmerというには私はまだまだ半人前なので、いずれにしても慣れの問題かもしれませんが、f移動を利用するたびにこんな風に動いてくれたら便利なのにと思うことはよくありました。

vimエディタの練習にもなるし、やってみるかと思い作ってみました。

機能概要

vimのf, F移動を拡張したプラグインです。vimにf移動用のモードを追加することで連続して異なる文字へカーソル移動することができます(当然、;を使用せずに同じ文字へも移動可能です)。
また、dfやyfといったオペレータ待機モードでの利用時は対象の文字列がわかるようvisualモードと同様、選択中で表示します。

環境とインストール

Version

vim 7.4
※これより前のバージョンでは動作未確認

インストール

ソースはここ
dein.vimを使用する場合は以下を設定ファイル(.vimrc等)に追加

call dein#add('sfuta/patet_f.vim')

動作

このプラグインで以下のモードが追加される

  • f MOVE
  • F MOVE
  • f MOVE VISUAL
  • F MOVE VISUAL
  • df MOVE
  • dF MOVE
  • yf MOVE
  • yF MOVE
  • cf MOVE
  • cF MOVE

各モードの共通動作

キー 動作概要
文字キー 打鍵したキー文字位置へ移動
Enter 決定キー(モードを抜ける)
Esc キャンセルキー(モードを抜ける)
Ctrl-f 方向切替(fとFの切替)

※「文字キー」以外は設定変更可

f MOVE, F MOVE

いわゆるノーマルモードでのf, F移動の拡張。fでf MOVEモード、FでF MOVEモードに切り替わる。
両モードともにEnterキーかEscキーを打つことでモードを抜けることができる

f MOVEモード中は打鍵したキー文字が右位置にあればそこへカーソルが移動する

例えば、こんな文字列のときfunctionのcへ移動したいとき。
f MOVEモードに切り替え後にccとうつ、もしくは<Space>cとうってもよい。
※<Space>はスペースキー

public function getMemberName() ・・・・

F MOVEモードはf MOVEモードと逆に打鍵したキー文字が左位置にあればそこへカーソルが移動する

Ctrl-fにより、f MOVEモードとF MOVEモードが切り替わる

f MOVE VISUAL, F MOVE VISUAL

いわゆるvisualモードでのf, F移動の拡張。操作, 動作に関してはf MOVE, F MOVEと同じ。
違いはvisualモード上で動作するという点のみ

df MOVE, dF MOVE

いわゆるdによるオペレータ待機モードでのf, F移動、つまりdf, dFと打鍵した場合の拡張。操作/動作に関してはf MOVE, F MOVEとほぼ同じ。

以下点に関し、f MOVE, F MOVEと異なる。

  • 表示がvisualモード。(切り取り文字列をわかりやすくするため)
  • Enterキー打鍵により、切り取りを実行しモードを抜ける。
  • Escキー打鍵により、切り取り未実行でモードを抜ける。

なお、.リピートするためには別途、vim-repeatをインストールする必要がある

yf MOVE, yF MOVE

いわゆるyによるオペレータ待機モードでのf, F移動、つまりyf, yFと打鍵した場合の拡張。操作/動作に関してはdf MOVE, dF MOVEとほぼ同じ。
切り取りではなくコピー(ヤンク)である点が異なる。
※なお、.でリピートはしない(元のyf, yF同様)

cf MOVE, cF MOVE

いわゆるcによるオペレータ待機モードでのf, F移動、つまりcf, cFと打鍵した場合の拡張※。操作/動作に関してはdf MOVE, dF MOVEとほぼ同じ。
Enterキー打鍵により、INSERTモードとなる点が異なる

なお、dの場合同様、.リピートは別途、vim-repeatをインストールする必要がある

uによるUndo時の動きは元のcfと動作が異なっている。
元のcfはu一回で切り取りした文字列を表示するが、このプラグインのcfではu一回で切り取りした状態。もう一回uを打鍵することで切り取り前の文字列を表示する。

デモ

f MOVE, F MOVE, f MOVE VISUAL, F MOVE VISUAL

patet_f_demo_nv_z.gif

df MOVE, dF MOVE, cf MOVE, cF MOVE, yf MOVE, yF MOVE

patet_f_demo_dcy_z.gif

設定

各種設定値

変数名 説明
g:patet_f_enable プラグイン利用可否 1:有効,0:無効,既定:1
g:patet_f_showmode モードのステータス表示 1:表示,0:非表示,既定:set showmodeの値
g:patet_f_key_switch 方向切替(fとFを切替)キー 既定:<C-f>
g:patet_f_key_finish 決定キー 既定:<CR>
g:patet_f_key_escape キャンセルキー 既定:<Esc>
g:patet_f_timeout_ms 決定までのタイマー値 既定:0(無効)
g:patet_f_no_mappings デフォルトのマップを無効にする 0(または未定義):マップ有効,1:マップ無効,既定:未定義

g:patet_f_timeout_msについて

モード切替後に1文字打鍵後に何ミリ秒でモードを抜けるか時間を設定するための機能
※元のf, Fと同じ動きもできるようするためにつけた機能

例えば、fxと打鍵した場合、
g:patet_f_timeout_ms=100と設定時は100ミリ秒の間に文字キーを打鍵しなければ、モードを自動で抜ける(時間経過で決定キーを打鍵した場合と同様の動作となる)
0設定時はタイマーが無効となり、決定キー/キャンセルキーを打鍵するまでモードは継続し続ける
g:patet_f_timeout_msの利用には+reltimeが必要

シンタックスハイライト

ハイライトグループ名 説明
PatetFCursor モード中のカーソルの色と表示形式
PatetFCursorLine モード中の行の色と表示形式

マッピング

マップ名 処理 対象のモード 既定値
<Plug>patet_f_forward_n f MOVEへの切替 ノーマルモード f
<Plug>patet_f_back_n F MOVEへの切替 ノーマルモード F
<Plug>patet_f_forward_x f MOVE VISUALへの切替 Visualモード f
<Plug>patet_f_back_x F MOVE VISUALへの切替 Visualモード F
<Plug>patet_f_forward_o df MOVE,yf MOVE,cf MOVEへの切替 オペレータ待機モード f
<Plug>patet_f_back_o dF MOVE,yF MOVE,cF MOVEへの切替 オペレータ待機モード F

例えば、

nmap t <Plug>patet_f_forward_n

とすることで、tでf MOVEモードへ切替ができるようになる

感想

プラグイン作成は初めてでしたが、意外と苦労することもなく作ることができました。もちろん、簡単ではなかったですが他のプログラムを作成する苦労とそれほど大差はなかったように思います。
これはGitHubでソースコードが公開されており、先人達のコード内容を参照しやすいというのが大きかったように思います。
実際、作成には以下のコードをかなり参考にさせていただきました。
rhysd/clever-f.vim
simeji/winresizer

ただ、作成とは別に英語は必要だなと改めて感じました。そうでないとヘルプファイルも作れませんし、README.mdも日本語なので読んでくれる人も当然、減ることになるだろうなと思います。
私は語学関係がとくに苦手なので、時間はかかるでしょうがその内、英訳を行いヘルプファイルも作成したいなとは考えております。

とりあえず英語の勉強をしつつ、しばらくは作ったプラグインが本当に使いやすいか色々やってみて改良していこうと思います。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5