読者です 読者をやめる 読者になる 読者になる

clever-f.vim 1.4 をリリースしました.

clever-f.vimVim の 1文字検索カーソル移動 f, F, t, T を拡張するプラグインです.Vim では f, F, t, T に加え,繰り返しのために ,; も必要で,<Leader> などで潰されがちでしたが,clever-f.vim では f などが状態を持つことで ,; を不要にし,Vim の基本的な一文字検索移動の使い勝手を変えないように拡張しています.さらに,いくつかの検索拡張を実装しています.詳しくはドキュメントのほうを御覧ください.

clever-f.vim でカーソルの横移動を便利にする

上記記事を書いたときに version 1.3 をリリースしたっきりだったので,最近追加した機能も含めて clever-f.vim version 1.4 をリリースしました. この記事では上記の記事との機能的な差分を紹介します.

入力した文字のハイライト

highlight example

見た目的に一番大きな追加機能です.f{char} などを入力したときに,カーソルが動いていく位置をハイライトし,検索が終了した時点で自動でハイライトを削除します.gif アニメを見ると分かるように,カーソルが現在居る行のみハイライトするようにしています.これは,

  1. clever-f.vim が基本的に横方向の移動を想定しているため
  2. 1文字だけの入力なので,ウィンドウ全体をハイライトしてしまうとラベルが多すぎて逆に見づらくなってしまうことがある
  3. ハイライトするラベルの数が多くなると動的にハイライトを更新するともっさりする

などの理由によります.なお,tT にも対応しており,検索の向きが変わった時にハイライトを更新するようになっています.

デフォルトでは赤文字+アンダーラインでハイライトされますが,g:clever_f_mark_char_color で好みのハイライトグループを指定することで,ハイライトを変更することもできます.カラースキームなどによっては見づらいことも考えられるので,必要に応じて適宜調節してください.

もちろん,migemo 機能にも対応しており,マルチバイト文字もちゃんとハイライトします.

migemo highlight

ちなみに,ハイライトについては @haya14busa さんと @c0hama さんに色々アドバイスをもらいました.ありがとうございました.

タイムアウト機能

clever-f.vim の欠点として,f{char} で検索した直後に別の文字 {char2}f{char2} のように検索することができないという問題があります.これは lh で少しカーソルを動かせば再度入力できるようになるので,あまり問題だとは思っていなかったのですが,不便だという話を聞くのでタイムアウト機能を付けました.

let g:clever_f_timeout_ms = 200

このようにすると,前回の f による検索から 200 ms 以上経ってからまた f を入力すると別の文字が検索できるようになります. この機能はデフォルトでは無効になっています.

過去の入力の再利用機能

<CR>(改行)など,一部の文字は f による検索で使われることはほとんどありません.なので,clever-f.vim ではこれを再利用し,f<CR> と入力した時は以前の f による入力を繰り返すようにしました.例えば,fa と打って検索したあと,一旦検索が終了してから f<CR> と打つと a を検索することができます. デフォルトでは <CR> のみで対応していますが,g:clever_f_repeat_last_char_inputs で拡張できます.例えば,次のようにタブ文字を含めると便利かもしれません.(f<Tab> はかなり入力しやすいです)

let g:clever_f_repeat_last_char_inputs = ["\<CR>", "\<Tab>"]

なお,これは vim-sneak のものを パク参考にした機能です.

擬似カーソル表示

clever-f.vim とオリジナルの f の違いとして,文字入力中のカーソルの移動がありました.clever-f.vim では getchar() を使って文字入力を行っているので,入力時にコマンドラインにカーソルが移動してしまっていました.そこで,文字入力直前にカーソルがいた位置にカーソルのハイライトを置いておき,文字入力待ち中のカーソルのハイライトを消すことで文字入力時にカーソルが移動しないオリジナルの f マッピングを再現するようにしました.

上記の新規追加された機能も含め,ほぼすべての機能はカスタマイズ可能です.詳しくはドキュメントをご覧ください.