编写一个vim运算符来删除一行之前的空格

时间:2015-07-28 13:12:33

标签: vim

我想编写一个vim命令来删除一行之前的空格。我尝试了两件不同的事情:

"delete the whitespace before a line
nnoremap gll  <esc>^d0

"delete the whitespace for the lines in visual block
vnoremap gl   <esc>:'<,'>normal ^d0<cr>

这是两个非常简单的命令,现在我想让gl成为dc等运算符,gll删除一行的黑色。我希望gl可以做这些事情:

  1. 2gll命令将删除2行的空格。
  2. 我不需要gl来支持we之类的字词动作,因为我的'删除空白'命令会作用于行。
  3. 我该怎么办?

3 个答案:

答案 0 :(得分:1)

如果我理解你,你正在寻找命令:left

gll映射到:left<cr>应该有效。

对于可视化映射,:left也有效。

答案 1 :(得分:0)

只需写下:

nnoremap gll :normal ^d0<CR>

会让2gll做你想做的事。

答案 2 :(得分:0)

快速而肮脏的映射:

nno gll :<C-U>exe ',+' . (v:count-1) . 'left'<CR>

说明:

<C-U>   remove the range automatically added to the command line
exe     execute a string as a normal command
',+' . (v:count-1) 
        build a string containing (1) a range of the current line
        to the v:count-1 line (v:count holds the count given to
        the mapping)
left    and (2) the command to left-align text
<CR>    execute the string

重读你的问题,也许你想要定义 运算符映射:

fun! Left(type)
    '[,'] left
endfun
nno gl :set opfunc=Left<CR>g@

请参阅:help :map-operator

g@是一个普通模式命令,它在调用'opfunc'设置指定的函数之前等待运动。在函数中,'[']标记指的是动作定义的起始行和结束行。

现在可以在运动命令之前使用gl。 因此gll将删除当前行的缩进,glap将删除 当前段落的缩进等等。你需要做一些额外的工作 努力支持视觉模式,但在帮助文件中已经清楚地解释了这一点。

最后,我实现这一目标的方法就是简单地做到,例如<ap,然后点击.几次。 : - )