Usr_30

Nvim の :help ページは、生成されたもので、ソースtree-sitter-vimdoc パーサーを使用して作成されています。


VIM ユーザーマニュアル - Bram Moolenaar 著
プログラムの編集
Vimには、コンピュータープログラムの作成を支援するさまざまなコマンドがあります。プログラムをコンパイルし、報告されたエラーに直接ジャンプします。多くの言語でインデントを自動的に設定し、コメントをフォーマットします。
30.1 コンパイル 30.2 Cファイルのインデント 30.3 自動インデント 30.4 その他のインデント 30.5 タブとスペース 30.6 コメントのフォーマット
次の章: usr_31.txt GUIの活用 前の章: usr_29.txt プログラム内での移動 目次: usr_toc.txt

コンパイル

Vimには「クイックフィックス」と呼ばれる一連のコマンドがあります。これらのコマンドを使用すると、Vim内からプログラムをコンパイルし、生成されたエラーを調べて修正することができます。その後、再コンパイルして新しいエラーがあればそれを修正し、最終的にプログラムがエラーなしでコンパイルされるようにします。
次のコマンドは、プログラム「make」を実行し(指定した引数をすべて渡します)、結果をキャプチャします。
:make {arguments}
エラーが生成された場合、それらはキャプチャされ、エディターは最初のエラーが発生した場所に移動します。":make" のセッション例を見てみましょう。(一般的な :make セッションでは、はるかに多くのエラーが発生し、愚かなエラーは少なくなります。) ":make" と入力すると、画面は次のようになります。
:!make | &tee /tmp/vim215953.err
gcc -g -Wall -o prog main.c sub.c
main.c: 関数main内
main.c:6: 関数 'do_sub' への引数が多すぎます
main.c: トップレベル
main.c:10: '}' の前の構文エラー
make: *** [prog] エラー 1
2 が返されました
"main.c" 11L, 111C
(6のうち3): 関数 'do_sub' への引数が多すぎます
続行するにはEnterキーを押すか、コマンドを入力してください
これを見ると、ファイル「main.c」にエラーがあることがわかります。<Enter>キーを押すと、Vimはファイル「main.c」を表示し、カーソルはエラーのある最初の行である6行目に置かれます。ファイルや行番号を指定する必要はありませんでした。Vimはエラーメッセージを見てどこに行くべきかを知っていました。
          +---------------------------------------------------+
          |int main()                                            |
          |{                                                    |
          |        int i=3;                                    |
cursor -> |        do_sub("foo");                                    |
          |        ++i;                                            |
          |        return (0);                                    |
          |}                                                    |
          |}                                                    |
          | ~                                                    |
          |(3 of 12): too many arguments to function 'do_sub' |
          +---------------------------------------------------+
次のコマンドは、次のエラーが発生した場所に移動します。
:cnext
Vimは、ファイル内の最後の行である10行目にジャンプします。そこには余分な「}」があります。十分なスペースがない場合、Vimはエラーメッセージを短縮します。メッセージ全体を表示するには、次を使用します。
:cc
":clist" コマンドを使用すると、すべてのエラーメッセージの概要を取得できます。出力は次のようになります。
:clist
3 main.c: 6:関数 'do_sub' への引数が多すぎます
5 main.c: 10:'}' の前の構文エラー
ここでは、Vimがファイル名と行番号を認識した行のみがリストされています。Vimはそれらが興味深い行であり、残りは単に退屈なメッセージであると想定しています。ただし、認識されない行にも、見たいものが含まれている場合があります。たとえば、未定義の関数に関するリンカーからの出力です。すべてのメッセージを表示するには、コマンドに "!" を追加します。
:clist!
1 gcc -g -Wall -o prog main.c sub.c
2 main.c: 関数main内
3 main.c:6: 関数 'do_sub' への引数が多すぎます
4 main.c: トップレベル
5 main.c:10: '}' の前の構文エラー
6 make: *** [prog] エラー 1
Vimは現在のエラーを強調表示します。前のエラーに戻るには、次を使用します。
:cprevious
エラーリスト内を移動するためのその他のコマンド
:cfirst 最初のエラーへ :clast 最後のエラーへ :cc 3 3番目のエラーへ

別のコンパイラーの使用

":make" コマンドが実行されたときに実行されるプログラムの名前は、'makeprg' オプションで定義されます。通常、これは "make" に設定されていますが、Visual C++ ユーザーは、次のコマンドを実行してこれを "nmake" に設定する必要があります。
:set makeprg=nmake
このオプションに引数を含めることもできます。特殊文字はバックスラッシュでエスケープする必要があります。例:
:set makeprg=nmake\ -f\ project.mak
コマンド仕様に特別な Vim キーワードを含めることができます。% 文字は、現在のファイルの名前に展開されます。したがって、次のコマンドを実行する場合
:set makeprg=make\ %:S
main.c を編集している場合、":make" は次のコマンドを実行します。
make main.c
これはあまり便利ではないため、コマンドを少し調整し、:r (root) 修飾子を使用します。
:set makeprg=make\ %:r:S.o
これで、実行されるコマンドは次のようになります。
make main.o
これらの修飾子の詳細はこちら: ファイル名修飾子

古いエラーリスト

プログラムを ":make" するとします。1つのファイルに警告メッセージがあり、別のファイルにエラーメッセージがあります。エラーを修正し、":make" を再度使用して、それが本当に修正されたかどうかを確認します。ここで、警告メッセージを見たいとします。警告のあるファイルが再度コンパイルされなかったため、最後のエラーリストには表示されません。次のコマンドを使用して、前のエラーリストに戻ることができます。
:colder
次に、":clist" と ":cc {nr}" を使用して、警告のある場所にジャンプします。次のエラーリストに進むには
:cnewer
Vimは10個のエラーリストを記憶します。

コンパイラーの切り替え

コンパイラーが生成するエラーメッセージの形式を Vim に伝える必要があります。これは、'errorformat' オプションを使用して行います。このオプションの構文は非常に複雑で、ほとんどすべてのコンパイラーに適合させることができます。詳細については、こちらをご覧ください: errorformat
さまざまなコンパイラーを使用している可能性があります。'makeprg' オプション、特に 'errorformat' を毎回設定するのは簡単ではありません。Vimはこれに対する簡単な方法を提供しています。たとえば、Microsoft Visual C++ コンパイラーの使用に切り替えるには、次のようにします。
:compiler msvc
これにより、"msvc" コンパイラー用の Vim スクリプトが見つかり、適切なオプションが設定されます。独自のコンパイラーファイルを作成できます。 write-compiler-plugin を参照してください。

出力リダイレクト

":make" コマンドは、実行されたプログラムの出力をエラーファイルにリダイレクトします。これがどのように機能するかは、'shell' など、さまざまな要因によって異なります。":make" コマンドが出力をキャプチャしない場合は、'makeef' および 'shellpipe' オプションを確認してください。'shellquote' および 'shellxquote' オプションも関係する場合があります。
":make" でファイルがリダイレクトされない場合は、別のウィンドウでプログラムをコンパイルし、出力をファイルにリダイレクトするという代替手段があります。次に、Vimにこのファイルを読み込ませます。
:cfile {filename}
エラーへのジャンプは、":make" コマンドの場合と同じように機能します。

30.2 Cスタイルのテキストのインデント

行が適切にインデントされていると、プログラムははるかに理解しやすくなります。Vimは、この作業を軽減するためのさまざまな方法を提供します。JavaやC++のようなCまたはCスタイルのプログラムの場合、'cindent' オプションを設定します。VimはCプログラムについて多くのことを知っており、自動的にインデントを設定しようとします。'shiftwidth' オプションを、より深いレベルに必要なスペースの量に設定します。4つのスペースで問題ありません。1つの ":set" コマンドで実行できます。
:set cindent shiftwidth=4
このオプションが有効になっていると、"if (x)" などの入力をすると、次の行が自動的に1レベル深くインデントされます。
if (flag) 自動インデント ---> do_the_work(); 自動インデント解除 <-- if (other_flag) { 自動インデント ---> do_file(); インデントを維持 do_some_more(); 自動インデント解除 <-- }
中括弧 ({}) 内に入力すると、テキストは開始時にインデントされ、終了時にインデントが解除されます。Vimは入力しようとしているものを推測できないため、インデントの解除は「}」を入力した後に発生します。
自動インデントの副作用の1つは、コードのエラーを早期に発見するのに役立つことです。関数を終了するために } を入力したところ、自動インデントが予想よりも多くインデントしている場合は、おそらく } が欠落しています。"%" コマンドを使用して、入力した } に一致する { を見つけます。欠落している ) や ; も追加のインデントを引き起こします。したがって、予想よりも多くの空白がある場合は、前の行を確認してください。
フォーマットが悪いコードがある場合、または行を挿入および削除した場合、行を再インデントする必要があります。「=」演算子でこれを行います。最も単純な形式は
==
これは現在の行をインデントします。すべての演算子と同様に、3つの使用方法があります。ビジュアルモードでは、「=」は選択した行をインデントします。便利なテキストオブジェクトは「a{」です。これは、現在の {} ブロックを選択します。したがって、カーソルがあるコードブロックを再インデントするには
=a{
インデントが非常に悪いコードがある場合は、次のコマンドを使用してファイル全体を再インデントできます。
gg=G
ただし、手動で慎重にインデントされたファイルではこれを行わないでください。自動インデントは優れた処理をしますが、状況によってはそれをオーバーライドする必要がある場合があります。

インデントスタイルの設定

人によってインデントのスタイルは異なります。デフォルトでは、Vimはプログラマーの90%が行う方法でかなりうまくインデントします。ただし、異なるスタイルがあります。必要に応じて、'cinoptions' オプションを使用してインデントスタイルをカスタマイズできます。デフォルトでは、'cinoptions' は空で、Vimはデフォルトのスタイルを使用します。何か異なるものを指定したい場合は、さまざまな項目を追加できます。たとえば、次のように中括弧を配置する場合
if (flag)
{
i = 8;
j = 0;
}
このコマンドを使用します。
:set cinoptions+={2
これらの項目は多数あります。cinoptions-values を参照してください。

30.3 自動インデント

Cファイルを編集するたびに、手動で 'cindent' オプションをオンにしたいとは思いません。自動的に機能させる方法は次のとおりです。
:filetype indent on
実際、これはCファイルに対して 'cindent' をオンにするよりもはるかに多くのことを行います。まず、ファイルの種類の検出を有効にします。これは、構文強調表示に使用されるものと同じです。ファイルタイプがわかると、Vimはこのタイプのファイルのインデントファイルを検索します。Vimディストリビューションには、さまざまなプログラミング言語に対応するこれらのファイルが多数含まれています。このインデントファイルは、このファイル専用の自動インデントの準備をします。
自動インデントが気に入らない場合は、再度オフにすることができます。
:filetype indent off
特定のタイプのファイルのインデントが気に入らない場合は、これを回避する方法は次のとおりです。次の1行だけを含むファイルを作成します。
:let b:did_indent = 1
次に、これを特定の名前のファイルに書き込む必要があります。
{directory}/indent/{filetype}.vim
{filetype} は、"cpp" や "java" のようなファイルタイプの名前です。Vimが検出した正確な名前は、次のコマンドで確認できます。
:set filetype
このファイルでは、出力は次のようになります。
filetype=help
したがって、{filetype} には "help" を使用します。{directory} 部分には、ランタイムディレクトリを使用する必要があります。次のコマンドの出力を参照してください。
set runtimepath
次に、最初の商品、つまり最初のコンマの前にある名前を使用します。したがって、出力が次のようになっている場合
runtimepath=~/.config/nvim,/usr/local/share/vim/vim60/runtime,~/.config/nvim/after
{directory} には "~/.config/nvim" を使用します。その結果、ファイル名は次のようになります。
~/.config/nvim/indent/help.vim
インデントをオフにする代わりに、独自のインデントファイルを作成することもできます。その方法については、こちらで説明しています: indent-expression

30.4 その他のインデント

自動インデントの最も簡単な形式は、'autoindent' オプションを使用することです。これは、前の行のインデントを使用します。少し賢いのが、'smartindent' オプションです。これは、インデントファイルが利用できない言語で役立ちます。'smartindent''cindent' ほど賢くはありませんが、'autoindent' よりは賢いです。'smartindent' が設定されていると、{ ごとにインデントが1レベル追加され、} ごとに削除されます。'cinwords' オプションで指定された単語にも、インデントが1レベル追加されます。# で始まる行は特別に扱われ、すべてのインデントが削除されます。これは、プリプロセッサディレクティブがすべて1桁目から開始するようにするためです。インデントは次の行で復元されます。

インデントの修正

'autoindent' または 'smartindent' を使用して前の行のインデントを取得している場合、'shiftwidth' のインデントを追加または削除する必要がある場合が多くあります。これをすばやく行う方法は、挿入モードで CTRL-D および CTRL-T コマンドを使用することです。たとえば、次のように表示されるはずのシェルスクリプトを入力しているとします。
if test -n a; then
echo a
echo "-------"
fi
まず、これらのオプションを設定します。
:set autoindent shiftwidth=3
最初に、最初の行を入力し、<Enter> を入力して2番目の行の入力を開始します。
if test -n a; then
echo
ここで、追加のインデントが必要なことに気付きます。CTRL-T と入力します。結果は次のようになります。
if test -n a; then
echo
挿入モードの CTRL-T コマンドは、行のどこにいても、インデントに 'shiftwidth' を1つ追加します。2番目の行の入力を続け、<Enter> を入力して3番目の行を入力します。今回はインデントはOKです。次に、<Enter> を入力して最後の行を入力します。これで、次のようになります。
if test -n a; then
echo a
echo "-------"
fi
最後の行の余分なインデントを削除するには、CTRL-D を押します。これにより、行のどこにいても、'shiftwidth' のインデントが1つ削除されます。ノーマルモードでは、">>" および "<<" コマンドを使用して行をシフトできます。">" と "<" は演算子であるため、インデントする行を指定する通常の3つの方法があります。便利な組み合わせは次のとおりです。
>i{
これにより、{} 内の現在の行ブロックに1つのインデントが追加されます。{ および } の行自体は変更されません。">a{" にはそれらが含まれます。この例では、カーソルは "printf" にあります。
元のテキスト ">i{" 後 ">a{" 後
if (flag) if (flag) if (flag)
{ { {
printf("yes"); printf("yes"); printf("yes");
flag = 0; flag = 0; flag = 0;
} } }

30.5 タブとスペース

'tabstop' はデフォルトで8に設定されています。変更できますが、後で問題が発生する可能性があります。他のプログラムは、使用したタブストップの値を知りません。おそらくデフォルト値の8を使用しており、テキストが突然大きく異なって表示されます。また、ほとんどのプリンターは固定のタブストップ値の8を使用します。したがって、'tabstop' はそのままにしておくのが最善です。(異なるタブストップ設定で記述されたファイルを編集する場合は、25.3 を参照して、修正方法を確認してください。)プログラムで行をインデントする場合、8つのスペースの倍数を使用すると、ウィンドウの右端にすぐに到達してしまいます。単一のスペースを使用しても、視覚的な違いが十分に得られません。多くの人は、4つのスペースを使用することを好みます。これは良い妥協案です。<Tab> は8つのスペースであり、4つのスペースのインデントを使用したい場合は、インデントを作成するために <Tab> 文字を使用することはできません。これを処理するには2つの方法があります。
1. <Tab> とスペース文字の組み合わせを使用します。<Tab> は8つのスペースの代わりになるため、ファイル内の文字数が少なくなります。<Tab> を挿入する方が、8つのスペースを入力するよりも速いです。バックスペースも同様に高速に機能します。
2. スペースのみを使用します。これにより、異なるタブストップ値を使用するプログラムでのトラブルを回避できます。
幸いなことに、Vim はどちらの方法も非常にうまくサポートしています。

スペースとタブ

タブとスペースの組み合わせを使用している場合は、通常どおり編集するだけです。Vim のデフォルトでは、物事がうまく処理されます。'softtabstop' オプションを設定すると、少し簡単になります。このオプションは、<Tab> キーが 'softtabstop' の値に設定されたタブであるかのように感じられるようにしますが、実際にはタブとスペースの組み合わせを使用するように Vim に指示します。次のコマンドを実行すると、<Tab> キーを押すたびに、カーソルが次の4列の境界に移動します。
:set softtabstop=4
最初の列で開始して <Tab> を押すと、テキストに4つのスペースが挿入されます。2回目は、Vim が4つのスペースを取り除き、<Tab> を挿入します(これにより、8列目に移動します)。したがって、Vim はできるだけ多くの <Tab> を使用し、スペースで埋めます。バックスペースを使用する場合、逆方向に機能します。<BS> は常に 'softtabstop' で指定された量を削除します。次に、できるだけ多くの <Tab> が使用され、スペースがギャップを埋めます。以下は、<Tab> を数回押してから <BS> を使用した場合に何が起こるかを示しています。"." はスペースを表し、"------->" は <Tab> を表します。
タイプ 結果
<Tab> .... <Tab><Tab> -------> <Tab><Tab><Tab> ------->.... <Tab><Tab><Tab><BS> -------> <Tab><Tab><Tab><BS><BS> ....
別の方法は、'smarttab' オプションを使用することです。設定すると、Vim は行のインデントで入力された <Tab>'shiftwidth' を使用し、最初の空白以外の文字の後にタイプした場合は実際の <Tab> を使用します。ただし、<BS>'softtabstop' の場合のように機能しません。

スペースのみ

ファイルにタブをまったく含めたくない場合は、'expandtab' オプションを設定できます。
:set expandtab
このオプションを設定すると、<Tab> キーは一連のスペースを挿入します。したがって、<Tab> 文字が挿入された場合と同じ量の空白が得られますが、ファイルには実際の <Tab> 文字はありません。バックスペースキーは各スペースを個別に削除します。したがって、1つの <Tab> を入力した後、<BS> キーを最大8回押して元に戻す必要があります。インデントしている場合は、CTRL-D を押す方がはるかに速くなります。

タブをスペースに変更する(および元に戻す)

'expandtab' を設定しても、既存のタブには影響しません。つまり、ドキュメント内のタブはタブのままです。タブをスペースに変換する場合は、":retab" コマンドを使用します。これらのコマンドを使用します。
:set expandtab
:%retab
これで、Vim はすべてのインデントをタブではなくスペースを使用するように変更しました。ただし、空白以外の文字の後にあるすべてのタブは保持されます。これらも変換する場合は、! を追加します。
:%retab!
文字列内のタブも変更する可能性があるため、これは少し危険です。これらが存在するかどうかを確認するには、次のように使用できます。
/"[^"\t]*\t[^"]*"
文字列内ではハードタブを使用しないことをお勧めします。トラブルを避けるために、"\t" に置き換えてください。
逆も同様に機能します。
:set noexpandtab
:%retab!

30.6 コメントの書式設定

Vim の優れた点の1つは、コメントを理解することです。Vim にコメントの書式設定を要求すると、正しい処理が行われます。たとえば、次のコメントがあるとします。
/*
 * This is a test
 * of the text formatting.
 */
次に、カーソルをコメントの先頭に置いて、次のように入力して、Vim に書式設定を要求します。
gq]/
"gq" はテキストを書式設定する演算子です。"]/" は、コメントの末尾に移動するモーションです。結果は次のとおりです。
/*
 * This is a test of the text formatting.
 */
Vim が各行の先頭を適切に処理していることに注意してください。別の方法は、ビジュアルモードで書式設定するテキストを選択し、"gq" を入力することです。
コメントに新しい行を追加するには、カーソルを中央の行に置いて "o" を押します。結果は次のようになります。
/*
 * This is a test of the text formatting.
 *
 */
Vim は自動的にアスタリスクとスペースを挿入しました。これで、コメントテキストを入力できます。テキストが 'textwidth' より長くなると、Vim は行を分割します。ここでも、アスタリスクが自動的に挿入されます。
/*
 * This is a test of the text formatting.
 * Typing a lot of text here will make Vim
 * break
 */
これを機能させるには、'formatoptions' にいくつかのフラグが存在する必要があります。
r 挿入モードで <Enter> を入力したときにアスタリスクを挿入します o ノーマルモードで "o" または "O" を使用したときにアスタリスクを挿入します c 'textwidth' に従ってコメントテキストを分割します。
その他のフラグについては、fo-table を参照してください。
コメントの定義
'comments' オプションは、コメントの外観を定義します。Vim は、単一行コメントと、開始、終了、および中間部分が異なるコメントを区別します。多くの単一行コメントは、特定の文字で始まります。C++ では // が使用され、Makefile では #、Vim スクリプトでは "." が使用されます。たとえば、Vim に C++ コメントを理解させるには、次のようにします。
:set comments=://
コロンは、項目のフラグをコメントを認識するテキストから区切ります。'comments' の項目の一般的な形式は次のとおりです。
{フラグ}:{テキスト}
この場合のように、{フラグ} の部分は空にできます。これらの項目のいくつかを、カンマで区切って連結できます。これにより、異なるタイプのコメントを同時に認識できます。たとえば、メールメッセージを編集しましょう。返信するとき、他の人が書いたテキストには ">" および "!" 文字が前に付いています。このコマンドは機能します。
:set comments=n:>,n:!
2つの項目があり、1つは ">" で始まるコメント用、もう1つは "!" で始まるコメント用です。どちらもフラグ "n" を使用します。これは、これらのコメントがネストすることを意味します。したがって、">" で始まる行には、">" の後に別のコメントがある場合があります。これにより、次のようなメッセージを書式設定できます。
> ! あのサイト見た?
> ! すごくいいね。
> 私は好きじゃない。色の
> 色がひどい。
そのサイトのURLは何ですか?
サイト?
’textwidth’を、例えば80などの別の値に設定し、テキストをビジュアル選択して「gq」と入力してテキストを整形してみてください。結果は以下のようになります。
> ! あのサイト見た?すごくいいね。
> 私は好きじゃない。色がひどい。
そのサイトのURLは何ですか?
Vimが、コメントの種類をまたいでテキストを移動しなかったことに気づくでしょう。2行目の「I」は1行目の末尾に収まったはずですが、1行目が「> !」で始まり、2行目が「>」で始まっているため、Vimはこれが異なる種類のコメントであると認識します。
3つの部分からなるコメント
C言語のコメントは、「/*」で始まり、真ん中に「*」があり、「*/」で終わります。この’comments’エントリは以下のようになります。
:set comments=s1:/*,mb:*,ex:*/
開始部分は「s1:/*」で定義されています。「s」は3つの部分からなるコメントの開始を示します。コロンは、コメントが認識されるテキスト「/*」とフラグを分離します。フラグは1つあります。「1」です。これは、Vimに中間部分が1つのスペースのオフセットを持つことを伝えます。中間部分「mb:*」は「m」で始まり、これは中間部分であることを示します。「b」フラグは、テキストの後に空白が必要であることを意味します。そうしないと、Vimは「*pointer」のようなテキストもコメントの中間部分と見なします。終了部分「ex:*/」は識別するために「e」を持ちます。「x」フラグは特別な意味を持ちます。Vimが自動的にアスタリスクを挿入した後、/を入力すると、余分なスペースが削除されることを意味します。
詳細については、format-commentsを参照してください。
次の章:usr_31.txt GUIの活用
著作権:manual-copyrightを参照してください vim:tw=78:ts=8:noet:ft=help:norl
メイン
コマンド索引
クイックリファレンス