36

tw=80ファイル、特に LaTeX ソースを編集するときは、通常、このオプションを設定します。ただし、Vim でtw=80オプションを使用してメールを作成し、それをコピーして Web ブラウザーに貼り付けたいとします。コピーして貼り付ける前に、テキストをアンラップして、80 文字ごとに改行がないようにしたいと考えています。私は試してみ ましたがtw=0、それ gqはテキストをデフォルト幅の 80 文字に折り返すだけです。私の質問は次のとおりです。メールの各段落が 1 行として表示されるように、テキストのラップを解除するにはどうすればよいですか? そのための簡単なコマンドはありますか?

4

3 に答える 3

60

段落の先頭に移動して、次のように入力します。

v i p J

J明確でない場合の大文字です)

ドキュメント全体については、それを標準と組み合わせます。

:%norm vipJ

このコマンドは、段落の折り返しのみを行います。私はこれがあなたが望む行動だと思います。

于 2012-06-14T19:15:09.423 に答える
11

ノーマル モード コマンドを使用して段落行を結合することは、別の回答で既にカバーされているため、行指向の Ex コマンドを使用して同じ問題を解決することを考えてみましょう。

カーソルが段落の最初の行にあるとします。次に、それをアンラップするには、次の行をその段落の最後の行まで結合するだけです。これを行う便利な方法は:join、目的に合わせて設計されたコマンドを実行することです。コマンドが動作する行範囲を定義するには、現在の行である明白な開始行に加えて、終了行を指定する必要があります。これは、段落の最後、つまり 2 つの改行文字が連続するパターン、または改行文字の後に空行が続くパターンを使用して見つけることができます。したがって、前述の定義を Ex-command 構文に変換すると、次のようになります。

:,-/\n$/j

すべての段落をアンラップするには、すべての段落の最初の行でこのコマンドを実行します。それらをジャンプして特定の一連のアクションを繰り返すための便利なツールは、:globalコマンド (または:g略して) です。行を上:globalから下にスキャンすると、次の段落の最初の行は、未処理のまま残っている最初の空でない行になります。この観察は私たちに命令を与えます

:g/./,-/\n$/j

これは、単純な通常モードの対応物よりも効率的です。

于 2012-06-15T05:26:37.287 に答える
5

問題:%norm vipJは、連続する行が 80 文字未満の場合、空白行で区切られていても結合されることです。たとえば、次の例:

# Title 1

## Title 2

となります:

# Title 1 ## Title 2

ibの答えでは、問題はリストにあります:

- item1
- item2

なります:

- item1 - item2

このフォーラムの投稿のおかげで、これを達成する別の方法を発見しました。これは、それを行わないため、私にとってはるかにうまく機能する関数にラップしました。

function! SoftWrap()
    let s:old_fo = &formatoptions
    let s:old_tw = &textwidth
    set fo=
    set tw=999999 " works for paragraphs up to 12k lines
    normal gggqG
    let &fo = s:old_fo
    let &tw = s:old_tw
endfunction

編集:Linuxセットアップで機能していないことに気付いたので、方法を更新しました。foこの新しいバージョンが MacVim で動作しない場合 (テストする方法がありません)を含む行を削除します。

于 2014-04-12T17:59:37.893 に答える