usr_43.txt For Vim バージョン 8.2. Last change: 2015 Oct 23
VIM USER MANUAL - by Bram Moolenaar
ファイルタイプを使う
C プログラムやシェルスクリプトなどの特定の種類のファイルを編集するときに、よく
使うオプション設定やマップがあると思います。それを毎回手作業で設定するのは面倒
ですよね。この章ではそれを自動化する方法を説明します。
43.1 ファイルタイププラグイン
43.2 ファイルタイプを追加する
次章: usr_44.txt 構文ファイルを作成する
前章: usr_42.txt 新しいメニューを追加する
目次: usr_toc.txt
==============================================================================
43.1 ファイルタイププラグイン filetype-plugin
ファイルタイププラグインの使用方法については既に add-filetype-plugin で説明
しました。しかし、標準では最小限の設定しかされないので、それだけでは物足りない
と思います。例えば C ファイルを開いたときに、'softtabstop' オプションを 4 に設
定したり、三行コメントを挿入するためのマップを定義したりすると便利かもしれませ
ん。2 ステップで設定できます。
your-runtime-dir
1. 自分のランタイムディレクトリを作成する。Unix なら普通は "~/.vim" です。その
ディレクトリの中に "ftplugin" ディレクトリを作成します:
Unix 以外のシステムでは、'runtimepath' オプションを見て、"ftplugin" ディレ
クトリが検索される場所を確認してください:
普通は最初のディレクトリ (最初のコンマの前) を使います。初期設定以外のディ
レクトリを使いたい場合は、vimrc ファイルの中で 'runtimepath' オプションを
設定してディレクトリを追加してください。
2. "~/.vim/ftplugin/c.vim" を作成して設定を書きます:
そして、C ファイルを開いてみてください。'softtabstop' オプションが 4 に設定さ
れていますね。しかし、他のファイルを開くと初期設定の 0 にリセットされます。そ
れは ":setlocal" コマンドが使われているからです。このコマンドはバッファの
'softtabstop' オプションだけを設定します。他のバッファを開くと、開いたバッファ
用の設定が使用されます。新しいバッファの設定には、初期設定、または最後に
":set" コマンドで設定された値が使われます。
同様に、"\c" マップも他のバッファを開くと見えなくなります。":map <buffer>" コ
マンドを使うと、カレントバッファの中だけで使えるマップを作成できます。これは
":map!" や ":vmap" などの他のマップコマンドでも同様です。マップの中の
<LocalLeader> は "maplocalleader" 変数の値で置き換えられます。
b:undo_ftplugin を設定する行はファイルタイプを別の値に設定されていたときのため
に用います。このケースではあなたが望む方法でundoしたいでしょう。
b:undo_ftplugin 変数はコマンドとして実行されます。そのため中の文字は、バック
スラッシュのように特別な意味を持つものがあるので、気をつけてください。
ファイルタイププラグインの例はこのディレクトリで探すことができます:
ファイルタイププラグインの作成方法の詳細は write-plugin を参照してください。
==============================================================================
43.2 ファイルタイプを追加する
Vim がファイルタイプを認識しない場合は、設定を追加してください。まず自分用のラ
ンタイムディレクトリを用意する必要があります。上述の your-runtime-dir を参照
してください。
"filetype.vim" というファイルを作成してファイルタイプ用の自動コマンドを設定し
ます。(自動コマンドは 40.3 で説明されています。) 例:
ファイル名が ".xyz" で終わるすべてのファイルが "xyz" ファイルタイプとして認識
されるようになります。":augroup" コマンドを使って自動コマンドを
"filetypedetect" グループに置いています。こうすることで、ファイルタイプを認識
するための自動コマンドを ":filetype off" で削除できるようになります。"setf" コ
マンドは 'filetype' を指定されたタイプに設定します。ただし、設定済みの場合は変
更しません。これによってファイルタイプが二重に設定されないようになっています。
ファイル名にマッチするパターンはいろいろなものが使えます。ディレクトリ名を含め
ることもできます。autocmd-patterns 参照。例えば、"/usr/share/scripts" にある
ファイルが拡張子に関係なくすべて "ruby" ファイルであるなら、次のような設定を追
加します:
しかし、/usr/share/scripts/README.txt を開いたとき、それは ruby ファイルではあ
りえませんよね。"*" で終わるパターンの問題は、多くのファイルにマッチしすぎてし
まうことです。この問題を避けるには、'runtimepath' の最後に指定されたディレクト
リに "filetype.vim" を置きます。例えば Unix なら "~/.vim/after/filetype.vim"
などです。
では、~/.vim/filetype.vim にテキストファイルの検出を設定します:
このファイルは 'runtimepath' の最初に見つかります。そして、最後に見つかるファ
イル "~/.vim/after/filetype.vim" の中で次の設定をします:
処理の流れは次のようになります。Vim は 'runtimepath' の各ディレクトリから
"filetype.vim" を探します。最初に "~/.vim/filetype.vim" が見つかります。*.txt
を処理する自動コマンドがここで定義されます。次に Vim は $VIMRUNTIME にある
filetype.vim を見つけます ($VIMRUNTIME は 'runtimepath' の中程にあります)。最
後に ~/.vim/after/filetype.vim が見つかり、/usr/share/scripts の ruby ファイル
を認識するための自動コマンドが追加されます。
/usr/share/scripts/README.txt を開くと、定義された順番で自動コマンドがチェック
されます。*.txt というパターンがマッチするので、"setf text" が実行され、ファイ
ルタイプが "text" に設定されます。ruby 用のパターンもマッチするので、"setf
ruby" が実行されます。しかし、'filetype' は既に設定されているので何も起こりま
せん。
/usr/share/scripts/foobar を開くと、同様に自動コマンドがチェックされます。ruby
のパターンだけがマッチするので、"setf ruby" が実行され、'filetype' が ruby に
設定されます。
内容を見て判断する
------------------
ファイル名からはファイル種別を判断できなくても、内容で判断できる場合がありま
す。例えば、多くのスクリプトファイルは次のような行で始まります:
#!/bin/xyz
このスクリプトを認識するには、"scripts.vim" というファイルをランタイムディレク
トリに作ります (filetype.vim と同じ場所です)。中身は次のようになります:
最初に did_filetype() を使って、既にファイル名からファイルタイプが認識されてい
るかどうかを確認し、不要ならファイル内容のチェックを実行しないようにします。こ
れは、"setf" コマンドが意味をなさないときに、ファイルのチェックによって時間を
無駄に消費しないためです。
scripts.vim は標準ファイルの filetype.vim で定義された自動コマンドによって読み
込まれます。そのため、次の順番でチェックが実行されます:
1. 'runtimepath' の $VIMRUNTIME の前にある filetype.vim
2. $VIMRUNTIME/filetype.vim の前半部分
3. 'runtimepath' のすべての scripts.vim
4. $VIMRUNTIME/filetype.vim の後半部分
5. 'runtimepath' の $VIMRUNTIME の後にある filetype.vim
もっと複雑なことがしたい場合は、すべてのファイルにマッチする自動コマンドを追加
して、スクリプトを読み込むなり関数を実行するなりしてファイルの内容をチェックし
てください。
==============================================================================
次章: usr_44.txt 構文ファイルを作成する
Copyright: see manual-copyright vim:tw=78:ts=8:noet:ft=help:norl:
VIM USER MANUAL - by Bram Moolenaar
ファイルタイプを使う
C プログラムやシェルスクリプトなどの特定の種類のファイルを編集するときに、よく
使うオプション設定やマップがあると思います。それを毎回手作業で設定するのは面倒
ですよね。この章ではそれを自動化する方法を説明します。
43.1 ファイルタイププラグイン
43.2 ファイルタイプを追加する
次章: usr_44.txt 構文ファイルを作成する
前章: usr_42.txt 新しいメニューを追加する
目次: usr_toc.txt
==============================================================================
43.1 ファイルタイププラグイン filetype-plugin
ファイルタイププラグインの使用方法については既に add-filetype-plugin で説明
しました。しかし、標準では最小限の設定しかされないので、それだけでは物足りない
と思います。例えば C ファイルを開いたときに、'softtabstop' オプションを 4 に設
定したり、三行コメントを挿入するためのマップを定義したりすると便利かもしれませ
ん。2 ステップで設定できます。
your-runtime-dir
1. 自分のランタイムディレクトリを作成する。Unix なら普通は "~/.vim" です。その
ディレクトリの中に "ftplugin" ディレクトリを作成します:
mkdir ~/.vim
mkdir ~/.vim/ftplugin
mkdir ~/.vim/ftplugin
Unix 以外のシステムでは、'runtimepath' オプションを見て、"ftplugin" ディレ
クトリが検索される場所を確認してください:
set runtimepath
普通は最初のディレクトリ (最初のコンマの前) を使います。初期設定以外のディ
レクトリを使いたい場合は、vimrc ファイルの中で 'runtimepath' オプションを
設定してディレクトリを追加してください。
2. "~/.vim/ftplugin/c.vim" を作成して設定を書きます:
setlocal softtabstop=4
noremap <buffer> <LocalLeader>c o/**************<CR><CR>/<Esc>
let b:undo_ftplugin = "setl softtabstop< | unmap <buffer> <LocalLeader>c"
noremap <buffer> <LocalLeader>c o/**************<CR><CR>/<Esc>
let b:undo_ftplugin = "setl softtabstop< | unmap <buffer> <LocalLeader>c"
そして、C ファイルを開いてみてください。'softtabstop' オプションが 4 に設定さ
れていますね。しかし、他のファイルを開くと初期設定の 0 にリセットされます。そ
れは ":setlocal" コマンドが使われているからです。このコマンドはバッファの
'softtabstop' オプションだけを設定します。他のバッファを開くと、開いたバッファ
用の設定が使用されます。新しいバッファの設定には、初期設定、または最後に
":set" コマンドで設定された値が使われます。
同様に、"\c" マップも他のバッファを開くと見えなくなります。":map <buffer>" コ
マンドを使うと、カレントバッファの中だけで使えるマップを作成できます。これは
":map!" や ":vmap" などの他のマップコマンドでも同様です。マップの中の
<LocalLeader> は "maplocalleader" 変数の値で置き換えられます。
b:undo_ftplugin を設定する行はファイルタイプを別の値に設定されていたときのため
に用います。このケースではあなたが望む方法でundoしたいでしょう。
b:undo_ftplugin 変数はコマンドとして実行されます。そのため中の文字は、バック
スラッシュのように特別な意味を持つものがあるので、気をつけてください。
ファイルタイププラグインの例はこのディレクトリで探すことができます:
$VIMRUNTIME/ftplugin/
ファイルタイププラグインの作成方法の詳細は write-plugin を参照してください。
==============================================================================
43.2 ファイルタイプを追加する
Vim がファイルタイプを認識しない場合は、設定を追加してください。まず自分用のラ
ンタイムディレクトリを用意する必要があります。上述の your-runtime-dir を参照
してください。
"filetype.vim" というファイルを作成してファイルタイプ用の自動コマンドを設定し
ます。(自動コマンドは 40.3 で説明されています。) 例:
augroup filetypedetect
au BufNewFile,BufRead *.xyz setf xyz
augroup END
au BufNewFile,BufRead *.xyz setf xyz
augroup END
ファイル名が ".xyz" で終わるすべてのファイルが "xyz" ファイルタイプとして認識
されるようになります。":augroup" コマンドを使って自動コマンドを
"filetypedetect" グループに置いています。こうすることで、ファイルタイプを認識
するための自動コマンドを ":filetype off" で削除できるようになります。"setf" コ
マンドは 'filetype' を指定されたタイプに設定します。ただし、設定済みの場合は変
更しません。これによってファイルタイプが二重に設定されないようになっています。
ファイル名にマッチするパターンはいろいろなものが使えます。ディレクトリ名を含め
ることもできます。autocmd-patterns 参照。例えば、"/usr/share/scripts" にある
ファイルが拡張子に関係なくすべて "ruby" ファイルであるなら、次のような設定を追
加します:
augroup filetypedetect
au BufNewFile,BufRead *.xyz setf xyz
au BufNewFile,BufRead /usr/share/scripts/* setf ruby
augroup END
au BufNewFile,BufRead *.xyz setf xyz
au BufNewFile,BufRead /usr/share/scripts/* setf ruby
augroup END
しかし、/usr/share/scripts/README.txt を開いたとき、それは ruby ファイルではあ
りえませんよね。"*" で終わるパターンの問題は、多くのファイルにマッチしすぎてし
まうことです。この問題を避けるには、'runtimepath' の最後に指定されたディレクト
リに "filetype.vim" を置きます。例えば Unix なら "~/.vim/after/filetype.vim"
などです。
では、~/.vim/filetype.vim にテキストファイルの検出を設定します:
augroup filetypedetect
au BufNewFile,BufRead *.txt setf text
augroup END
au BufNewFile,BufRead *.txt setf text
augroup END
このファイルは 'runtimepath' の最初に見つかります。そして、最後に見つかるファ
イル "~/.vim/after/filetype.vim" の中で次の設定をします:
augroup filetypedetect
au BufNewFile,BufRead /usr/share/scripts/* setf ruby
augroup END
au BufNewFile,BufRead /usr/share/scripts/* setf ruby
augroup END
処理の流れは次のようになります。Vim は 'runtimepath' の各ディレクトリから
"filetype.vim" を探します。最初に "~/.vim/filetype.vim" が見つかります。*.txt
を処理する自動コマンドがここで定義されます。次に Vim は $VIMRUNTIME にある
filetype.vim を見つけます ($VIMRUNTIME は 'runtimepath' の中程にあります)。最
後に ~/.vim/after/filetype.vim が見つかり、/usr/share/scripts の ruby ファイル
を認識するための自動コマンドが追加されます。
/usr/share/scripts/README.txt を開くと、定義された順番で自動コマンドがチェック
されます。*.txt というパターンがマッチするので、"setf text" が実行され、ファイ
ルタイプが "text" に設定されます。ruby 用のパターンもマッチするので、"setf
ruby" が実行されます。しかし、'filetype' は既に設定されているので何も起こりま
せん。
/usr/share/scripts/foobar を開くと、同様に自動コマンドがチェックされます。ruby
のパターンだけがマッチするので、"setf ruby" が実行され、'filetype' が ruby に
設定されます。
内容を見て判断する
------------------
ファイル名からはファイル種別を判断できなくても、内容で判断できる場合がありま
す。例えば、多くのスクリプトファイルは次のような行で始まります:
#!/bin/xyz
このスクリプトを認識するには、"scripts.vim" というファイルをランタイムディレク
トリに作ります (filetype.vim と同じ場所です)。中身は次のようになります:
if did_filetype()
finish
endif
if getline(1) =~ '^#!.*[/\\]xyz\>'
setf xyz
endif
finish
endif
if getline(1) =~ '^#!.*[/\\]xyz\>'
setf xyz
endif
最初に did_filetype() を使って、既にファイル名からファイルタイプが認識されてい
るかどうかを確認し、不要ならファイル内容のチェックを実行しないようにします。こ
れは、"setf" コマンドが意味をなさないときに、ファイルのチェックによって時間を
無駄に消費しないためです。
scripts.vim は標準ファイルの filetype.vim で定義された自動コマンドによって読み
込まれます。そのため、次の順番でチェックが実行されます:
1. 'runtimepath' の $VIMRUNTIME の前にある filetype.vim
2. $VIMRUNTIME/filetype.vim の前半部分
3. 'runtimepath' のすべての scripts.vim
4. $VIMRUNTIME/filetype.vim の後半部分
5. 'runtimepath' の $VIMRUNTIME の後にある filetype.vim
もっと複雑なことがしたい場合は、すべてのファイルにマッチする自動コマンドを追加
して、スクリプトを読み込むなり関数を実行するなりしてファイルの内容をチェックし
てください。
==============================================================================
次章: usr_44.txt 構文ファイルを作成する
Copyright: see manual-copyright vim:tw=78:ts=8:noet:ft=help:norl: