vim 中的什么设置可以抵消 smartindent 在 shell 脚本中拒绝缩进 # 注释的问题?

StackOverflow https://stackoverflow.com/questions/385327

  •  23-08-2019
  •  | 
  •  

我最近开始使用 vim 7(以前是 vim 6)和 smartindent 环境。在大多数情况下,它工作得很好,尽管我习惯于在左大括号后输入制表符,这几乎会适得其反。

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

(我也不热衷于 smartindent关于缩进的想法 thenif.)

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

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

有帮助吗?

解决方案

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

这行看起来有问题:

setlocal indentkeys-=:,0#

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

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

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

输入哈希后恢复缩进

或者

如何配置 vim 在编辑时不在行首放置注释

其他提示

好吧,在探索了一些选项之后,包括使用 ':set cindent' 代替 ':set smartindent',我最终恢复为仅使用':set autoindent'。可能有很多方法可以让这些东西完全按照我想要的方式工作,但它足够混乱和繁琐,我无法打扰。我工作得很好 autoindent 在过去的 20 多年里,以及从提供的额外附加功能中获得的好处 smartindent 我认为它的不当行为超过了它的重要性。

谢谢你,胡安,你的帮助。不管你相信与否,它确实有帮助——相当多。

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

>i}
>a}

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

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

:make %:r.o

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

在 .vimrc 中添加以下行

文件类型缩进

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

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

我还没有用 sh 对此进行测试,但是当我切换时,perl 突然开始正常运行。

边注:Juan 的重定向“在输入哈希值后恢复缩进”并不是一个好的解决方案 - 虽然它确实纠正了一种情况下的问题(输入代码),但它并没有改变编辑器的想法 应该 缩进,因此重新缩进(视觉 = 或普通 ==)会将其推回左侧。

我的 .vimrc 中有以下几行,但我没有观察到该问题。

set smartindent
inoremap # X^H#

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

对,是 非常 恼人的。smartindent 实际上只适用于类似 C 的语言。请参阅如何根据语言启用适当的缩进:http://www.pixelbeat.org/settings/.vimrc

之前的答案建议:

:inoremap # X^H#

非常好。这是 VIM 文档“:help smartindent”建议的答案。请注意,^H 是使用 CTRL-V CTRL-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.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top