我知道如何delete blank lines with commands。
我们可以首先在视觉上选择文本块,然后运行类似的命令
s/^$/d
删除所有空行或%s/^\(\s*\n\)\+/\r
以仅保留一个空行。
我可以使用动作执行上述操作,这样我只需按某些键即可执行“删除动作”,而无需进入命令行模式吗?
答案 0 :(得分:3)
为此创建一个新的运算符是一个好主意,但要做到这一点很难。
operator-user插件使该任务变得简单。
安装 operator-user 之后,您需要做的就是在vimrc中添加两行,一行定义运算符,另一行定义您的个人映射:
call operator#user#define_ex_command('delete-blanks', 'g/^$/d')
map _ <Plug>(operator-delete-blanks)
这会创建一个新的运算符_
。把它改成你最喜欢的。
现在,您可以_3}
或_G
或_23k
删除动议中包含的空白行。文本对象_a}
,操作符4__
加倍,可视模式V7j_
也都受支持,因为它们适合操作员。
答案 1 :(得分:2)
您可以使用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@
选项的映射
调用{{1}}运算符。用户输入{motion}命令后
将调用指定的函数。“
答案 2 :(得分:1)
好吧,使用动作我不认为你只能删除空白行。
但你可以使用映射来实现:
:nmap <Leader>db :g/^$/d<CR>
动作可以帮助你移动一个单词,一个段落......在动作之前你使用一个运算符(d
,c
...)。
所以你想要的是创建一个新的运算符来删除给定运动(或选择)中的空行。我给你的是接近,但你必须发明一个新的运算符(我不认为还有很多未绑定的键)。
其他vimmers可能会纠正我,但我认为创建此类运算符的最简单方法是为每个运动定义一个映射并将其绑定到一个函数。
答案 3 :(得分:-1)
没有可以与删除相结合的动作,只会删除空白行。动作表示初始位置和最终位置之间的所有文本,没有任何间隙。这包括使用正则表达式搜索的动作。