while ("im the true Vim master");

2009-06-26

Re: vim 用 Template-Toolkit のシンタックスハイライト - daily dayflower

12:56

この autocmd をどこに書くかが問題ですが,~/.vimrc に書いてもたぶん大丈夫かなぁと思いますが,慣例的に ftdetect/ というディレクトリにスクリプトを置くみたい。

vim 用 Template-Toolkit のシンタックスハイライト - daily dayflower

ftdetect下に記述すべきです。同じ記述に見えますし同じように動作するように見えますが配置場所で細かい意味が全く変わってきます。


au BufNewFile,BufRead *.html setf tt2html
vim 用 Template-Toolkit のシンタックスハイライト - daily dayflower
autocmd FileType html  setlocal filetype=tt2html

拡張子ベースの判定はVim側に任せて、その結果を使う方がスマートです。


Vim のドキュメントを読む限り,同一のイベント・ファイル名に対して複数の autocmd を指定してもうまくいくはずなのですが,うまくいかなかったので autocmd! でもともと設定されている内容を消去してます。

vim 用 Template-Toolkit のシンタックスハイライト - daily dayflower

記述が間違っていただけでは。基本的に削除する必要はありません。何が削除されるのか完璧に把握していない限り:autocmd!の使用は避けた方が良いです。


Re: text editor - ほんとうの俺をはじめるために

10:04

その程度のことなら今時のまともなエディタならどれでもできますね。「境地」というのであればもっと核心をついてください。

dayflowerdayflower2009/06/28 11:10いろいろご指摘ありがとうございます。

複数 autocmd がうまくいかなかったのは,コメント欄でも指摘を受けたのですが,まさに記述が間違っていた(:setlocal filetype= の代わりに :setfiletype を使ってしまっていた)のでした。お恥ずかしい。

autocmd に FileType というイベントもあるんですね。見落としてました。
しかしご指摘のように,ftdetect/* で au FileType で :setlocal filetype= しても,シンタックスハイライトに反映されませんでした。
実際,:help syntax-loading によると,ファイルタイプからシンタックスへの反映は $VIMRUNTIME/syntax/syntax.vim の設定する FileType autocmd が行うのですが,これが
exe "set syntax=" . expand("<amatch>")
のようになっていて,<amatch> によってもともとの FileType 名の syntax になってしまうのです。しかも,挙動上こちらの au FileType のほうが後に実行されるので,:setlocal syntax= も効きません。

一応,au FileType で :syntax enable すると,(なぜか)syntax がきちんと読み込まれるのですが,これは(シンタックスハイライトを希望しないユーザには迷惑でしょうし)本質的な解ではない気がします。
このような状況での「定石」はどのようなものがあるのでしょうか?

ka-nachtka-nacht2009/06/28 11:26完璧に再現できる手順と設定を書いてください。私の環境では本文中にあるような設定をして問題なく'filetype'の上書きもシンタックスハイライトの反映も行なわれています。

ka-nachtka-nacht2009/06/28 12:13この設定と手順で確認しました。 http://gist.github.com/137190
$VIMRUNTIME/syntax/syntax.vimが<amatch>でなく&l:filetypeを使ってくれれば良さそうに見えますが、意図的に<amatch>を使っているはずなので、この件についてvim_devに投稿してもそのように修正されることはないでしょうね。
次善の解決策としてはシンタックスハイライトの設定より後にfiletypeの再設定を行なうようにします。例えばftdetect/*.vim相当のものを別の場所に作り(仮にmyftdetectとします)、vimrc中の:syntax enableより後の位置で:runtime! myftdetect/*.vimするなど。

ka-nachtka-nacht2009/06/28 12:14ただ不便なことには代わりありませんね。もう少し整理すれば上手く解決できそうなので、後でvim_devに投げておきます。

dayflowerdayflower2009/06/28 19:18お手数をお掛けしてしまいすみません。

こちらの環境の問題かもしれません。
一応こちらの環境と再現手順を書いておきます。

CentOS 5.3 添付の VIM 7.0.237
および Ubuntu 9.04 添付の VIM 7.2.79
いずれも ~/.vimrc なし(→システム添付の /etc/vimrc が読み込まれる)

~/.vim/ftdetect/test.vim に以下の1行のみ
autocmd FileType html setlocal filetype=vim

この状態で vim *.html とすると html なシンタックスハイライトとなる。
:setlocal で調べると,filetype=vim, syntax=html

これらの環境で ftdetect フェーズで autocmd FileType から filetype を設定するのは
向いていないのかもしれません。
autocmd BufRead * if &l:filetype == "html" | setlocal filetype=...
で逃げるか,ご指摘のようにより後のフェーズで読み込むようにしてみます。

トラックバック - http://vim.g.hatena.ne.jp/ka-nacht/20090626
最近のコメント
あわせて読みたいブログパーツ
AX