27

我最近开始使用 vim 7(以前是 vim 6)和smartindent设置。在大多数情况下,它运行良好,尽管我习惯于在左大括号后键入一个制表符,以至于它几乎适得其反。

然而,有一种疯狂的行为。编辑 shell 脚本时,我尝试在当前缩进级别创建注释,但smartindent与此无关。它坚持评论必须处于 0 级(无缩进)。更糟糕的是,它破坏了右移(' >>' 和朋友),因此它们不起作用。这是彻底的不服从,我想知道解决它的最佳方法是什么?

(我也不热衷于在之后smartindent缩进的想法。)thenif

首选解决方案将节省我手动抨击 - 我很懒惰。一种选择是“在编辑 shell 脚本时关闭smartindent(其余部分保持开启)”。另一种选择是关于如何找到控制脚本smartindent以及编辑什么以更改我不喜欢的特性的指南。最后一个选项(我不需要关于如何做的建议 - 只是暗示这是恢复理智的最佳或唯一方法)是不smartindent设置。

我在“ (PHP和)烦人的vim unindent rules ”上看到了一个模糊相关的问题;它没有为我提供直接的答案,尽管其中cindent提到的相关项目实际上可能是答案的一部分。

4

7 回答 7

11

找到缩进文件,(例如 /usr/share/vim/vim71/indent/sh.vim 在我的系统上)

这一行看起来像问题:

setlocal indentkeys-=:,0#

也许您可以在 .vimrc 中修复此问题,或手动加载自定义缩进文件。

编辑:它看起来比我想象的要复杂,但可能在缩进文件中专门设置了一些您需要修复的内容。

第二次编辑:看起来我完全错了,看看:

输入哈希后恢复缩进

或者

howto-configure-vim-to-not-put-comments-at-the-beginning-of-lines-while-editing

于 2008-12-22T01:41:15.060 回答
3

好吧,在探索了一些选项之后,包括使用 ' :set cindent' 而不是 ' :set smartindent',我最终恢复到只使用 ' :set autoindent'。可能有一些方法可以让这些东西完全按照我的意愿工作,但它足够混乱和繁琐,以至于我不会被打扰。在过去的 20 多年里,我一直工作得很好,我认为它的不当行为超过了autoindent提供的额外花里胡哨的好处。smartindent

谢谢你,胡安,你的帮助。信不信由你,它确实有帮助——很多。

不过,在跟进此问题时,我还发现了其他一些简洁的命令:

>i}
>a}

这些右移您所在的代码块。' i' 版本缩进正文而不是右大括号(我的首选样式),而 ' a' 版本缩进右大括号(工作所需的版本)。

%此外,您可以在 shell 执行的命令中将限定符应用于“ ”:

:make %:r.o

这将在当前文件名(即' %:r')的'root'上运行make,然后是' .o'。或者,换句话说,如果我正在编辑somefile.c,这将执行make somefile.o

于 2008-12-22T07:01:01.873 回答
3

在 .vimrc 中添加以下行

文件类型缩进

(它将根据文件类型设置正确的缩进模式)

于 2009-01-12T17:44:09.440 回答
3

我有同样的问题很长一段时间,直到我意识到如果在你的 vimrc 中设置了“filetype indent on”,autoindent 和 smartindent 都是不必要的 - 'filetype indent on' 使用 indent/sh.vim(或任何语言)文件在你的 vim 目录中找出缩进规则,并且 autoindent 和 smartindent 都会干扰它。

我没有用 sh 测试过这个,但是当我切换时 perl 突然开始正常运行。

旁注:Juan 的重定向“在输入哈希后恢复缩进”不是一个好的解决方案 - 虽然它确实在一种情况下纠正了问题(输入代码),但它不会改变编辑器认为应该缩进的方式,所以重新缩进(视觉 = 或正常 ==)会将其推回左侧。

于 2009-04-22T13:54:52.190 回答
2

上一个答案建议:

:inoremap #X^H#

非常好。这是 ":help smartindent" 的 VIM 文档建议的答案。请注意,使用 CTRL-V CTRL-H 输入 ^H。文档中的相关部分如下。

    When typing '#' as the first character in a new line, the indent for
    that line is removed, the '#' is put in the first column.  The indent
    is restored for the next line.  If you don't want this, use this
    mapping: ":inoremap # X^H#", where ^H is entered with CTRL-V CTRL-H.
    When using the ">>" command, lines starting with '#' are not shifted
    right.
于 2010-02-24T04:47:45.447 回答
1

我的 .vimrc 中有以下几行,但我没有发现问题。

set smartindent
inoremap # X^H#

我曾经在这两行之后设置了自动缩进,但它似乎没有效果。

于 2008-12-22T07:33:00.780 回答
1

是的,这烦人。smartindent 仅适用于类似 C 的语言。查看我如何根据语言启用适当的缩进: http ://www.pixelbeat.org/settings/.vimrc

于 2009-01-25T01:16:50.397 回答