d
モーションを使用したコマンドとビジュアルモードで機能する概念実証ソリューションがあります。それは完全に堅牢なソリューションではありませんはまだありません(例えば、d[count]d
仕事をしない、とどちらもありません[count]D
)、それは非常に、ほぼすべての私の実際の使用例をカバーしています。
以下の顧客オペレーター機能を設定することにより機能します。
- レジスタ1〜8の内容を辞書に保存します。
- レジスタ1への削除を実行します
- レジスター2〜9を、以前に保存したレジスター1〜8の内容に設定します。
:help map-operator
演算子関数の動作方法の説明を参照してください。
function! ShiftingDeleteOperator(type)
let reg_dict = {}
for k in range(1, 8)
execute printf("let reg_dict[%d]=getreg('%d', 1)", k, k)
endfor
if a:type ==# 'v'
execute 'normal! `<v`>d'
elseif a:type ==# 'V'
execute 'normal! `<V`>d'
elseif a:type ==# "\<C-V>"
execute "normal! `<\<C-V>`>d"
elseif a:type ==# 'char'
execute 'normal! `[v`]d'
elseif a:type ==# 'line'
execute "normal! '[V']d"
else
return
endif
let deleted = getreg('"', 1)
call setreg(1, deleted)
for [k, v] in items(reg_dict)
execute printf("call setreg(%d, v)", k + 1)
endfor
endfunction
" Call the function for d{motion} via operatorfunc
nnoremap <silent> d :set operatorfunc=ShiftingDeleteOperator<CR>g@
" Call the function when d or x are hit in visual mode
vnoremap d :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
vnoremap x :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
" Use the d{motion} as defined above to add limited support for `D` command
nmap D d$
" Use the standard dd command
nnoremap dd dd