2013-04-15 23 views
1

針對this question上的超級用戶,我寫了一個小的Vimscript將檢測的符號鏈接的文件類型,並更改語法高亮:.vimrc如何設置自己的文件類型?

AU BufNewFile,BufRead *等,如果&語法==「」 |無聲!執行(':set filetype ='。matchstr(resolve(@%),'。[^。] * $')[1:])| endif

所以如果我打開一個沒有擴展名的符號鏈接,它會查看它指向的文件的擴展名。

它可以工作,但意想不到的結果是現在我的.vimrc文件的語法突出顯示消失了。默認情況下,我的.vimrc文件具有vim語法高亮顯示(:echo &syntax返回vim)。

但是,當我添加上面的行,:echo &syntax返回vimrc(一個無效的類型)。

我不知道爲什麼會發生這種情況。不應該&syntax==''評估爲假,並因此保持&syntax==vim?我懷疑我的代碼在語法突出顯示設置爲vim之前正在執行。但是如何(以及何時)完全是語法高亮設置爲vim.vimrc?另外,如何讓我的腳本按照它應該的方式行事?

回答

1

在Vim的運行區查找filetype.vim。你可以把它在vim:

:e $VIMRUNTIME/filetype.vim 

在我的版本,它看起來像這行做的伎倆:

" Vim script 
au BufNewFile,BufRead *vimrc*   call s:StarSetf('vim') 

也許你想要把你autocmd~/.vim/after/filetype.vim。我相信這會導致它在系統註冊後被註冊,然後&syntax應該被正確設置。

+1

我只是回答你的問題 - 如何設置.vimrc的文件類型。如果這不是你的問題,那麼你可能應該編輯它或者重新引用它。我懷疑你的autocmd首先運行,所以是的,語法是零。 – jszakmeister

+0

啊,對不起,我誤解了 - 這確實回答了我的問題的第一部分。 – Jeff

+0

我更新了我的答案。我認爲你需要把你的autocmd放在'〜/ .vim/after/filetype.vim'中,所以它會在Vim運行時之後被調用。 – jszakmeister

0

如果當前文件是~/.vimrc,你的這部分代碼

matchstr(resolve(@%),'.[^.]*$') 

返回文件名:.vimrc

我不知道你怎麼能想象得到/home/username/.vimrc會產生vim

對於您嘗試解決的問題而言,這顯然是一種不好的方法,但沒有任何錯誤:您完全明白您的要求。使用文件類型的文件名/擴展名無法可靠地工作(js vs javascript,py vs python ...)。

如果你想要你的代碼做你想做的事,你可能需要一個文件名/文件類型列表或許多if/elseif

請參閱:h syntax-loading

+0

我認爲你誤解了我的問題。 *沒有*我的.vimrc中的那一行,'&語法== vim'。所以,當我*添加*行到我的.vimrc,爲什麼語法改爲'vimrc'?從'&syntax == vim'開始,'if&syntax =='''不應該評估爲零? – Jeff

+1

@Jeff,因爲你告訴它它會更改爲'vimrc'。你的問題的答案是':h語法加載'(這個指針在我的答案中):''語法'在'BufReadPost'上設置,但是你的自動命令在'BufRead'之前觸發。在那個時候,'syntax'沒有被設置。 – romainl

1

jszakmeister's answer準確診斷問題:filetype.vim設置vimrc的文件類型。

另一種解決方案,雖然,以保持包含在你的.vimrc文件的一切,就是用:

AU BufNewFile,BufReadPre *如果&語法== '' |無聲!執行(':set filetype ='。matchstr(resolve(@%),'。[^。] * $')[1:])| ENDIF

注意從的BufReadBufReadPre的變化。該更改導致此行在 filetype.vim之前執行。語法將更改爲vimrc,但隨後更改爲vim。結果是腳本正常工作,但vimrc的語法突出顯示被保留。