VIMでマークダウンを書き込むときに行を自動的に折り返す


10

非常に頻繁に、私はVIMでマークダウンを記述し、それらのマークダウンには段落があります。編集を手助けするために、80文字で行を折り返すようにVimを設定しました。入力を続けるだけで問題なく動作しますが、問題は、修正が必要な場合に非常に煩わしくなります。

デモ(ウィキペディアの1次ロジックから取得):

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にそれを自動的に行わせる方法を知っていますか?

回答:


6

さらにシンプル:の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

2つの違い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 2017年

1

完全を期すために、プラグインベースのオプションについて述べたいと思います。

保存時に美化機能を介してバッファを実行することをサポートするALEのようなものを使用する場合、Prettierにコードの再ラップを処理させることができます。

私はこれを~/.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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.