我知道如何用 commands 删除空行。
我们可以先从视觉上选择文本块,然后运行诸如
s/^$/d
删除所有空行或%s/^\(\s*\n\)\+/\r
只保留一个空行之类的命令。
我可以使用动作来执行上述操作,这样我就可以只按一些键来执行“删除动作”而不必进入命令行模式吗?
我知道如何用 commands 删除空行。
我们可以先从视觉上选择文本块,然后运行诸如
s/^$/d
删除所有空行或%s/^\(\s*\n\)\+/\r
只保留一个空行之类的命令。
我可以使用动作来执行上述操作,这样我就可以只按一些键来执行“删除动作”而不必进入命令行模式吗?
为此创建一个新的运算符是一个好主意,但要做到正确可能很难。
操作员用户插件使这项任务变得容易。
一旦你安装了operator-user,你需要做的就是在你的 vimrc 中添加两行,一行定义操作符,另一行定义你的个人映射:
call operator#user#define_ex_command('delete-blanks', 'g/^$/d')
map _ <Plug>(operator-delete-blanks)
这将创建一个新的运算符_
。将其更改为您最喜欢的任何内容。
现在您可以执行_3}
或删除动作_G
中_23k
包含的空白行。还支持文本对象_a}
、操作符加倍4__
和可视模式V7j_
,适合适当的操作符。
你可以使用operatorfunc
. 例如:
在 .vimrc 中定义这样的函数:
function! DeleteEmptyLines(type)
if a:type == 'line'
silent execute ".,'\"g/^$/d"
endif
endfunction
和一个映射:
nnoremap <silent> ,d :set operatorfunc=DeleteEmptyLines<CR>m"g@
,d
现在就像操作员一样执行并接受(基于线的)运动。例如,您可以插入,d5j
或,dG
在正常模式下删除接下来 5 行或文件末尾的空行。
您可以在此处找到有关如何扩展此功能的更多信息:http:
//learnvimscriptthehardway.stevelosh.com/chapters/33.html
,当然还有::h operatorfunc
和:h map-operator
.
来自:h map-operator
:
“在 {motion} 命令之前使用运算符。要定义自己的运算符,您必须创建首先设置operatorfunc
选项然后调用g@
运算符的映射。用户键入 {motion} 命令后,将调用指定的函数。”
好吧,使用动作我认为你不能只删除空白行。
但是您可以使用映射来做到这一点:
:nmap <Leader>db :g/^$/d<CR>
动作可以帮助您移开一个单词,一个段落......并且在动作之前使用运算符(d
,c
...)。
所以你想要的是创建一个新的运算符来删除给定动作(或选择)中的空白行。我给你的和那个差不多,但是你必须发明一个新的操作符(而且我认为没有很多未绑定的键)。
其他 vimers 可能会纠正我,但我认为创建此类运算符的最简单方法是为每个动作定义一个映射并将其绑定到一个函数。
没有一个动作可以与删除相结合,这样它只会删除空白行。动作表示初始位置和最终位置之间的所有文本,没有任何间隙。这包括使用正则表达式搜索的动作。