web-dev-qa-db-ja.com

Vimでのワードラップ(インデントを保持)

私はただ この投稿 を見ていましたが、これはvimで単語全体をラップする方法を説明しています。受け入れられた解決策はこれでした:

:set formatoptions=l
:set lbr

これはこのテキストを取ります(タブは\ tとして表示されます):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

これにより、次のような動作が実現します(タブは\ tとして表示されます):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

ただし、この機能を再定義したいと思います。折り返された行の前に、上の行にプラス1のタブと同じ数のタブが必要です。すなわち:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

何か案は?

88

breakindent patch には、探しているものが含まれています。私はこのスレッドにある指示を使用してそれをうまく適用しました:

Homebrewを使用したOS XのブレークインデントパッチをVimにパッチします

具体的には、echristophersonのHomebrew式。

私はこのスレッドが古いことを知っていますが、それはグーグルで人気があり、解決策を見つけようとしたときに何度も遭遇しました。

編集:このパッチは、パッチ7.4.338としてvimに含まれています。参照: https://retracile.net/blog/2014/07/18/18.

ヨセミテ(Mac OS X)では、hombrewでsnowboundのコマンドを使用しました。

brew install macvim --with-features=huge --override-system-vim --HEAD 
18
Exit42

これは最初に質問されたときには機能しませんでしたが、2014年6月25日の時点で機能します。 (vimをその日付よりも新しいバージョンに更新すると仮定します)

.vimrcに追加:

" Indents Word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures Word-wrap does not split words
set formatoptions=l
set lbr

以上です!

-

一部の人々(私も含む)は、複数のコンピューター間で単一の.vimrcを共有しています。その場合、この行を堅牢にすることが重要です(迷惑なエラーメッセージを回避するため)。これは少し良いです:

if has("patch-7.4.354")
    " Indents Word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures Word-wrap does not split words
    set formatoptions=l
    set lbr
endif

このように、以前のバージョンのvimを使用している場合、エラーメッセージは表示されません。

24
JoshuaD

あなたが得る最高のものは、showbreakオプションです。これは、固定された各文字列をラップされた行の前に配置します(私はset showbreak=...)。

8
too much php

「showbreak」が最良の選択肢であるという答えに同意します。 Showbreakでは通常、非表示文字(スペースやタブなど)をshowbreak文字列に入れることはできません。そのため、通常使用される場合は、左マージンに沿ってインジケーターが表示されるだけで、実際のインデントはありません。 OPの主な目的は折り返された線にインデントを付けて、左マージン領域が乱雑になり、独自の線のように見えないようにすることであるため、これは素晴らしいことではありません。

したがって、showbreakを使用して(醜い)インデントを追加する1つの方法は、多くの文字を使用することです(例: ":set showbreak => --------------->")。この結果、次のようになります。

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

より適切な代替策は、改行しないスペース文字を使用することです(VimのインスタンスでUnicodeが有効になっていると想定)。それぞれの文字は、ctrl-v、160のキーシーケンスを使用してshowbreak文字列に入力できます。このようにして、左側が空白で本当のインデントのように見えるshowbreak文字列を入力できます。例:「:set showbreak =。。。。。。。。。>>」各「。」コマンドのは、実際にはctrl-V、160を押して入力した改行しないスペース文字です。そのようにすると、次のように、うまくインデントされたラップができます。

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

前の行のインデントに応じてインデントのレベルを変更する機能はまだありませんが、少なくともウィンドウの左マージンに沿って多くの視覚的な混乱なしに折り返された行のインデントをきれいに取得します。折り返された行のインデントが実際の行の先頭のインデントよりも小さい場合でも混乱が生じる可能性がありますが、これはショーブレークの「インデント」を非常に大きくする(つまり、コードで一般的に見られるインデントよりも大きくする)ことで回避できる可能性があります)しかし、それでも十分に小さいため、テキストを読みやすく折り返すための十分なスペースが確保されます。多くの用途で、40スペースまたは50スペースのショーブレイクインデントでこれはかなりうまくいくと思います。

4
Herbert Sitz