vimで現在のカーソル位置の取得・コマンド操作

vimで現在のカーソル位置の取得方法や、カーソルをvimスクリプトで移動させる方法について説明していきます。

webで検索してもなかなかvimのカーソル周りのvimスクリプト記事にたどり着けなかったので、ここに書き留めておきます。

カーソル位置・ファイル行数などの取得

カーソルの行、列を取得するためには、以下のline,col,getpos関数を使用します。

line()     -> returns line number
col()      -> returns column number
getpos()   -> returns list [ bufnum, lnum, col, off ]

getpos()関数は、値のリストを返します。[ バッファナンバー、行、列、off ]。
“off” の値は、’virtualedit’ がオフのときは常に0で、オンのときはその文字の始点からの画面上の桁のオフセットの値となります。詳しくは以下リンクで。
https://vim-jp.org/vimdoc-ja/eval.html#getpos()

現在位置の取得

:echo line(".")
:echo col(".")
:echo getpos(".")

行頭・列頭の位置を取得(当然両方とも0)

:echo line("0")
:echo col("0")
:echo getpos("0")

行末・列末の位置を取得
(つまり、開いているファイルの行数と、カーソル行の文字数が分かる)

:echo line("$")
:echo col("$")
:echo getpos("$")

ウィンドウの位置を取得
(現在表示されている行の先頭・末尾のindexを返す)

:echo line("w0")
:echo line("w$")
:echo getpos("w0")
:echo getpos("w$")

例えば、カーソルの位置が文書のどの位置にあるかを取得するには。
(パーセント表示)

function! GetCursorPosPercent()
    return (100 * line('.') / line('💲') . '%'
endfunction

このようになります。
(なぜか、コードブロック内でドルマークを打つとエラーが起きるので、上記例では全角のドルマークを使っています。注意してください。)

私はこの関数を、ステータスラインをみやすくするプラグイン lightline.vimの表示項目に設定しています。
vimのプラグインlightline.vim のカスタマイズ | MY ROBOTICS

カーソルを操作する

cursor(),setpos()関数で、カーソルの位置を移動できます。

:call setpos(40,5)

3行下、5列右に移動してみる。

:let pos = getpos(".")
:let pos[1] += 3
:let pos[2] += 5
:call setpos(".", pos)

こんな感じに色々カーソルポジジョンをいじることができます。

vimスクリプトからのキーボード入力

移動したカーソル位置にて、キーボード入力をします。入力にはfeedkeys()関数を用います。

:call feedkeys("ihoge")    "インサートモードにはい入った後「hoge」とタイプ
:call feedkeys("\<C-d>")   "画面半分下にスクロール
"(装飾キーとのコンビネーションや<ESC>といった<>で囲まれるキーのタイプは\でエスケープ)
:call feedkeys("/hoge")    "「hoge」を検索

feedkeys()関数は単に文字を入力するだけで無く、あたかもそのキーがキーボードでタイプされたかのような振る舞いをします。

なので、feedkeys()関数を用いて多用するオペレーションを.vimrc内で関数として定義しておくことで、複雑なキー入力処理を素早く行うことができます。

feedkeys()関数はあまり情報が出回っていなかったので、意外と知らない人も多いのではないでしょうか。

以上、vimで現在のカーソル位置を取得する方法についてでした。