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


92

単語全体を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               |
|                                       |
|---------------------------------------|

何か案は?


34
質問をできるだけ明確にするために取られた努力の+1。
ジェフリーホセ

テキストをウィンドウの端でソフトラップしますか、それとも行が特定の長さに達したときにハードラップしますか?ハードラッピング( "will"の後に改行がテキストに挿入される)が必要だと思いますが、例から見分けるのは困難です。
ビル・オドム

@Bill、私は主にソフトラッピングに興味がありますが、ハードラッピングソリューションも受け入れられます。
sixtyfootersdude

1
必要な機能は現在Vimに組み込まれていません。ただし、近づくパッチがあります:groups.google.com/group/vim_dev/web/vim-patches(これは#15、「ラップされた行を正しくインデントする」です)。
Bill Odom、

関連:VimCastsは、この問題を処理するために外部のUNIXユーティリティを使用することについて素晴らしいエピソードを持っていました:vimcasts.org/e/18
ダミアンウィルソン

回答:


18

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

VimにHomebrewを搭載したOS Xの壊れやすいパッチをパッチする

具体的には、echristophersonのHomebrew式。

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

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

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

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

パッチは自作の最新のmacvimでは動作しないようですか?@ Exit42どうやって機能させたの?
2015

nvm。私は自作の最先端でmacvimをコンパイルしましたbrew install macvim --with-features=huge --override-system-vim --HEAD
雪に覆われた

1
以下の私の回答を参照してください:stackoverflow.com/questions/2828174/… 新しいバージョンのvimではパッチは必要ありません。
JoshuaD 2015

26

これは最初に質問されたときには機能しませんでしたが、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を使用している場合、エラーメッセージは表示されません。


興味深いことに、これは私のcygwinの7.4 vimでは機能しますが、私のunbuntuの7.4 vimでは機能しません。もう少し普及する必要があると思いますが、まもなく一般的な採用が見られるでしょう。
JoshuaD 2014年

1
Vim 7.4 @ ArchLinuxで動作します。
アンディミハイレンコ2014年

1
代わりに、このテストを使用することができます:if has("patch-7.4.354")
ローレンスKesteloot

これは、OPの発言に関する質問には答えません。同じ数のタブ(...) に1つを加えたものです。それは私の意見でも非常に重要ですが、追加のインデントを維持し、ラップされたセグメントを光学的に右にシフトしたい場合があります(タイトに並べられたリスト、メモなど)。
血まみれの

8

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


@AlexanderBirdによると:help 'showbreak'、いいえ、できませんshowbreak。これは単なる文字列です。
Rory O'Kane 2013

4

「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スペースのショーブレイクインデントはこれをかなりうまくいくと思います。


7
スペースをエスケープすることで、showbreakにスペースを入れることができます:set showbreak=\ \ \ \ 。ただし、タブではまだ機能しません。
Bill Odom、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.