如何在Vim中进行“向后制表”(删除一个制表符或制表符空格)?

71

是否有一种快速的方法可以向后制表,而不需要按下退格键(无论我设置了多少个制表符空格)?


我不确定你所说的“向后制表”是什么意思。你是指在编辑模式下删除刚刚用tab插入的空格,还是在执行模式下一次性向后移动多个字符(退格键一次只能向后移动一个字符...)? - stefanB
1
最快的方法是实际上使用制表符进行缩进。然后你可以(通过自动缩进)只需按一个键就可以完成所有缩进级别的移动。在编辑模式下:多缩进一级,按tab键。返回上一级,按退格键。在命令模式下:使用箭头键或h/l键。 - hlovdal
@hlovdal 这也可以通过设置 softtabstop 而无需在文件中使用实际的制表符来完成。 - melpomene
5个回答

140
如果您处于插入模式:
  • Ctrl+d - 向左移动
  • Ctrl+t - 向右移动
如果您处于普通模式:
  • Shift+<< - 左移当前行
  • Shift+>> - 右移当前行
如果您处于可视模式并选择了一个或多个行:
  • < - 左移所选内容
  • > - 右移所选内容
如果您只是在普通模式下向后移动一个单词,可以使用b向后移动一个单词。

8
不知道插入模式的这个事情。 - Matt Briggs
哇,谢谢。我知道 << 和 >>,但它们会移动整行。 - Hien
5
我把Shift+Tab映射到C-d,让它像大多数IDE一样工作。 - Mo2
2
由于我尝试了几次才使@Mo2的建议起作用,因此这里是如何将Shift + Tab映射到Ctrl + d:inoremap <S-Tab> <C-d> - Leon S.
我希望我早点知道这个。非常感谢你。 - princebillyGK

22
set softtabstop=4 expandtab

当您按下Tab键时,您可以添加最多四个空格,并通过按一次<BS>来删除最多四个空格。


1
应该选择这个答案而不是现有的已选答案。
  • 初学者可能不知道这个命令应该输入在 ~/.vimrc 中,所以一定要让他们知道。
- jeongmin.cha

7

简短版: set ts=4 sts=-1 sw=0 et

tl;dr: set tabstop=4 softtabstop=-1 shiftwidth=0 expandtab

说明

如果将softtabstop(或sts)设置为-1,它将自动与tabstopts)相同,如果您经常更改缩进,则可以节省一些麻烦。将shiftwidthsw)设置为0应该也会使其与tabstop相同。

详细信息

shiftwidth sw

每次(自动)缩进步骤要使用的空格数。 用于cindent>><<等。
当值为零时将使用tabstop值。

tabstop ts

文件中计数的制表符空格数。 还请参见:retab命令和softtabstop选项。

softtabstop sts

执行编辑操作时,例如插入Tab或使用BS,制表符计数的空格数。感觉就像正在插入Tab一样,实际上使用了空格和制表符的混合体。 这对于保持标准值处于tabs设置状态,同时能够像设置为sts一样进行编辑非常有用。sts为负数时,将使用shiftwidth的值。如果您经常更改选项卡停止位置,则会节省一些麻烦。 如果未设置expandtab,则通过使用Tab最小化空格数。

expandtab et

在插入模式下: 使用适当数量的空格来插入一个缩进。在使用><命令进行缩进并且autoindent开启的时候,空格会被用作缩进。如果expandtab开启,想要插入一个真正的制表符,请使用Ctrl-V Tab。另请参阅:retab

3
在普通模式下,<<将把当前行向后缩进一格,在可视模式下,<将使所有选定的行向后缩进一格。

0

我认为这个问题有更好的答案。与其使用backspace键一次清除4个空格,使用shift+tab作为快捷键会更好(因为shift修饰键通常可以反转其他快捷键的行为)。我熟悉的所有其他文本编辑软件都采用了这种方式,但vim没有。不过,添加它非常简单,这意味着不需要使用softtabstop:

set tabstop=4 shiftwidth=0 expandtab
inoremap <S-Tab> <C-d>

您可以使用退格键删除单个空格,使用shift+tab删除插入模式下的4个制表符。如果要继续使用制表符,这也是可行的。

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