文章やプログラムなどの文字の簡単な整形として インデント という手法が
よく使われます. 行の先頭に空白をそろえて入れて, 見出しと内容の文章の構造を
見た目に分かりやすくしたり, プログラムの関数の中身やループの構造を把握しやすく
するために結構使われているものです
こういった字下げ(インデント)を扱う機能について解説します. 今まで インデントをそろえる
ために スペース文字を連打していた人は必見 です. それから,インデントと
関係の深い,「タブ文字」に関するコマンドについても書きます
最初に,「すでに入力されている行のインデントを一発できれいにそろえる」コマンド
を使ってみましょう
カーソルのある行を含めて, 3行分のインデントを 8文字分のスペースでそろえたい 場合には, まず
3:と打つと,画面最下行に :.,.+2 という表示が出て,JVimに操作対象となる行範囲を 知らせたことになります. そのまま, left 8 と打って…つまり
:.,.+2left 8
と表示される状態で (Return) を打てば,きれいに先頭がそろいます
今使ったのは left コマンドです. 一般的な表記で書けば
:(行範囲指定)left (インデント文字数)
のように書くと,範囲内の行の先頭に指定数の空白が入ります. 最初の(行範囲指定)を省略
すれば「カーソルのある行だけ」という意味 となり, (インデント文字数)を省略すれば,
ゼロと解釈され て,先頭の空白を削除できます. なお,行範囲の詳しい指定方法
については, 別文章で詳しく解説しています
ついでに, left があるということは…逆の right もあるかなと思うでしょう ? もちろんあります. 今回のインデントの話題からはそれるので 簡単に説明すると
:(行範囲指定)right (右端からの空白文字数)
のように使って,行を右に寄せる整形処理として使えます. またまたついでに
:(行範囲指定)center (行全体の幅文字数)
とすると,行の内容をセンタリング(中央に寄せる)というコマンドもあります
コマンド名は 「left」,「right」,「center」という簡単な英単語だから覚えやすいですよね
ちなみに短縮形の :le , :ri , :ce という最初の二文字だけでも
意味は同じなので, 多用する人はこちらが良いかも
現在カーソルのある行のインデントを無くしたいのであれば 0 で行の先頭にいって から dw で先頭の空白が消えて, 先頭文字が行の先頭にきます. あるいは, さっき説明した :left でも OKです. これなら範囲を指定して一気に削除したり そろえたりできます. たとえば
5:leなら,カーソル行から5行分のインデントを消せるし,
:.,$le
ならカーソルのある行からファイルの最後までのインデントを一度に全部削除します
タブ文字は,行頭に一定の幅のインデントを持たせたり,文字と文字の間の空白を
開けるために使うものですが, JVimでは設定によってタブの見掛けの幅や挙動の
設定ができます
オプション expandtab を :set expandtab などとしてこれを設定すると,
タブキーを押した場合に,本物のタブを入れる代わりに タブの幅と同じだけのスペース文字
を入れるようになります. 「タブ文字はカーソルが飛んじゃって気持ち悪いから使わない」と
いう人もいると思いますが,そういう人にはお勧めです. 好みで設定して下さい
ちなみに,すでにタブ文字がたくさん入っている文章のタブをスペース文字に 変換したい場合は
:%!expand
でOKです.(unixのコマンド"expand"使用)
もちろん逆に「空白が連続して空いている場所をタブに置き換えたい」のであれば
:%!unexpand ですね
オプション expandtab が設定されている時は, タブキーも CTRL-I キー
でも数個の空白文字が入るわけですが, この時
どうしても 本物のタブを入れたくなった場合 は
直前に CTRL-V を打って CTRL-V TAB とするか
CTRL-V CTRL-I と打つことで, 本物のタブを入れることができます
次に,「文章中に入っている空白は,スペースなのかタブ文字なのか」は,見た目には 分からないものですが,
:set list
として listオプションを設定してやると, タブ文字と改行文字を それぞれ ^I,$と
いう記号をつけて見えるように表示してくれます. このままだと困るのであれば
:set nolist とすれば元に戻ります. 一時的に見たいだけなら
:l とか :list
とすれば,カーソルのある行を同様の表示で一時的に見る事ができますし
範囲をつけて :10,20l で部分を見ることも簡単です
さらについでに,「タブは見えなくて,改行文字だけ見えるようにしたい」場合は,
set crmark のように crmarkというオプションを設定すると, 改行だけが!と
いう文字で見えるようになります
最後に set tabstop=8 などとして,タブの幅を文字数で
設定できます. 文章中のタブ文字の幅や,expandtab設定時に挿入される
スペース文字の個数となります. デフォルトは"8"です
行全体を左右に移動させる(ずらす)操作を,「シフト操作」と呼びます
すでに存在している行や,何か文章を書いている時に,指定した行のインデント量を
深くしたり,浅くしたりといった操作が簡単に出来ます
例えば,
>>と打てば カーソルのある行のインデントが深くなり,
<<
で,浅くなります
数値をつけて 5>> や 5<< ならば, カーソル以下の指定した行数を
まとめてシフトできるし,
[任意のVisual範囲指定をしてから]<
などで,範囲中の行に対してシフトできます
[任意のVisual範囲指定をしてから]3<
で,一度に三段階深くすることもできます. また,
>L
のように,範囲指定としてのカーソル移動コマンド形式でも使えます
この場合は L を使ったので,カーソルのある行から画面の表示されている一番下の
行までをシフトしたことになります. この形式も便利です. 最後に
:20,50> のような Exコマンド形式も使えます
これらのコマンドを実行した直後に . (ピリオド)を打てば,同じ処理を繰り返し
ますから, 2段階,3段階,4段階…と移動できる し, 行き過ぎたら u で戻れます
シフト操作で実際に移動する幅(文字数)は,
set shiftwidth=4
などとして設定できます. shiftwidthオプションに,一段階分のシフト幅を
書きます
今までは主に,すでに存在する行のインデント操作でしたが
ここでは,インデントを操作しながら文章を書く時のコマンドの解説をします
まず, set autoindent として autoindent オプションを設定すると, 文章を書こうとして o , O などのコマンドで新しい行を作ったり, 挿入中に改行をした時に,自動的に以前の行のインデント量と同じだけの空白を空けた 状態になってカーソルが移動します. さらに
set smartindent
として smartindent オプションを設定すると, 自動的なインデント機能が
さらに賢い挙動をするようになります. 具体的には,
行頭が # 文字の行に対しては(普通はコメント行なので)インデントを
ゼロにしたり, C言語でインデントの上げ下げに関連するような文字 "{"や"while"
とか "if"などの文字列を自動的に解釈して,改行の時にインデント量を上げ下げ
までしてくれるようになります
ついでに, smartindent が設定されている時は 行の先頭文字が # であるような行は
シフト操作をしても行の先頭に残る ようになります
「余計な挙動だ」と思う人は(一時的に) nosmartindent にしましょう
"smartindent"なんて結構長い名前ですけど,短縮名は "si"ですから簡単に打てますね
自動的にインデントされた場合だと,自分の希望の位置にインデントされていない
場合もあると思います. 挿入モードにいるままでインデント量を変更したい場合には
CTRL-D と CTRL-T を(挿入モード時に)押せば, 行全体が
そのまま左右にシフトできます
特に, 現在挿入中の行のインデント量をゼロにしたいのであれば
と押すと,どんなに深くても一瞬で変更できます
この操作 0CTRL-D では,インデントは完全に削除されるので,さらに次の行を作った
時は(もちろん)インデントがゼロのままとなりますが,
「一時的にこの行だけインデントをゼロにして,次の行ではインデント量を戻したい」
のであれば 0CTRL-D の代わりに
と打ちます. すると,同様にインデントが削除されますが,さらに次の行を作った時
には,インデント量が復活している状態となります
ちなみに,これらの操作での一段階のシフト移動幅は shiftwidth で設定された
文字数となります
タブ文字の幅は
set tabstop=8などと設定し, シフト量は
set shiftwidth=4
のように, 別の数値に設定して使い分けたい人も いると思います
このような時には
set smarttab
として, smarttab オプションを設定すると
タブ文字を行の先頭に入れた時のみshiftwidthで設定された幅で入り,
文章の途中などで入れられたタブの幅だけを tabstop で設定された幅に出来ます
ついでに set shiftround として, shiftround オプションが設定されている場合は
インデント量は常に shiftwidth 設定値の倍数となる桁になろうとします
どういう意味かというと, 例えば shiftwidth=8 の設定の時に, 最初から3つ分の
空白が行頭にある行に対して >> などのシフト操作をすると, 通常は 8文字分シフト
されて,3+8=11個の行頭空白となるはずですが, shiftround が設定されている時は,
操作前に空白文字があってもシフト操作後には必ず 8個とか16個とか…つまり shiftwidth
の設定値の整数倍の個数の空白がつくようになるのです. これならばらばらだった行頭も,
シフト操作一発で揃えられます