vim-jp / vimdoc-ja / usr_21

usr_21 - Vim日本語ドキュメント

メインヘルプファイルに戻る English | 日本語 | 編集
usr_21.txt    For Vim バージョン 9.1.  Last change: 2024 May 17

                     VIM USER MANUAL - by Bram Moolenaar

                                  中断と再開


この章では、Vim と他のプログラムを並行して使う方法を説明します。Vim の中から外
部プログラムを実行したり、Vim を一次的に中断することでそれを実現できます。さら
に、作業状態を記録しておいて、後から復元する方法も説明します。

21.1  サスペンドとレジューム
21.2  シェルコマンドの実行
21.3  viminfo に情報を記録する
21.4  セッション
21.5  ビュー
21.6  モードライン

次章: usr_22.txt  ファイルを探す
前章: usr_20.txt  コマンドラインを素早く入力する
目次: usr_toc.txt

==============================================================================
21.1  サスペンドとレジューム

他の Unix プログラムと同様に、Vim も CTRL-Z でサスペンドできます。CTRL-Z を押
すと Vim が停止し、実行元のシェルに制御が戻ります。そこで好きなだけ他のコマン
ドを実行できます。Vim に戻るには "fg" コマンドを使います。 >

        CTRL-Z
        {任意のシェルコマンドを実行}
        fg

サスペンドする前とまったく同じ状態に戻ることができます。
CTRL-Z を押しても反応がなかった場合は ":suspend" コマンドを使ってください。
Vim をフォアグラウンドに戻すのを忘れないでください。戻さなかった場合は編集作業
が失われてしまいます。

この機能は Unix でのみサポートされています。他のシステムでは新しいシェルが起動
されるでしょう。シェルのコマンドが使えることに違いはありませんが、しかしそれは
Vim を実行したシェルではなく、新しいシェルです。
GUI で実行しているときは実行元のシェルに戻ることはできません。CTRL-Z を押すと
Vim ウィンドウが最小化されます。

==============================================================================
21.2  シェルコマンドの実行

一つのシェルコマンドを実行するには ":!{command}" を使います。例えば、ディレク
トリのファイル一覧を見るには次のようにします: >

        :!ls            (Unix 環境)
        :!dir           (MS-DOS/MS-Windows 環境)

外部プログラムが実行されます。コマンドの実行が終わると <Enter> キーの入力を促
すプロンプトが表示されるので、コマンドの出力を確認してから通常画面に戻ってくだ
さい。
"!" は他のコマンドで外部プログラムを指定するときにも使われます。次のコマンドで
指定できます:

        :!{program}           {program} を実行する
        :r !{program}         {program} を実行し、その出力を読み込む
        :w !{program}         {program} を実行し、標準入力にテキストを書き込む
        :[range]!{program}    {program} を実行し、テキストをフィルタリングする

"!{program}" に範囲指定をするとまったく違う動作になるので注意してください。範
囲指定がなければ単純にプログラムが実行されるだけですが、範囲指定があると、その
範囲のテキストがプログラムでフィルタ処理されます。

この方法で外部プログラムを何度でも実行できますが、続けてたくさん実行したい場合
はシェルを起動した方がいいでしょう。次のコマンドで新しいシェルを起動できます:
>
        :shell

CTRL-Z で Vim をサスペンドしたときの動作に似ていますが、新しいシェルが起動され
るという点が違います。

GUI を使っている場合は、シェルの入出力に Vim ウィンドウが使われます。Vim は端
末エミュレータではないので、端末の機能を完全に再現することはできません。うまく
動作しない場合は、'guipty' オプションを設定してみてください。それでも動作しな
い場合は、新しい端末を作成し、そこでシェルを実行してください。例えば、次のよう
にします: >

        :!xterm&

==============================================================================
21.3  viminfo に情報を記録する

テキストを保持しているレジスタ、いろんな場所に設定されたマーク、慎重に書き上げ
たコマンドが記録されたコマンドライン履歴などは、Vim を終了するとすべて失われて
しまいます。ただし、それらを復元することは可能です!

viminfo ファイルには以下の情報を記録できます:

        コマンドライン履歴と検索履歴
        レジスタ
        マーク
        バッファリスト
        グローバル変数

Vim を終了すると、これらの情報が viminfo ファイルに保存されます。次に Vim を起
動すると、viminfo ファイルが読み込まれ、状態が復元されます。

'viminfo' オプションの初期設定では、あまり多くの情報は記録されません。たくさん
の情報を記録したい場合は、次のコマンドで設定してください: >

        :set viminfo=string

"string" の部分に、記録したい情報を指定します。設定の書式は、オプション文字と
引数の組み合わせをコンマ (,) で区切ったリストです。
'viminfo' の設定方法を順番に見ていきましょう。まず、' オプションを設定してみま
す。' オプションには、マーク (a-z) を記録するファイルの数を指定できます。適当
な数 (例えば 1000) を設定しましょう。コマンドは次のようになります: >

        :set viminfo='1000

f オプションには、グローバルマーク (A-Z と 0-9) を記録するかどうかを指定できま
す。引数が 0 なら何も記録されません。f オプションを指定しない、あるいは引数に
1 を指定すると、マークが保存されます。このオプションを指定すると、コマンドは次
のようになります: >

        :set viminfo='1000,f1
<
< オプションには、レジスタの行数制限を指定できます。初期設定ではすべての行が記
録されます。引数が 0 なら何も記録されません。何千行もの (起動を遅くする以外に
使い道のない) テキストを viminfo ファイルに記録したくはないので、500 行に制限
してみます: >

        :set viminfo='1000,f1,<500
<
他にも次のようなオプションがあります:
        :       記録するコマンドライン履歴の数
        @       記録する入力行履歴の数
        /       記録する検索履歴の数
        r       指定されたリムーバブルメディア上のファイルのマークを記録しない
                (複数指定可)
        !       名前がすべて大文字のグローバル変数を記録する
        h       起動直後に 'hlsearch' による強調表示をしない
        %       バッファリスト (Vim をファイル引数なしで起動したときのみ復元さ
                れます)
        c       テキストを 'encoding' で変換する
        n       viminfo ファイルの名前 (このオプションは末尾に指定する必要があ
                ります)

詳細は 'viminfo' と viminfo-file を参照してください。

Vim を複数起動した場合は、最後に終了した Vim の状態が記録されます。それより前
に終了した Vim が記録した情報は失われます。記録できるのは一つの状態だけです。


前回の場所に戻る

ファイルの編集中に終業時間が来てしまいました。明日から休暇です。Vim を終了し、
家路につきましょう。仕事の事はすべて忘れて休暇を楽しんでください。数週間後、仕
事に戻ったら、Vim を立ち上げて、こう入力します: >
>
        '0

すると、最後に編集していた場所に戻れます。これで仕事が続けられますね。
Vim を終了するたびにマークが設定されます。最新のマークは '0 です。マークは '0
から '1 へ、'1 から '2 へ、しだいにずれていき、'9 まで記録されます。
'0 から '9 までのマークがどこを指しているのかは :marks コマンドで確認できま
す。


最近開いたファイルに戻る

最近開いたファイルを再び開きたい場合はすこし面倒です (前回の Vim 終了時に開い
ていたファイルではなくてまさに最近開いたファイルのこと)。次のコマンドでファイ
ルの一覧を表示できます: >

        :oldfiles
<       1: ~/.viminfo ~
        2: ~/text/resume.txt ~
        3: /tmp/draft ~

二番目のファイル ("2:" の行) を開きたい場合は次のように入力します: >

        :e #<2

":e" 以外にも、ファイル名を引数に取るコマンドならどれを使っても構いません。
"#<2" という表記は "%" (カレントファイル) や "#" (オルタネートファイル) と同じ
要領で使用できます。例えば次のようにすると、三番目のファイルを分割ウィンドウで
開くことができます: >

        :split #<3

単にファイルを開きたい場合には #<123 という指定は少し面倒かもしれませんね。
もっと簡単な方法があります: >

        :browse oldfiles
<       1: ~/.viminfo ~
        2: ~/text/resume.txt ~
        3: /tmp/draft ~
        -- More --

:oldfiles と同じようにファイル一覧が表示されます。"resume.txt" を開きたい場
合にはまず "q" を押して表示を止めます。プロンプトが表示されるので:

        Type number and <Enter> (empty cancels): ~

"2" を入力して <Enter> を押し、二番目のファイルを開きます。

ファイル名にパターンが含まれていることが分かっている場合は、ファイルのリストを
:filter することもできます: >

        :filter /resume/ :browse oldfiles
<
マッチするファイル名が 1 つだけの場合、Vim はプロンプトを表示せずにそのファイ
ルを直接編集します。フィルターが複数のファイルにマッチする場合は、代わりにマッ
チするファイルのリストの入力を求めるプロンプトが表示されます: >

        :filter! /resume/ browse oldfiles
<       1: ~/.viminfo ~
        3: /tmp/draft ~
        Type number and <Enter> (q or empty cancels): ~

Note: 今回は、resume にマッチしないファイルをすべて除外しました:


詳細は :oldfilesv:oldfilesc_#< を参照してください。


他の Vim に情報を移動する

":wviminfo" コマンドと ":rviminfo" コマンドを使うと、Vim の実行中でも viminfo
ファイルの保存と復元ができます。例えば、他の Vim からレジスタの内容をコピーす
ることができます。片方の Vim で次のようにして保存し: >

        :wviminfo! ~/tmp/viminfo

もう一方の Vim でそれを読み込みます: >

        :rviminfo! ~/tmp/viminfo

言うまでもなく、"w" は "write"、"r" は "read" の意味です。
既存のファイルに上書きするときは、":wviminfo" に ! を付けてください。! を指定
しなかった場合は、現在の情報と既存のファイルの情報がマージされます。
":rviminfo" に ! を付けると、ファイルのすべての情報が使われます。つまり、現在
の情報が上書きされます。! を指定しなかった場合は、まだ設定されていない情報だけ
が使われます。
これらのコマンドを使えば、状態を保存しておいて後で再利用することもできます。例
えば、viminfo 専用のディレクトリに状態を保存しておき、目的ごとに使い分けること
も可能です。

==============================================================================
21.4  セッション

作業が終わらない内に一日が終わってしまった場合、その日の作業を中断し、次の日に
同じ状態で作業を再開できたら便利ですよね。編集セッションを保存しておけば、作業
状態を復元することができます。
セッションには、作業状態に関するすべての情報が保存されます。例えば、ファイルリ
スト、ウィンドウレイアウト、グローバル変数、オプションの設定などです。(正確に
は、下記で説明されている 'sessionoptions' に指定された項目が保存されます。)
次のコマンドでセッションファイルを作成できます: >

        :mksession vimbook.vim

セッションを復元するには、次のコマンドを使います: >

        :source vimbook.vim

Vim の起動と同時にセッションを再開するには、次のようにして Vim を起動します: >

        vim -S vimbook.vim

Vim が起動し、指定したファイルが読み込まれます。'S' はセッション (Session) の
意味です (実際には、-S には Vim script ならなんでも指定できるので、"source" を
意味しているとも言えます)。

以前に開いていたウィンドウが、同じ場所、同じ大きさで作成されます。マップやオプ
ションの設定も復元されます。
復元される情報は 'sessionoptions' オプションで設定できます。初期設定は
"blank,buffers,curdir,folds,help,options,tabpages,winsize,terminal" です。

        blank           空のウィンドウ
        buffers         すべてのバッファ (ウィンドウに表示されていないバッファ
                        も含む)
        curdir          カレントディレクトリ
        folds           折り畳み (手動で設定したものも含む)
        help            ヘルプウィンドウ
        options         すべてのオプションとマップ
        tabpages        すべてのタブページ
        winsize         ウィンドウの大きさ
        terminal        端末ウィンドウを含む

好きなように設定してください。例えば、Vim ウィンドウの大きさも復元したい場合
は、次のようにします: >

        :set sessionoptions+=resize


こっちにもセッション、あっちにもセッション

セッションは、複数のプロジェクトで仕事をするときなどに使われます。
例えば、"~/.vim" にセッションファイルを保存するとします。そして、"secret" プロ
ジェクトで作業している最中に、"boring" プロジェクトで作業する必要がでてきまし
た: >

        :wall
        :mksession! ~/.vim/secret.vim
        :source ~/.vim/boring.vim

最初に、":wall" ですべてのファイルを保存します。次に、現在のセッションを
":mksession!" で保存します。以前のセッション情報が上書きされました。後で
secret セッションをロードすると今現在の状態から作業を再開できます。最後に、
"boring" セッションをロードします。

ヘルプを開いたり、ウィンドウを分割したり閉じたりして、ウィンドウレイアウトが乱
れてしまった場合、セッションをロードし直せば元に戻せます: >

        :source ~/.vim/boring.vim

毎回新しいセッションを保存するか、あるいは最初に保存したセッションを使い続ける
かは自由に選択できます。
セッションには他の使い方もあります。例えば、好みのウィンドウレイアウトをセッ
ションに保存しておけば、いつでも好きなときにそのレイアウトに戻ることができま
す。
例えば、このようなレイアウトは使いやすいでしょう:

        +----------------------------------------+
        |                  VIM - main help file  |
        |                                        |
        |Move around:  Use the cursor keys, or "h|
        |help.txt================================|
        |explorer   |                            |
        |dir        |~                           |
        |dir        |~                           |
        |file       |~                           |
        |file       |~                           |
        |file       |~                           |
        |file       |~                           |
        |~/=========|[No File]===================|
        |                                        |
        +----------------------------------------+

ヘルプウィンドウが上部に表示され、いつでも参照できます。左端の縦長のウィンドウ
はファイルエクスプローラーという Vim のプラグインです。ディレクトリのファイル
一覧を表示し、その中からファイルを選択して開くことができます。詳しくは次章で説
明します。
このようなウィンドウを作るには、Vim を起動してから次のコマンドを実行します: >

        :help
        CTRL-W w
        :vertical split ~/

ウィンドウの大きさを調節し、セッションを保存してください: >
>
        :mksession ~/.vim/mine.vim

これで、同じレイアウトで Vim を起動できます: >

        vim -S ~/.vim/mine.vim

Hint: エクスプローラーでファイルを選択し、空のウィンドウでファイルを開くには、
ファイル名の場所にカーソルを移動して "O" を押します。マウスのダブルクリックで
も同じ動作になります。


Unix と MS-Windows

MS-Windows と Unix を両方使わなければならない人もいるでしょう。そのような人は、
'sessionoptions' に "slash" と "unix" を追加した方がいいかもしれません。その設
定で保存されたセッションファイルはどちらのシステムでも使えます。次のコマンドを
vimrc ファイルに追加してください: >

        :set sessionoptions+=unix,slash

セッションファイルが Unix 形式で保存されるようになります。MS-Windows の Vim は
Unix 形式のセッションファイルを読み書きできますが、Unix の Vim は MS-Windows
形式のセッションファイルを読み込むことができません。同様に、MS-Windows の Vim
は / で区切られたファイル名を処理できますが、Unix の Vim は \ を処理できませ
ん。


セッションと viminfo

セッションファイルにはたくさんの情報が保存されますが、マークやレジスタ、コマン
ドライン履歴などは保存されません。それらの情報を保存するには viminfo を使って
ください。
セッションと viminfo は分けて使うことが多いと思います。他のセッションに切り換
えてもコマンドライン履歴をそのまま残すことができますし、テキストをレジスタにヤ
ンクし、他のセッションでペーストするということもできます。
セッションと viminfo を同時に使いたい場合は、自分で保存してください。例: >

        :mksession! ~/.vim/secret.vim
        :wviminfo! ~/.vim/secret.viminfo

復元するには次のようにします: >

        :source ~/.vim/secret.vim
        :rviminfo! ~/.vim/secret.viminfo

==============================================================================
21.5 ビュー

セッションは Vim 全体の表示設定を扱います。一つのウィンドウに関する設定だけ保
存したい場合は、ビューを使います。
ビューは、ファイルごとに表示設定を変更したい場合に使います。例えば、'number'
を設定して行番号を表示し、いくつかの折り畳みを定義した場合に、その情報を保存し
て、後で復元することができます。実際のところ、セッションには、各ウィンドウの
ビューが保存されているのです。
ビューの使い方は二つあります。一つは、ビューファイルの名前を Vim に決めさせる
方法です。保存したビューは、同じ名前のファイルを開いているときに復元できます。
カレントウィンドウのビューを保存するには、次のコマンドを使います: >

        :mkview

ビューを保存する場所は自動的に決定されます。後で同じファイルを開いたときに、次
のコマンドでビューを復元できます: >

        :loadview

簡単ですね。
さて、同じファイルを違う設定で表示してみましょう。'number' オプションをオフに
設定、あるいは折り畳みをすべて開き、ウィンドウの表示を変更してみます。そして、
次のコマンドでビューを保存します: >

        :mkview 1

当然、次のようにして復元します: >

        :loadview 1

これで、":loadview" と ":loadview 1" を使って、同じファイルの二つのビューを切
り替えられるようになりました。
ファイル一つにつき、番号なしのビューと、1 から 9 までの 9 個のビュー、合わせて
10 個のビューが使えます。


名前付きのビュー

ビューのもう一つの使用方法は、指定したファイルにビューを保存する方法です。この
方法なら、他のファイルを開いていてもビューを復元できます。ビューを復元すると、
ビューに関連付けられたファイルが開くので、編集するファイルを素早く切り替える方
法としても使えます。
例えば、カレントファイルのビューを保存するには、次のようにします: >

        :mkview ~/.vim/main.vim

次のコマンドで復元できます: >

        :source ~/.vim/main.vim

==============================================================================
21.6  モードライン

ファイル固有の設定を、ファイルを開くたびに設定しても構いませんが、何度も何度も
同じコマンドを入力するのはうんざりですよね。セッションやビューでは同じ設定を他
人と共有できません。
そのような場合にはモードラインを使います。モードラインとは、ファイル固有の設定
をファイル内に記述するための仕組みです。
例えば、C 言語ファイルのインデントをスペース 4 個分に設定したい場合に使います。
それには 'shiftwidth' オプションを 4 に設定する必要があるので、モードラインは
次のようになります:

        /* vim:set shiftwidth=4: */ ~

この行を、ファイルの先頭または末尾から五行以内のどこかに書いてください。その
ファイルを開くと 'shiftwidth' が自動的に設定されます。他のファイルを開くと、初
期設定の 8 に戻ります。
モードラインをファイルヘッダーに書くのが適当な場合はファイルの先頭にモードライ
ンを書きます。テキストファイルなど、モードラインがその内容を邪魔してしまうよう
な場合は末尾に書きます。

'modelines' オプションでモードラインの有効範囲を設定できます。ファイルの先頭ま
たは末尾からの行数で指定してください。例えば、10 行にしたい場合は次のように設
定します: >

        :set modelines=10

モードライン機能を無効にするには 'modeline' オプションをオフに設定します。Unix
の root や MS-Windows の Administrator として作業する場合や、信用できないファ
イルを開く場合に設定してください: >

        :set nomodeline

モードラインは次の書式で書きます:

        any-text vim:set {option}={value} ... : any-text ~

モードラインの前後、"any-text" の部分はどんな文字列でも構いません。例えば上述
の例のように、/* と */ で囲んでコメントにすることができます。
Vim は " vim:" という部分を見てモードラインを認識します。直前に空白のある
"vim"、または行頭の "vim" だけが認識されます。つまり、例えば "gvim:" は機能し
ません。
二つのコロン (:) の間には ":set" コマンドを記述します。これは通常の ":set" コ
マンドと同じです。ただし、コロンの前にバックスラッシュ (\) を置く必要がありま
す (バックスラッシュがない場合はそれがモードラインの終端だと認識されます)。

例:

        // vim:set textwidth=72 dir=c\:\tmp:  use c:\tmp here ~

最初のコロンにはバックスラッシュが前置されているので、それは ":set" コマンドの
一部です。二つ目のコロン以降は無視されるので、説明を書くことができます。

詳細は modeline を参照してください。

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

次章: usr_22.txt ファイルを探す

Copyright: see manual-copyright  vim:tw=78:ts=8:noet:ft=help:norl: