很多时候,我在VIM中编写markdown,并且这些markdown中会有段落。为了帮助编辑,我将Vim设置为以80个字符为一行。如果我继续键入,效果很好,但是问题是,如果我需要进行一些校正,它将变得非常烦人。

演示(摘自Wikipedia一阶逻辑):

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments. In first-order 
theories, predicates are often associated with sets. In interpreted higher-order 
theories, predicates may be interpreted as sets of sets.


到目前为止一切顺利。但是,当我修改本文时,我可能会决定在中间添加一些内容,例如:

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments,
or in which one or both of predicate quantifiers or function quantifiers are permitted.
In first-order theories, predicates are often associated with sets. In interpreted higher-order
theories, predicates may be interpreted as sets of sets.


第3行是我想包装的。如果在VIM中进行操作,则需要手动加入行并重新包装整个段落。

任何人都知道如何使VIM自动执行该操作吗?

#1 楼

更简单:a'formatoptions'标志可在插入或删除文本时自动设置段落格式。有关:help fo-table标志和'formatoptions'的详细信息,请参见:help autoformat。两者之间的区别在于,gq会将光标留在最后一个格式化行的第一个非空白处。 gw会将光标放回其开始位置。

您可以使用gq手动重新包装光标当前所在的段落,或者使用gw手动重新包装整个文档,尽管由于前导,这将使光标移动gwap

使用自动命令,可以自动进行格式化。下面是一个在退出插入模式时格式化当前段落的示例:您可以浏览gggwG下的选项。最相关的标题可能在“各种”子标题下。

评论


一句话:辉煌!

–胡冠杰
17 Mar 9 '17 at 20:55

#2 楼

为了完整起见,我想提到基于插件的选项。

如果您使用像ALE这样的东西来支持通过保存时通过美化程序运行缓冲区,则可以让Prettier处理重新包装代码。通过将其放入~/.vim/ftplugin/markdown.vim中,我实现了这一点: br />
let b:ale_fixers = ['prettier', 'remove_trailing_lines', 'trim_whitespace']
let b:ale_javascript_prettier_options = '--prose-wrap always'


#3 楼

我会看看:help 'textwidth'。键入时,它将自动换行。但是,如果您正在编辑一行的中间部分,则此方法将不起作用。 (基本上自动将其格式化为80个字符)如下所示:

function! ParagraphToEightyChars()
   while (len(getline(".")) > 80)
      normal! 0
      " Find the first white-space character before the 81st character.
      call search('\(\%81v.*\)\@<!\s\(.*\s.\{-}\%81v\)\@!', 'c', line('.'))
      " Replace it with a new line.
      exe "normal! r\<CR>"
      " If the next line has words, join it to avoid weird paragraph breaks.
      if (getline(line('.')+1) =~ '\w')
         normal! J
      endif
   endwhile
   " Trim any accidental trailing whitespace
   :s/\s\+$//e
endfunction


然后我有了一个映射,可以在需要时调用它:

nnoremap <silent><A-J> :call ParagraphToEightyChars()<CR>


此功能还可以与textwidth一起使用,用于在代码中格式化注释!只需将光标放在长度超过80个字符的第一行上,然后调用该函数即可。

(注意:我并未将此函数通用化为80以外的其他长度,但是我想只需要更改80和81即可)。

有关更多信息,请参见formatoptions+=jr:help 'textwidth'

评论


感谢您的分享。当我检查您的设置时,输入时不会自动格式化,对吗?如果是这样,那么它仍然不是最佳选择,不是吗?

–胡冠杰
17 Mar 2 '17 at 15:16



键入时,textwidth将自动格式化。我的功能不会。我更喜欢控制vim何时包装东西,因此对我有用。但是,如果您正在专门寻找按需输入格式器,是的。它不太适合您的工作流程。

– Tumbler41
17 Mar 2 '17 at 15:19