我在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
它完全符合我的要求。谢谢你们!
答案 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
^M
为ctrl-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