在VIM中写减价时自动重新换行


11

很多时候,我在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自动执行吗?

Answers:


7

更简单:只要插入或删除文本,a用于的标志就'formatoptions'可以自动设置段落格式。有关标志和的:help fo-table详细信息,请参见。'formatoptions':help autoformat

:set formatoptions+=a

gq并且gw将下列运动移过格式化线路。

Formatting is done with one of three methods:
                1. If 'formatexpr' is not empty the expression is
                   evaluated.  This can differ for each buffer.
                2. If 'formatprg' is not empty an external program
                   is used.
                3. Otherwise formatting is done internally.

                In the third case the 'textwidth' option controls the
                length of each formatted line

两者之间的区别是,gq光标将停留在最后格式化行的第一个非空白处。gw会将光标放回其开始位置。

您可以轻松地手动重新包装光标当前所在的段落gwap,或重新包装整个文档gggwG,尽管由于前导,这将使光标移动gg

使用自动命令,可以自动进行格式化。这是一个在退出插入模式时格式化当前段落的示例:

augroup myformatting
    autocmd!
    autocmd InsertLeave * normal gwap<CR>
augroup END

还有其他自动命令触发器,您可能会发现更适合自己。您可以浏览下的选项:help autocmd-events。最相关的标题可能在“各种”子标题下。


一句话:辉煌!
Jason Hu

1

我来看看:help 'textwidth'。键入时,它将自动换行。但是,如果您正在编辑一行的中间,则此方法将无效。

我个人比较喜欢保留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>

此功能也非常formatoptions+=jr适合格式化代码中的注释!只需将光标放在长度超过80个字符的第一行上,然后调用该函数即可。

(注意:我没有将此功能设置为80以外的其他长度,但是我想只需要更改80和81即可)

请参阅:help 'textwidth':help 'formatoptions'以获取更多信息。


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

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

1

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

如果你使用类似ALE它支持通过美化上节省运行您的缓冲区,你可以让更漂亮手柄重新封装你的代码。

我通过将其放入~/.vim/ftplugin/markdown.vim

let b:ale_fixers = ['prettier', 'remove_trailing_lines', 'trim_whitespace']
let b:ale_javascript_prettier_options = '--prose-wrap always'

...然后放入~/.vimrc

let g:ale_fix_on_save = 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.