Next: usr_44.txt, Previous: usr_42.txt, Up: 目次 [Index]
*usr_43.txt* For Vim バージョン 8.1. Last change: 2015 Oct 23 VIM USER MANUAL - by Bram Moolenaar ファイルタイプを使ふ
C プログラムやシェルスクリプトなどの特定の種類のファイルを編輯するときに、よく使ふオプション設定やマップがあると思ひます。それを每囘手作業で設定するのは面倒ですよね。この章ではそれを自動化する方法を說明します。
|43.1| | ファイルタイププラグイン |
|43.2| | ファイルタイプを追加する |
ファイルタイププラグインの使用方法については既に |add-filetype-plugin| で說明しました。しかし、標準では最小限の設定しかされないので、それだけでは物足りないと思ひます。例へば C ファイルを開いたときに、’softtabstop’ オプションを 4 に設定したり、3 行コメントを插入するためのマップを定義したりすると便利かもしれません。2 ステップで設定できます。
mkdir ~/.vim mkdir ~/.vim/ftplugin
Unix 以外のシステムでは、’runtimepath’ オプションを見て、"ftplugin" ディレクトリが檢索される場所を確認してください:
set runtimepath
普通は最初のディレクトリ (最初のコンマの前) を使ひます。初期設定以外のディレクトリを使ひたい場合は、|vimrc| ファイルの中で ’runtimepath’ オプションを設定してディレクトリを追加してください。
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| を參照してください。
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 で定義された自動コマンドによつて讀み込まれます。そのため、次の順番でチェックが實行されます:
$VIMRUNTIME
の前にある filetype.vim
$VIMRUNTIME
/filetype.vim の前半部分
$VIMRUNTIME
/filetype.vim の後半部分
$VIMRUNTIME
の後にある filetype.vim
もつと複雜なことがしたい場合は、すべてのファイルにマッチする自動コマンドを追加して、スクリプトを讀み込むなり函數を實行するなりしてファイルの內容をチェックしてください。
Next: usr_44.txt, Previous: usr_42.txt, Up: 目次 [Index]