Next: usr_26.txt, Previous: usr_24.txt, Up: 目次 [Index]
*usr_25.txt* For Vim バージョン 8.1. Last change: 2016 Mar 28 VIM USER MANUAL - by Bram Moolenaar テキストの整形
文章を 1 行に 1 文ずつ書くやうなことはほとんどありません。この章では、テキストが畫面に收まるやうに整形する方法などを說明します。 1 行段落や表を編輯するための便利な機能もあります。
|25.1| | 行を改行する |
|25.2| | テキストの位置揃へ |
|25.3| | インデントとタブ |
|25.4| | 長い行の扱ひ |
|25.5| | 表の編輯 |
文章を快適に編輯するための機能がいくつかあります。初期設定では行は自動的に改行されません。つまり自分で <Enter>
を押す必要があります。プログラムを書くときはその方が便利ですが、ドキュメントを書くときは少し不便です。文章が 70 桁の幅に收まるやうに自分で整形するのは大變でせう。
’textwidth’ オプションを設定すると、行が自動的に改行されるやうになります。例へば、30 桁の幅で文章を書きたい場合は次のやうに設定します:
:set textwidth=30
そして、テキストを入力します (上の數字はルーラーです):
1 2 3 12345678901234567890123456789012345 I taught programming for a whi
次に "l" を入力すると 1 行が 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 は違ひます。つまり、1 行目の "‘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" オペレータを使つて段落を整形しませう。
まづ、ビジュアルモードを使つてやつてみます。1 行目に移動して次のやうに入力します:
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| 參照。
"gp" はオペレータなので、ビジュアルモード、カーソルモーション、テキストオブジェクト、の 3 つの方法で適用範圍を選擇できます。
上記の例は "gq4j" とすることもできます。これはコマンドは短くなりますが、行數を數へないといけません。"}" といふモーションコマンドを使へばもつと簡單です。これは段落の末尾に移動するコマンドです。"gq}" でカーソル位置から段落の末尾までが整形されます。
テキストオブジェクトを使ふともつと簡單にできます:
gqap
"ap" は "a-paragraph" といふ意味です。(空行區切りの) 1 つの段落が整形されます。カーソル位置より前の部分も範圍に入ります。 段落が空行で區切られてゐるなら、次のコマンドでファイル全體を整形できます:
gggqG
"gg" でファイル先頭に移動し、"gqG" でファイル末尾まで整形します。
警告:
段落が適切に區切られてゐない場合、それらの文章は 1 つにつながつてしまひます。スペースや Tab 文字だけの行があつたりするのはよくあるミスです。それは空白行です。空行ではありません。
整形できるのは單純なプレーンテキストだけではありません。整形の設定については |fo-table| を參照してください。ピリオドの後ろに插入されるスペースの數を變更するには ’joinspaces’ を參照してください。
外部プログラムを使つて整形することもできます。Vim の組み込みコマンドで正しく整形できないやうなテキストを編輯するのに便利です。’formatprg’ オプション參照。
テキストを中央揃へするには、次のコマンドを使ひます:
:{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
テキストをインデントすればその部分を目立たせることができます。例へばこのマニュアルでは、例文を示すときに 8 個のスペースまたは Tab 文字でインデントしてゐます。通常なら行頭で Tab
キーを押せばインデントできます。例:
the first line the second line
Tab
キーを押してテキストを插入、<Enter>
、また Tab
キーを押してテキストを插入します。
’autoindent’ オプションを設定すると、自動的にインデントできます:
:set autoindent
新しい行を開始すると、直前の行と同じだけのインデントが插入されます。上の例なら、<Enter>
を押した後の Tab
キーが必要なくなります。
行のインデント量を增やすには ">
" オペレータを使ひます。現在行のインデントを增やしたい場合は ">>
" を使ふと簡單です。
インデントの增加量は ’shiftwidth’ オプションで設定できます。初期設定は 8 です。例へば、">>
" でスペース 4 つ分のインデントを增やしたい場合は次のやうに設定します:
:set shiftwidth=4
上記例文の 2 行目で ">>" を使ふと、次のやうになります:
the first line the second line
"4>>" は 4 つの行のインデントを增やすコマンドです。
インデントを 4 桁にしたい場合は ’shiftwidth’ を 4 に設定します。しかしそれだけでは、<Tab>
を押したときのインデントの量はスペース 8 個分のままです。これを變更するには ’softtabstop’ オプションを設定します:
:set softtabstop=4
これで、<Tab>
キーがスペース 4 個分のインデントになります。既に 4 つスペースでインデントされてゐる場合は <Tab> 文字に置き換へられます (7 バイト節約)。(Tab 文字を使ひたくない場合は ’expandtab’ を設定してください。)
Note:
’tabstop’ オプションを 4 に設定することもできますが、その設定で編輯したファイルを ’tabstop’ の初期設定 (8) で見ると見た目が崩れてしまひます。他のプログラムで印刷する場合もインデントが崩れてしまふかもしれません。したがつて、’tabstop’ は常に 8 のままにしておきませう。それが標準的な値です。
tabstop が 3 で書かれたファイルを (tabstop が 8 の) Vim で開くと表示が崩れてしまひます。’tabstop’ を 3 に設定すれば表示を直すことができますが、ファイルを開くたびに設定を變更しなければなりません。
ファイルの tabstop 幅を變更することができます。インデントが正しく表示されるやうに ’tabstop’ を設定してから ":retab
" コマンドを使ひます:
:set tabstop=3 :retab 8
":retab
" コマンドを使つて ’tabstop’ を 8 に變更してゐます。ただし、テキストの見た目は變更されません。空白部分が Tab 文字とスペースに置き換へられます。その狀態でファイルを保存すれば、次からは設定を變更しなくてもインデントが正しく表示されます。
警告:
プログラムに對して ":retab
" を使つた場合、文字列定數の中の空白記號が變更されてしまふかもしれません。文字列定數の中では Tab 文字ではなく "\t" を使ふやうにしませう。
ウィンドウの幅に收まりきらないやうなファイルを編輯することがあると思ひます。その場合、すべての行が畫面に收まるやうに折り返して表示されます。
’wrap’ オプションをオフにすると、すべての行が 1 行で表示されます。長い行の畫面に收まりきらない部分は表示されません。
表示されてゐない部分にカーソルを動かすと、テキストがスクロールされ、その部分が表示されます。ウィンドウの枠を右に動かすやうな感じです。
初期設定では、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$
他のプログラムで使ふテキストを編輯する場合、1 つの段落を改行無しで書かなければならないことがあります。’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
" で上下の行に移動できますが、長い行の上で使ふと、1 度に複數の表示行を移動することになります。
畫面上で 1 行だけ移動したい場合は "gj
" と "gk
" を使つてください。行が折り返されてゐないときは "j
" と "k
" と同じ動作をします。折り返されてゐるときは、畫面上の 1 行だけ移動します。
次のやうなマップを定義しておくと便利かもしれません:
:map <Up> gk :map <Down> gj
MS-Word のやうなプログラムにテキストをコピーするとき、段落は一行につながつてゐなければなりません。段落が空行で區切られてゐるなら、次のコマンドでそれぞれの段落を 1 行につなげることができます:
:g/./,/^$/join
すこし複雜ですね。分解して說明します:
:g/./ | 1 文字以上の文字を含んでゐる行を探す ":global " コマンド |
,/^$/ | 現在行(非空行)から空行までの範圍を指定 |
join | 指定された範圍の行を ":join " コマンドで 1 行につなげる |
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, | +----------------------------------+
2 行にまとめられます:
+----------------------------------+ |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
最後の段落を處理するには、ファイル末尾に空行または空白行が必要です。
次のやうな 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" 列の前に追加します。次の手順でできます:
結果は次のやうになります:
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
Next: usr_26.txt, Previous: usr_24.txt, Up: 目次 [Index]