ハイパーマッスルエンジニア

Vim、ShellScriptについてよく書く

Vimで特定の行だけ選択してコピーするプラグイン

f:id:rasukarusan:20210417235631p:plain
 
vimのVISUALモードはシンプルかつパワフルで特に不満はないのだが、行を飛ばしてコピーができない。 例えば下記のようなファイルがあったとして、

line 1
line 2
line 3

line1とline3だけコピーしたいようなケース。

このような隣接していない行のコピーを実現するプラグインを作った。

github.com

Neovim限定

デモ

飛ばし飛ばしに行を選択してコピー

選択した後deleteもできる

インストール

好きなプラグインマネージャーでインストール可能

[[plugins]]
repo = 'Rasukarusan/nvim-select-multi-line'

設定

プラグインをインストールするとsml#mode_on()という関数が使えるようになるので、init.vimにmappingを追加する。

" SPACE + v でセレクトモードを開始
nnoremap <Space>v :call sml#mode_on()<CR>

使い方

ノーマルモードでSPACE + vでセレクトモード開始。
vで1行ずつ選択、Vで複数行選択(普段のvimのVと同じ動き)。

yankした後に選択した文字列を出力したくなければ、g:sml#echo_yank_strを0にセットすればいい。デフォルトは1。init.vimに下記を記載。

let g:sml#echo_yank_str = 0

実装

どうもvimには特定の行だけハイライトするという機能がないみたいなので、FloatingWindowを使ってあたかも選択しているかのように見せている。
ただ1行ごとにFloatingWindowを作っているため、行を選択するごとに動作がもっさりしてしまう。たぶん複数行選択のところは1枚のFloatingWindowにするとかでパフォーマンスあげられるきがする。
あとスクロールすると位置がズレるのも悲しい。

終わり

プラグインとしての完成度は未熟だけど、自分的には満たせてるから、公開した。

細々と修正していきたい。