如何在Vim中为换行符定义例外?

时间:2010-11-10 11:49:41

标签: vim syntax-highlighting file-type

我在Vim中编辑文件是我记录终端命令行以及我所做的描述。 我的所有命令行都以$开头,所以我的文件看起来像这样:

This is a description of what this
command does, it can be quite long and
should have line breaks.

$ ./the_command.sh

这些实际上是Viki个文件,但我想这个问题应该适用于任何文件类型。我有文件类型检测,文件被正确识别。

现在的问题是:

我希望(硬)换行符插入到除命令行的实际副本之外的所有文本中,这可以通过前导$来轻松识别。

Vim是否可以根据模式定义应用换行规则的异常?我会在viki文件的语法文件中这样做吗?

UPDATE 结合Herbert和Jefromi提出的建议,我现在在.vimrc中有这个:

au CursorMovedI *.viki call SetTextWidth()

function! SetTextWidth()
    if getline(".")=~'^\$'
        set textwidth=1000
    else
        set textwidth=80
    endif
endfunction

它完全符合我的要求。谢谢你们!

3 个答案:

答案 0 :(得分:3)

当你说你想要“硬线断裂”时我会收集你的意思是你希望Vim自动断开一条线,就像它到达textwidth列一样。我认为,最好的方法是定义一个'au'命令,当它位于以“$”开头的行上时,将textwidth设置为一个较大的数字(高于最长的行)。

因此,当您在一行上输入或退出插入模式时,类似这样的内容会改变textwidth:

au InsertEnter call SetTextWidth()
au InsertLeave call SetTextWidth()

function! SetTextWidth()
    if getline(line('.')) =~ '^\$'
        " [edit: 'set textwidth = 0' is preferable to line below]
        set textwidth =1000
    else
        set textwidth=78
    endif
endfunction

您可能希望使用CursorMoved / CursorMovedI组而不是InsertEnter / Leave,因为它们更精细。无论何时移动光标,它们都会被触发,因此函数最终会被调用多次,但功能很简单,可能不会引起任何明显的性能下降。

如果没有任何功能,你可以使用这样的东西:

au InsertEnter exec "set tw=" . getline(line('.'))=~'^\$' ? 1000 : 78
au InsertLeave exec "set tw=" . getline(line('.'))=~'^\$' ? 1000 : 78

答案 1 :(得分:2)

我相信这符合您的标准:

set textwidth=78
v/^$/normal gq/^$\|\%$^M

^Mctrl-v后跟enter

让我们把它分解成更小的peices

/^$\|\%$是一种匹配不以$开头的每一行的模式。 \%$将包含最后一个$ started行和文件结尾之间的行。

gq/^$\|\%$格式从当前行到模式/^$\|\%$

:normal {cmd}在当前行执行普通模式命令。

:v/pattern/相当于:g!/pattern/,它在每一行匹配/ pattern /

上执行命令

此解决方案不会像您输入@Herbert Sitz解决方案那样进行格式化。而是在结束时一举格式化文本。

你可以在每次写

之前使用它
au BufWritePre filename-pattern-here set textwidth=78 | v/^$/normal gq/^$\|\%$^M
au BufWritePost filename-pattern-here set textwidth=0

答案 2 :(得分:0)

虽然我不确定你想要什么(你应该更具体地说明你想要插入硬换行符的位置(原因,方法)),但你可以发出像

这样的命令
:v:^\s*$: <Your command to insert line break, e.g. s/something/\r/ >

上面的命令搜索任何不以任何空格开头后跟$的行,然后执行你指定的命令。

HTH