如何让语法元素在 vim 中自动插入到下一行?

如何让语法元素在 vim 中自动插入到下一行?

在 vim 中,当我开始换行时,许多语法元素会自动插入到下一行。例如,如果我在 vim 文件中以插入模式编辑注释,当我转到下一行时,我将看到 " 字符插入到适当的缩进级别,这样我就可以继续注释。我想知道在 vim 语法文件中如何做到这一点。

举一个更具体的例子,假设我想制作一个识别项目符号列表(使用 * 作为项目符号)的语法文件。我可以添加一个简单的匹配表达式

    syntax match Bullet /^\s*\*\ /

然后我可以用类似这样的方法突出显示该项目

   highlight link Bullet Statement

但是,在我完成一个要点并按 Enter 键转到下一行后,我需要添加其他内容以使其自动在光标前添加 *。显然,这应该在自动缩进的上下文中进行。我到底需要做什么才能使此语法插入发生?

答案1

Vim 语法文件中的命令根据文件所用语言的语法控制文件中元素的突出显示。它们不控制任何内容的自动插入。

如果 Vim 知道 " 是注释前导符,它会认为您正在输入注释,并且某些其他设置会告诉 Vim 您希望它自动在该位置插入注释前导符,则它会自动在新行的开头插入 "。请参阅

:help 30.6

了解注释的概述。另请参阅

:help 'comments'
:help 'formatoptions'

要让 Vim 识别 * 为项目符号,可以执行以下操作:

:set comments+=b:*

其效果如何取决于您正在编辑的文件的“文件类型”以及“注释”和“格式选项”选项的值。如果不了解您想要在什么情况下使用 * 作为项目符号,就很难提出具体的建议。

答案2

非常感谢 garyjohn 为我指明了正确的方向。对于我询问的简单示例,我能够想出以下解决方案。

在 ~/.vim/syntax/list.vim 中,我包含了前面提到的语法高亮,即:

if exists("b:current_syntax)
    finish
endif

syntax match Bullet /^\s*\*\ /
highlight link Bullet SpecialChar

let b:current_syntax = 'list'

接下来,为了让 vim 自动检测列表文件类型,我添加了一个文件 ~/.vim/ftdetect/list.vim,内容如下:

autocmd BufRead,BufNewFile *.list set filetype=list

此文件还使 vim 自动使用与列表相关的任何文件类型插件。具体来说,我添加了 ~/.vim/ftplugin/list.vim,其中包含以下内容:

setlocal comments+=b:*\ 
setlocal formatoptions+=cro

关于此文件,有几点需要注意。首先,请注意我使用了 setlocal,因此此命令仅适用于列表文件。其次,请注意尾随空格被转义。这使得注释为 * 后跟空格(与语法文件中的正则表达式匹配)。第三,请注意我添加到 formatoptions 的各种内容,以便 vim 自动帮助您处理项目符号列表。这些文档可在以下位置找到:

:help fo-table

为了节省读者的时间,我将简要介绍这四个选项。'c' 自动换行注释,插入注释前导符(在本例中为 '* ')。'r' 在插入模式下按下 Enter 键后自动插入注释前导符。此选项尊重缩进,因此它允许您轻松制作多级项目符号列表。最后,'o' 在正常模式下按下 o 键时插入注释前导符。

显然,这个项目符号列表是一个简单的例子,但它可以说明如何将更复杂的注释延续添加到 ftplugins。

相关内容