vim-jp / vimdoc-ja / usr_25

usr_25 - Vimドキュメント

メインヘルプファイルに戻る
usr_25.txt    For Vim バージョン 8.2.  Last change: 2016 Mar 28

                     VIM USER MANUAL - by Bram Moolenaar

                                テキストの整形


文章を一行に一文ずつ書くようなことはほとんどありません。この章では、テキストが
画面に収まるように整形する方法などを説明します。
一行段落や表を編集するための便利な機能もあります。

25.1  行を改行する
25.2  テキストの位置揃え
25.3  インデントとタブ
25.4  長い行の扱い
25.5  表の編集

次章: usr_26.txt  繰り返し
前章: usr_24.txt  素早く入力する
目次: usr_toc.txt

==============================================================================
25.1  行を改行する

文章を快適に編集するための機能がいくつかあります。初期設定では行は自動的に改行
されません。つまり自分で <Enter> を押す必要があります。プログラムを書くときは
その方が便利ですが、ドキュメントを書くときは少し不便です。文章が 70 桁の幅に収
まるように自分で整形するのは大変でしょう。
'textwidth' オプションを設定すると、行が自動的に改行されるようになります。例え
ば、30 桁の幅で文章を書きたい場合は次のように設定します:

        :set textwidth=30

そして、テキストを入力します (上の数字はルーラーです):

                 1         2         3
        12345678901234567890123456789012345
        I taught programming for a whi

次に "l" を入力すると一行が 30 桁の制限を超えるので、自動的に改行が挿入されま
す。その結果、次のようになります:

                 1         2         3
        12345678901234567890123456789012345
        I taught programming for a
        whil

そのまま続けて文章の残りを入力しましょう:

                 1         2         3
        12345678901234567890123456789012345
        I taught programming for a
        while. One time, I was stopped
        by the Fort Worth police,
        because my homework was too
        hard. True story.

自分で改行する必要はありません。改行は自動的に挿入されます。

        Note:
        'wrap' オプションを使うと長い行を改行して表示できますが、実際に改行文
        字が挿入されるわけではありません。


再整形
------

Vim はワードプロセッサーではありません。ワードプロセッサーなら、段落の最初の
方で文字を削除すると、改行の位置が調整されますが、Vim は違います。つまり、一
行目の "programming" を削除すると、単にその行が短くなるだけです:

                 1         2         3
        12345678901234567890123456789012345
        I taught for a
        while. One time, I was stopped
        by the Fort Worth police,
        because my homework was too
        hard. True story.

これはよくありません。"gq" オペレータを使って段落を整形しましょう。
まず、ビジュアルモードを使ってやってみます。一行目に移動して次のように入力しま
す:

        v4jgq

"v" はビジュアルモードの開始、"4j" で段落の最後まで移動し、"gq" オペレータを実
行します。結果:

                 1         2         3
        12345678901234567890123456789012345
        I taught for a while. One
        time, I was stopped by the
        Fort Worth police, because my
        homework was too hard. True
        story.

Note: 特定の書式に従った文章なら自動的に整形することもできます。
auto-format 参照。

"gq" はオペレータなので、ビジュアルモード、カーソルモーション、テキストオブジェ
クト、の三つの方法で適用範囲を選択できます。
上記の例は "gq4j" とすることもできます。これはコマンドは短くなりますが、行数を
数えないといけません。"}" というモーションコマンドを使えばもっと簡単です。これ
は段落の末尾に移動するコマンドです。"gq}" でカーソル位置から段落の末尾までが整
形されます。
テキストオブジェクトを使うともっと簡単にできます:

        gqap

"ap" は "a-paragraph" という意味です。(空行区切りの) 一つの段落が整形されます。
カーソル位置より前の部分も範囲に入ります。
段落が空行で区切られているなら、次のコマンドでファイル全体を整形できます:

        gggqG

"gg" でファイル先頭に移動し、"gqG" でファイル末尾まで整形します。
警告: 段落が適切に区切られていない場合、それらの文章は一つにつながってしまいま
す。スペースや Tab 文字だけの行があったりするのはよくあるミスです。それは空白
行です。空行ではありません。

整形できるのは単純なプレーンテキストだけではありません。整形の設定については
fo-table を参照してください。ピリオドの後ろに挿入されるスペースの数を変更す
るには 'joinspaces' を参照してください。
外部プログラムを使って整形することもできます。Vim の組み込みコマンドで正しく整
形できないようなテキストを編集するのに便利です。'formatprg' オプション参照。

==============================================================================
25.2  テキストの位置揃え

テキストを中央揃えするには、次のコマンドを使います:

        :{range}center [width]

{range} は通常のコマンドライン範囲指定です。 [width] には中央揃えに使う行の幅
を指定できます。 [width] を指定しなかった場合は 'textwidth' の設定が使われま
す。('textwidth' が 0 なら 80 が使われます)
例:

        :1,5center 40

次のような結果になります:

       I taught for a while. One
       time, I was stopped by the
     Fort Worth police, because my
      homework was too hard. True
                 story.


右端揃え
--------

同様に、右端揃えするには ":right" コマンドを使います:

        :1,5right 37

結果:

            I taught for a while. One
           time, I was stopped by the
        Fort Worth police, because my
          homework was too hard. True
                               story.

左端揃え
--------

次のコマンドで左端揃えできます:

        :{range}left [margin]

":center" や ":right" と違い、":left" の引数に指定する値は行の幅ではありませ
ん。左マージンを指定します。省略した場合は、文章は左端にぴったり寄せられます
(マージンに 0 を指定したのと同じ)。5 を指定した場合は 5 つのスペースでインデン
トされます。例えば、次のように使います:

        :1left 5
        :2,5left

次のような結果になります:

             I taught for a while. One
        time, I was stopped by the
        Fort Worth police, because my
        homework was too hard. True
        story.


両端揃え
--------

両端揃えするための組み込みコマンドはありません。しかし、そのためのマクロパッ
ケージが用意されています。パッケージを使うには、次のコマンドを実行します:

        :packadd justify

または次の行を vimrc に加えてください:

        packadd! justify

新しいビジュアルモードコマンド "_j" が定義されます。ビジュアルモードで範囲選択
して "_j" を実行すればテキストを両端揃えできます。
詳しい説明はスクリプトファイルを参照してください。この名前の上で "gf" を使えば
ファイルを開けます: $VIMRUNTIME/pack/dist/opt/justify/plugin/justify.vim

外部コマンドを使って整形することもできます。例:

        :%!fmt

==============================================================================
25.3  インデントとタブ

テキストをインデントすればその部分を目立たせることができます。例えばこのマニュ
アルでは、例文を示すときに 8 個のスペースまたは Tab 文字でインデントしていま
す。通常なら行頭で Tab キーを押せばインデントできます。例:

        the first line
        the second line

Tab キーを押してテキストを挿入、<Enter>、また Tab キーを押してテキストを挿入し
ます。
'autoindent' オプションを設定すると、自動的にインデントできます:

        :set autoindent

新しい行を開始すると、直前の行と同じだけのインデントが挿入されます。上の例な
ら、<Enter> を押した後の Tab キーが必要なくなります。


インデントを増やす
------------------

行のインデント量を増やすには ">" オペレータを使います。現在行のインデントを増
やしたい場合は ">>" を使うと簡単です。
インデントの増加量は 'shiftwidth' オプションで設定できます。初期設定は 8 です。
例えば、">>" でスペース 4 つ分のインデントを増やしたい場合は次のように設定しま
す:

        :set shiftwidth=4

上記例文の二行目で ">>" を使うと、次のようになります:

        the first line
            the second line

"4>>" は四つの行のインデントを増やすコマンドです。


タブストップ
------------

インデントを 4 桁にしたい場合は 'shiftwidth' を 4 に設定します。しかしそれだけ
では、<Tab> を押したときのインデントの量はスペース 8 個分のままです。これを変
更するには 'softtabstop' オプションを設定します:

        :set softtabstop=4

これで、<Tab> キーがスペース 4 個分のインデントになります。既に 4 つスペースで
インデントされている場合は <Tab> 文字に置き換えられます (7 バイト節約)。(Tab
文字を使いたくない場合は 'expandtab' を設定してください。)

        Note:
        'tabstop' オプションを 4 に設定することもできますが、その設定で編集し
        たファイルを 'tabstop' の初期設定 (8) で見ると見た目が崩れてしまいま
        す。他のプログラムで印刷する場合もインデントが崩れてしまうかもしれませ
        ん。したがって、'tabstop' は常に 8 のままにしておきましょう。それが標
        準的な値です。


TAB幅を変更する
---------------

tabstop が 3 で書かれたファイルを (tabstop が 8 の) Vim で開くと表示が崩れてし
まいます。'tabstop' を 3 に設定すれば表示を直すことができますが、ファイルを開
くたびに設定を変更しなければなりません。
ファイルの tabstop 幅を変更することができます。インデントが正しく表示されるよ
うに 'tabstop' を設定してから ":retab" コマンドを使います:

        :set tabstop=3
        :retab 8

":retab" コマンドを使って 'tabstop' を 8 に変更しています。ただし、テキストの
見た目は変更されません。空白部分が Tab 文字とスペースに置き換えられます。その
状態でファイルを保存すれば、次からは設定を変更しなくてもインデントが正しく表示
されます。
警告: プログラムに対して ":retab" を使った場合、文字列定数の中の空白記号が変更
されてしまうかもしれません。文字列定数の中では Tab 文字ではなく "\t" を使うよ
うにしましょう。

==============================================================================
25.4  長い行の扱い

ウィンドウの幅に収まりきらないようなファイルを編集することがあると思います。そ
の場合、すべての行が画面に収まるように折り返して表示されます。
'wrap' オプションをオフにすると、すべての行が一行で表示されます。長い行の画面
に収まりきらない部分は表示されません。
表示されていない部分にカーソルを動かすと、テキストがスクロールされ、その部分が
表示されます。ウィンドウの枠を右に動かすような感じです。
初期設定では、GUI の水平スクロールバーは表示されません。表示したい場合は次のコ
マンドを使います:

        :set guioptions+=b

Vim ウィンドウの下部に水平スクロールバーが表示されます。

スクロールバーが使えない、または使いたくない場合は、次のコマンドでテキストをス
クロールしてください。カーソルは同じ位置にとどまりますが、画面外に出てしまうと
きは画面内に移動されます。

        zh              右にスクロール
        4zh             右に 4 文字分スクロール
        zH              右にウィンドウの半分だけスクロール
        ze              カーソル位置が右端になるように右スクロール
        zl              左にスクロール
        4zl             左に 4 文字分スクロール
        zL              左にウィンドウの半分だけスクロール
        zs              カーソル位置が左端になるように左スクロール

例を使って説明します。カーソルは "which" の "w" にあります。上部の "current
window" はウィンドウに表示されている範囲を示しています。コマンド実行後の表示範
囲を "window" で示します。

                              |<-- current window -->|
                some long text, part of which is visible in the window
        ze        |<--     window     -->|
        zH         |<--     window     -->|
        4zh               |<--     window     -->|
        zh                   |<--     window     -->|
        zl                     |<--     window     -->|
        4zl                       |<--     window     -->|
        zL                              |<--     window     -->|
        zs                             |<--     window     -->|


折り返し無しの場合の移動
------------------------

'wrap' がオフで、テキストが水平スクロールされているとき、次のコマンドで画面の
表示範囲を基準にして移動できます。ウィンドウの左右のテキストは無視されます。こ
れらのコマンドはテキストをスクロールしません:

        g0              行の右端に移動
        g^              行の右端の最初の非空白文字に移動
        gm              画面行の中央に移動
        gM              行のテキストの中央に移動
        g$              行の左端に移動

                |<--      window     -->|
        some long    text, part of which is visible in one line
                 g0  g^    gm      gM g$


禁則処理                                        edit-no-break
--------

他のプログラムで使うテキストを編集する場合、一つの段落を改行無しで書かなければ
ならないことがあります。'nowrap' を使うと編集中の文全体を表示することができま
せん。'wrap' をオンにすると単語の途中で行が折り返されて読み難くなってしまいま
す。
そのような場合は 'linebreak' オプションを使ってください。適切な場所で行が折り
返されるようになります。ファイルの内容は変更されません。
'linebreak' がオフの状態では次のように表示されますが:

        +---------------------------------+
        |letter generation program for a b|
        |ank.  They wanted to send out a s|
        |pecial, personalized letter to th|
        |eir richest 1000 customers.  Unfo|
        |rtunately for the programmer, he |
        +---------------------------------+

'linebreak' を設定すると:

        :set linebreak

次のように表示されます:

        +---------------------------------+
        |letter generation program for a  |
        |bank.  They wanted to send out a |
        |special, personalized letter to  |
        |their richest 1000 customers.    |
        |Unfortunately for the programmer,|
        +---------------------------------+

関連オプション:
        'breakat'       折り返し可能な文字を指定する。
        'showbreak'     折り返された行の先頭に表示される文字。
        'textwidth'     0 に設定して段落が改行されないようにしてください。


表示行単位の移動
----------------

"j" と "k" で上下の行に移動できますが、長い行の上で使うと、一度に複数の表示行
を移動することになります。
画面上で一行だけ移動したい場合は "gj" と "gk" を使ってください。行が折り返され
ていないときは "j" と "k" と同じ動作をします。折り返されているときは、画面上の
一行だけ移動します。
次のようなマップを定義しておくと便利かもしれません:

        :map <Up> gk
        :map <Down> gj


段落を一行につなげる                                    edit-paragraph-join
--------------------

MS-Word のようなプログラムにテキストをコピーするとき、段落は一行につながってい
なければなりません。段落が空行で区切られているなら、次のコマンドでそれぞれの段
落を一行につなげることができます:

        :g/./,/^$/join

すこし複雑ですね。分解して説明します:

        :g/./           一文字以上の文字を含んでいる行を探す":global"コマンド
             ,/^$/      現在行(非空行)から空行までの範囲を指定
                  join  指定された範囲の行を ":join" コマンドで一行につなげる

30 桁で改行された次のようなテキストが:

        +----------------------------------+
        |A letter generation program       |
        |for a bank.  They wanted to       |
        |send out a special,               |
        |personalized letter.              |
        |                                  |
        |To their richest 1000             |
        |customers.  Unfortunately for     |
        |the programmer,                   |
        +----------------------------------+

二行にまとめられます:

        +----------------------------------+
        |A letter generation program for a |
        |bank.  They wanted to send out a s|
        |pecial, personalized letter.      |
        |To their richest 1000 customers.  |
        |Unfortunately for the programmer, |
        +----------------------------------+

Note: スペースや Tab 文字を含んでいる空白行 (空行ではない) で段落が区切られて
いる場合、上記のコマンドは機能しません。次のコマンドは空白行でも機能します:

        :g/\S/,/^\s*$/join

最後の段落を処理するには、ファイル末尾に空行または空白行が必要です。

==============================================================================
25.5  表の編集

次のような 4 列の表を編集していて:

        nice table        test 1        test 2      test 3
        input A           0.534
        input B           0.913

4 列目に数字を入力したいと思いました。2 行目に移動して "A" を使い、いくつかス
ペースとテキストを入力すればできます。
このような編集のための特別なオプションがあります:

        set virtualedit=all

これを設定すると、文字が無い場所にもカーソルを移動できるようになります。これを
"virtual space" (仮想空白) と呼びます。この方法を使えば簡単に表を編集できます。
検索を実行して 4 列目のヘッダーに移動します:

        /test 3

"j" を押すとカーソルが適切な場所に移動するので、そのまま "input A" の値を入力
できます。"0.693" と入力します:

        nice table        test 1     test 2      test 3
        input A           0.534                  0.693
        input B           0.913

テキストが無かった部分は空白で埋められます。"Bj" コマンドを使って次の行に移動
しましょう。"B" で単語の先頭に移動し、"j" で次のフィールドに移動します。

        Note:
        画面上のどの場所にでもカーソルを移動できます。行末を超えて移動すること
        もできます。文字を挿入しない限り、スペースは挿入されません。


列のコピー
----------

4 列目をコピーして "test 1" 列の前に追加します。次の手順でできます:
1. カーソルを列の左上隅に移動する。例: "/test 3"。
2. CTRL-V を押して矩形選択開始。
3. "2j" で二行下に移動。カーソルは仮想空白の上 ("input B" 行の "test 3" 列)
4. 右に移動して列全体を選択。列を区切るためのスペースも選択する。例えば "9l"
   で移動する。
5. "y" で選択範囲をヤンク。
6. カーソルを "text 1" に移動。この場所に新しい列を挿入する。
7. "P" を押す。

結果は次のようになります:

        nice table        test 3    test 1     test 2      test 3
        input A           0.693     0.534                  0.693
        input B                     0.913

"test 1" 列全体が右側に押し出されます。"test 3" 列のテキストが無い行も同様に移
動していますね。

次のコマンドでカーソル移動を通常に戻せます:

        :set virtualedit=


バーチャル置換モード
--------------------

'virtualedit' の不便なところは感覚が狂ってしまうところです。カーソルを動かして
いるときに、カーソルが Tab 文字の上にあるのか、行末を越えた位置にあるのか、認
識することができません。そこで「バーチャル置換モード」を使います。
例えば、表の中で Tab 文字が使われているとします。その Tab 文字の上で "rx" を
使ってみます:

        inp     0.693   0.534   0.693

               |
           rx  |
               V

        inpx0.693   0.534       0.693

レイアウトが崩れてしまいました。こうならないように、"gr" コマンドを使います:

        inp     0.693   0.534   0.693

               |
          grx  |
               V

        inpx    0.693   0.534   0.693

"gr" コマンドで置換すると、置換した結果がスクリーン上で同じ幅になるように調整
されます。足りない分はスペースか Tab 文字で埋められます。つまり上の例は、Tab
文字が "x" で置換され、残りの部分を埋めるように空白が追加されたのです。例では
Tab 文字が挿入されてます。
複数の文字を置き換えたい場合は "R" コマンドの置換モード (04.9参照) を使いま
すが、それだとレイアウトが崩れて意図しない文字が置換されてしまいます:

        inp     0       0.534   0.693

                |
         R0.786 |
                V

        inp     0.78634 0.693

"gR" コマンドのバーチャル置換モードを使いましょう。これならレイアウトは崩れま
せん:

        inp     0       0.534   0.693

                |
        gR0.786 |
                V

        inp     0.786   0.534   0.693

==============================================================================

次章: usr_26.txt  繰り返し

Copyright: see manual-copyright  vim:tw=78:ts=8:noet:ft=help:norl:
関連キーワード:  usr, 移動, コマンド, テキスト, 文字, 設定, 表示, インデント, Tab, カーソル