function! s:PadMacro(type) abort
if a:type ==# 'char'
normal! `[v`]d
elseif a:type ==# 'line'
normal! '[V']d
elseif a:type ==# 'v'
normal! `<v`>d
else
return
endif
let string = '\Pad{' . @" . '}'
silent execute "normal! i\<c-r>=string\r"
endfunction
nnoremap <silent> ;P :set operatorfunc=<sid>PadMacro<cr>g@
vnoremap <silent> ;P :<c-u>call <sid>PadMacro(visualmode())<cr>
以前のコードをvimrcに入れれば、望みどおりの動作をするはずです。
これを使用するには、を押して;P{motion}、PadMacro()関数がとでカバーされる文字を囲む必要{motion}が\Pad{あり}ます。
使用例:
;Plカーソルの下のキャラクターを囲むため(lカーソルの下のキャラクターを覆う動きのため)
;Piwカーソルの下の単語を囲むには(iwカーソルの下の単語内のすべての文字をカバーするテキストオブジェクトであるため)
;Pisカーソルが置かれている文を囲む(is文内のすべての文字をカバーするテキストオブジェクトであるため)
;P$ カーソルと行末の間の文字を囲む
;P 視覚的に選択された文字を囲む
PadMacro()関数によって実行されるすべては単一の版と見なされます。つまり、ドットの繰り返しが可能です。
言い換えると、囲むテキストの類似した部分が複数ある場合\Pad{}、毎回マッピングをヒットする必要はなく、初回のみです(その後、ヒット.して最後の版を繰り返すことができます)。
エンクロージャーを適用できるテキストオブジェクトの完全なリストについては、を参照してください
:help text-objects。