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

空行をレジスタに送らないVimオペレータ作ってみた

ddで空行を削除したらヤンクしたテキストが上書きされてしまった… なんてことありますよね。
"_ddブラックホールに送れば済む話ですが、空行を消すために毎回レジスタ指定するのは面倒くさい。
そんな思いから、空行(空白のみも含む)を削除したときは自動でブラックホールに送ってくれるオペレータ作ってみました。

nmap d <Plug>(operator-blank2void)
xmap d <Plug>(operator-blank2void)
nmap <silent>dd :exec "normal Vd"<cr>

call operator#user#define('blank2void', 'Operator_blank2void')
function! Operator_blank2void(motion_wise) abort
  let v = operator#user#visual_command_from_wise_name(a:motion_wise)
  if join(getline("'[", "']"), '') =~ '\%^\_s*\%$'
    execute printf('normal! `[%s`]"_d', v)
  else
    execute printf('normal! `[%s`]d', v)
  endif
endfunction

ddのキーマップが冗長に思えますが、これは選択時のチラツキを無くすためです。