在vim插入模式下,'C-i' 的反向键是什么?

4
在vim的插入模式下,使用'C-t'和'C-d'可以在当前行的开头插入或删除Tab/4个空格。而使用'C-i'可以在当前光标处插入Tab/4个空格。
但是,我们如何删除当前光标处的4个空格?'C-i'的反向操作是什么?

1
请注意:'C-i'或Tab不仅插入4个空格,它们会在恰好是4的倍数的列中插入空格。例如,如果我们的光标在第13列并使用'C-i',则它将在第16列插入3个空格。如果我们再次使用'C-i',则它将在第20列插入4个空格。 - Jianfeng Wang
我正在寻找一个获取反向的关键:如果我们在第19列,我们应该删除3个空格到第16列。 - Jianfeng Wang
<C-I> <Tab>。如果你也有 setl expandtab,那么Vim会将新输入的制表符扩展为空格。除了 u 或类似操作之外,不应该有任何“反向操作”。 - Matt
1
可以想象有人想要删除空格回到上一个制表位,因此你可能不应该说“不应该”,而应该说“不是”。 - Armali
1
@Matt 当我们写类似于 #define xxx 1 #define xxxxx 2 的代码时,我们总是需要对齐数字 1 和 2,制表符可以很容易地做到这一点。但是,如果我们多按了一次Tab键,那么我们就需要执行很多操作来删除这些多余的空格。这就是为什么我正在寻找一个反向操作的快捷键的原因。 - Jianfeng Wang
3个回答

3

没有内置的命令可以完成您想要的操作。

手动完成类似操作的一种方法如下:

<C-c>ciw
  • <C-c> 按键用于退出插入模式,不会触发自动命令,将光标停留在最后一个<Space>上。
  • ciw 命令可以剪切Vim视为“单词”的一系列<Spaces>,并进入插入模式。

现在有了一个可用的宏,将其映射到方便的快捷键也很容易:

inoremap <key> <C-c>ciw

我们可以通过防止它向寄存器中添加无用的 ,使其变得更好:

inoremap <key> <C-c>"_ciw

请注意,此映射对于任意数量的<Tab>和/或<Space>序列同样适用。
现在,如@Eineki所指出的那样,上面的映射不是真正的反向<C-i>,因为它删除光标前的所有连续空白,而不管制表符。
如果您只按一次<C-i>,那么该映射将有效地作为反向<C-i>,但如果您有超过&shiftwidth <Space>的长度,则整个序列都将被删除,这不是真正的反向<C-i>所应该做的。
真正的反向<C-i>将删除<Space>直到前一个制表符,这听起来有点不太平凡。

需要注意的是:如果你有超过4个空格连续出现(可能是两个<C-i>?),它会将它们全部删除。当你匆忙时,可以使用<C-u>来撤销上一个命令。 - Eineki
@Eineki,你说得对。我会做个注释。 - romainl

2
这是我对romainl定义的TAB的略微不那么琐碎的true inverse的建议:

在这里,我的建议是使用:

function! BAT()
        while getline(".")[col(".")-2] =~ "\\s"
                normal X
                if virtcol(".")%&tabstop == 1
                        break
                endif
        endwhile
endfunction
imap <S-Tab> <C-O>:call BAT()<CR>

1
哇!太棒了,真的有效,非常感谢。但我真的很失望,因为没有原始密钥或密钥可以做到这一点。 - Jianfeng Wang
1
只是微调一下。 - romainl
1
@JianfengWang 如果这个答案对您有帮助,请将其标记为“已接受”。 - m_mlvx

0

你可以使用<C-o>4dh(或者如果你更喜欢箭头,可以使用<C-o>4d<Left>)来删除当前插入位置左侧的4个字符。

注意:<C-o>允许你在插入模式下临时使用普通模式命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接