web-dev-qa-db-ja.com

Vimのスマートラップ

Vimには、コード行をスマートにラップする機能があり、インデントしている行と同じインデントを保持する機能があるかどうか疑問に思っていました。電子テキストエディターなどの他のテキストエディターでそれを確認し、私が見ているものを理解するのに役立つことがわかりました。

例えば

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
an example
    </a>
</p>

として表示されます

<p>
    <a href="somelink">
        This is a bogus link, used to demonstrate
        an example
    </a>
</p>
74
Sasha

この機能は、パッチ7.4.338として 2014年6月25日に実装 になりました。この機能を改良したいくつかのパッチがあり、最後のパッチは7.4.354なので、これが必要なバージョンです。

:help breakindent
:help breakindentopt

以下のvimヘルプからの抜粋:

'breakindent'     'bri'   boolean (default off)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Every wrapped line will continue visually indented (same amount of
        space as the beginning of that line), thus preserving horizontal blocks
        of text.

'breakindentopt' 'briopt' string (default empty)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Settings for 'breakindent'. It can consist of the following optional
        items and must be seperated by a comma:
                  min:{n}     Minimum text width that will be kept after
                              applying 'breakindent', even if the resulting
                              text should normally be narrower. This prevents
                              text indented almost to the right window border
                              occupying lot of vertical space when broken.
                  shift:{n}   After applying 'breakindent', wrapped line
                              beginning will be shift by given number of
                              characters. It permits dynamic French paragraph
                              indentation (negative) or emphasizing the line
                              continuation (positive).
                  sbr         Display the 'showbreak' value before applying the 
                              additional indent.
        The default value for min is 20 and shift is 0.

これに関連するのはshowbreak設定です。これにより、シフト量の末尾に指定した文字が追加されます。

構成例

" enable indentation
set breakindent

" ident by an additional 2 characters on wrapped lines, when line >= 40 characters, put 'showbreak' at start of line
set breakindentopt=shift:2,min:40,sbr

" append '>>' to indent
set showbreak=>>   

動作に関する注意

sbrオプションを指定しない場合、showbreakの文字はインデントに追加されます。上記の例からsbrを削除すると、4文字の効果的なインデントが発生します。その設定で、インデントを追加せずにshowbreakを使用したいだけなら、shift:0

負のシフトを与えることもできます。これは、showbreak文字と折り返しテキストをドラッグして、使用可能なインデントスペースに戻す効果があります。

min値を指定すると、端末の幅が狭い場合、シフトされた量は押しつぶされますが、showbreak文字は常に保持されます。

50

これにはパッチがありますが、yearsの間、長続きしており、前回チェックしたときにきれいに適用されていませんでした。 http://groups.google.com/group/vim_dev/web/vim-patches の「ラップされた行を正しくインデントする」エントリを参照してください。

更新:そのリンクはビットロットされているようです。 パッチの最新バージョンです

アップデート2: マージ アップストリーム(7.4.345の時点)であったため、今は:set breakindent

33
ergosys

まったく同じインデントを設定することは不可能だと思いますが、 'showbreak'オプションを設定することで、より良いビューを得ることができます。

:set showbreak=>>>

例:

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
>>>an example
    </a>
</p>

Vimは '>>>'に異なる色を使用するため、実際のコードは上記のサンプルコードよりも見栄えがよくなります。

17
too much php

更新:2014年6月に、 breakindentオプションをサポートするパッチ がVimにマージされました(最良のサポートのためにバージョン7.4.346以降)。


:set nowrapこれは、vimが右にスクロールして長い行を表示できるようにします。これは、ドキュメントの全体的な構造を調べるのに役立ちますが、実際に編集するにはあまり便利ではありません。

探しているものに近い他のオプションは、linebreakshowbreakです。 showbreakを使用すると、折り返される行の左マージンに表示される内容を変更できますが、残念ながら現在のコンテキストに応じて変数のインデントを許可しません。

8
Greg Hewgill

これを行うことができることを知っている唯一の方法は、リターン文字(Cfreakによる言及)を使用し、textwidthオプションをさまざまなインデントオプションと組み合わせることです。インデントが正しく構成されている場合(デフォルトではhtml構文ではそうですが、そうでない場合はautoindentおよびsmartindentオプションが表示されます)、次のことができます。

:set formatoptions = tcqw
:set textwidth = 50
gggqG

formatoptions設定をカスタマイズしている場合は、単純に実行することをお勧めします。

:set fo += w
:set tw = 50
gggqG

これが何をするか:

:set fo+=w  " Add the 'w' flag to the formatoptions so 
            " that reformatting is only done when lines
            " end in spaces or are too long (so your <p>
            " isn't moved onto the same line as your <a...).
:set tw=50  " Set the textwidth up to wrap at column 50
gg          " Go to the start of the file
gq{motion}  " Reformat the lines that {motion} moves over.
G           " Motion that goes to the end of the file.

これはソフトラップと同じではないことに注意してください。ソースファイルと画面で行をラップします(もちろん保存しない限り!)。 formatoptionsに追加できる他の設定は、入力時に自動フォーマットされます。詳細は:help fo-table

詳細については、以下を参照してください。

:help 'formatoptions'
:help fo-table
:help 'textwidth'
:help gq
:help gg
:help G
:help 'autoindent'
:help 'smartindent'
5
DrAl
:set smartindent
:set autoindent

それでもリターンを使用する必要があると思います

3
Cfreak

マクロソリューション:


編集:

操作gq{motion}は、変数「textwidth」が設定されているものに自動フォーマットします。これは、マクロに80lBi^Mを使用するよりも簡単/優れています。


自動インデントを有効にしている場合

:set autoindent

次に、行末に改行を入力すると、次の行が同じ量だけインデントされます。必要に応じて、これを使用して、ラインラップにハードエントリできます。次のマクロはこれを利用して、テキストを自動的にインデントします。

レジスタzを次のように設定します。

gg/\v^.{80,}$^M@x (change 80 to whatever length you want your text to be)

そして、レジスタxを次のように設定します。

80lBi^M^[n@x (change 80 to whatever length you want your text to be)

それから

@x   

マクロをアクティブにします。数秒後、テキストはすべて80文字以下の適切にインデントされた行になります。

説明:

マクロの詳細は次のとおりです。

パート1(マクロz):

gg/\v^.{80,}$^M@x

gg - start at the top of the file (this avoids some formatting issues)
/  - begin search
\v - switch search mode to use a more generic regex input style - no weird vim 'magic'
^.{80,}$ - regex for lines that contain 80 or more characters
^M - enter - do the search (don't type this, you can enter it with ctrl+v then enter)
@x - do macro x

パート2(マクロx):

80lBi^M^[n@x

80l - move right 80 characters
B   - move back one Word (WORDS include characters like "[];:" etc.)
i^M - enter insert mode and then add a return (again don't type this, use ctrl+v)
^[  - escape out of insert mode (enter this with ctrl+v then escape)
@x  - repeat the macro (macro will run until there are no more lines of 80 characters or more)

警告:

  • 80文字以上のWordがある場合、このマクロは壊れます。

  • このマクロは、タグを越えて行をインデントするようなスマートなことはしません。

  • Lazyredraw設定(:set lazyredraw)を使用してこれを高速化します

2
Michael Asnes

HTMLが十分に整形されている場合、 xmllint を介して実行すると役立つ場合があります。

:%!xmllint --html --format
2
Arkady