vim-jp / vimdoc-ja / usr_43

usr_43 - Vimドキュメント

メインヘルプファイルに戻る
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" ディレクトリを作成します:

        mkdir ~/.vim
        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"

そして、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

ファイル名が ".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

しかし、/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

このファイルは 'runtimepath' の最初に見つかります。そして、最後に見つかるファ
イル "~/.vim/after/filetype.vim" の中で次の設定をします:

        augroup filetypedetect
        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

最初に 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:
関連キーワード:  usr, 設定, filetype, コマンド, setf, 自動, タイプ, Vim, runtimepath, scripts