2012-06-14 14 views
23

以下の質問は、VimからテキストをWebブラウザなどの別のものにコピーする場合に関係します。vimのテキストの巻き戻し

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

答えて

39

ゴーあなた段落の先頭に次のように入力します。

V P J

文書全体のために規範とそれを組み合わせる:

:%norm vipJ 

このコマンドは段落のみをアンラップします。私はこれがあなたが望む行動だと思います。

+0

ありがとうございます!私はこれが最も簡単な方法だと思いますか? 1つの文書全体でこれを実行するものはありませんか? – Ray

+2

@レイ私は自分の答えを編集し、ドキュメント全体に対して実行するコマンドを追加しました。 –

+1

カスタムマッピングとの衝突を避けるには、この場合は '!' -specifierで ':normal'コマンドを使用する方が良いでしょう。 –

10

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

カーソルが段落の最初の行にあるとします。それから をアンラップすると、次の次の行を最後の行の まで簡単に結合できます。便利な方法は、:joinコマンド を正確に実行することです。コマンドの行範囲を が動作するように定義するには、現在の明白な開始行のほかに、終了行を指定するのに、 が必要です。段落の末尾に一致するパターン を使用すると、これは改行文字で、その後に空白行 が続くことがわかります。このように、元のコマンドの構文に言っ定義を翻訳し、我々は入手 :アンラップするすべての段落のために

:,-/\n$/j 

を、 すべての段落の最初の行には、このコマンドを実行します。特定のアクションシーケンスを繰り返す便利なツールはコマンドです。 :globalは、 の行を上から下にスキャンするので、段落の最初の行は、未処理の残りの中の最初の空でない行 です。この観察結果は、その直接的なノーマルモードの対応物よりも効率的であるコマンド

を与えてくれます。

+0

このコマンドには少しバグがあります:1行の段落があれば、次の段落に糊付けされます。 –

+1

@Omar:大きなキャッチ、ありがとう!このケースに対処するための回答が更新されました。 –

+0

私は@ fatihの答えのようにしていましたが、何らかの理由で一緒に非常に短い段落に参加するので、私はここで代替案を探しに来て、これは素晴らしい、ありがとう! – dbmrq

4

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

# Title 1 

## Title 2 

になるだろう:IBの答えで

# Title 1 ## Title 2 

、問題がリストである:

- item1 
- item2 

は次のようになります。

- item1 - item2 

感謝〜this forum post私はそれが働いていませんでした実現ので、メソッドを更新:

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セットアップ。この新しいバージョンがMacVimで動作しない場合は、foを含む行を削除してください(テストする方法はありません)。

関連する問題