如何实现类似Vim中dw/dd的操作,将对应范围文本替换为等长空格?
实现空格覆盖类d操作的方案
临时使用方法(无需修改配置)
如果你只是偶尔需要这个操作,不需要自定义配置,可以直接用Vim自带功能实现:
- 按下
v进入可视模式,选中你要覆盖的范围:- 要实现类似
dw的效果就按vw选中到单词结尾 - 要实现类似
daw的效果就按vaw选中整个单词 - 要实现类似
d$的效果就按v$选中到行尾
- 要实现类似
- 选中后按下
r再敲空格,选中区域就会全部被替换为等长度的空格,完全符合你给出的示例需求。
永久配置方法(支持类d指令的语法)
如果需要高频使用这个功能,可以在你的Vim/Neovim配置文件中添加自定义映射,实现和d操作完全一致的使用逻辑,下面示例把功能绑定到<leader>r(<leader>默认是反斜杠\,也可以自己修改):
" 普通模式映射:支持搭配motion使用,用法和d指令完全一致 nnoremap <leader>r :set opfunc=ReplaceWithSpace<CR>g@ " 可视模式映射:直接替换选中内容为空格 vnoremap <leader>r :call ReplaceWithSpace(visualmode(), 1)<CR> function! ReplaceWithSpace(type, ...) let sel_save = &selection let reg_save = @@ set selection=inclusive if a:0 silent exe "normal! `<" . a:type . "`>y" elseif a:type == 'line' silent exe "normal! '[V']y" elseif a:type == 'block' silent exe "normal! `[\<C-V>`]y" else silent exe "normal! `[v`]y" endif let spaces = repeat(' ', strlen(@@)) call setreg('"', spaces, getregtype('"')) if a:0 silent exe "normal! gvP" else silent exe "normal! `[v`]p" endif let &selection = sel_save let @@ = reg_save endfunction
配置完成后重启Vim即可使用,操作逻辑和d指令完全一致:
<leader>rw:等价于空格版dw,覆盖光标到当前单词结尾的内容为空格<leader>raw:等价于空格版daw,覆盖整个当前单词为空格<leader>r$:等价于空格版d$,覆盖光标到行尾的内容为空格<leader>rgg:等价于空格版dgg,覆盖光标到文件开头的所有内容为空格
内容的提问来源于stack exchange,提问作者JohnE
相关产品推荐
相关产品推荐

