我们正在寻找的是在正常模式下以视觉方式快速显示受影响的vim编辑区域。例如,编辑时
if (true) {
//line to be deleted
}
如果我们在dd
上//line to be deleted
,则应在删除之前刷新此受影响区域,我们可以使用Vd
执行此操作。我们所看到的效果与Vd
使用dd
的效果相同。这适用于所有编辑操作,例如c
,y
等。
我们尝试将其映射到nnoremap dd Vd
以测试单行,没有运气。如果我们应该这样映射,甚至不确定。
谷歌搜索没有出现任何令人满意的结果。那里有任何已知的插件吗?任何可插入vim的代码也都很棒
答案 0 :(得分:5)
我给出的例子中有许多内容需要调整,但它们可能是解决问题的良好开端。
您可以使用:redraw
和:sleep
在执行某个功能的过程中绘制选择。
以下是dd
的示例:
nmap <silent> dd :call Com_dd()<cr>
function! Com_dd() range
" Enter visual mode:
normal! V
" Select multiple lines, when there's a range:
let morelines = a:lastline - a:firstline
if morelines != 0
exe "normal! ".morelines."j"
endif
" Redraw the screen so we can see the selection:
redraw
" Sleeps 200ms:
sleep 200 m
" Delete the selected lines:
normal! d
endf
可以使用范围调用它,例如:3dd
。
对于带有动作的命令,它有点棘手,但你可以接近
对于期望的行为,这是c
命令的示例:
nmap <silent> c :set opfunc=Com_c<cr>g@
function! Com_c(type)
let curpos = getpos('.')
if a:0 " Invoked from Visual mode, use gv command.
silent exe "normal! gv"
elseif a:type == 'line'
silent exe "normal! '[V']"
else
silent exe "normal! `[v`]"
endif
redraw
sleep 200 m
normal! d
startinsert
call setpos('.', curpos)
endf
最后一个示例不处理范围,因此3cw
将不起作用(但c3w
将起作用。)
有关映射运算符的帮助,请参阅:h g@
。
但会导致一些新问题:例如,.
不再使用这些命令。
另一个例子是:标准cw
命令不会删除单词之后的任何空格,但我的例子确实如此。
你可能会找到一些关于这些新问题的解决方案,但我现在还没有。