2011-03-03 69 views
11

我試圖讓Vim在語法高亮與擴展.Rtex通過以下方式結尾的任何文件:麻煩SYN-包括且同區域嵌入語法高亮

  • 所有頂級文本高亮作爲TeX的
  • 例外:封閉在\begin{python}...\end{python}任何文本被高亮像Python

我能夠獨立實現所有這些標準,但無法同時實現。我認爲TeX突出顯示覆蓋了我的Python突出顯示的區域,或者阻止它們生效,並且我試圖弄清楚如何實現。

第一步:編輯.vimrc給文件擴展名爲.Rtex文件類型rtex

au BufRead *.Rtex setf rtex 

第二步:創建~/.vim/syntax/rtex.vim。這個文件的內容將決定如何突出.Rtex文件。

第三步:能通用頂級的TeX高亮顯示,通過使rtex.vim這個樣子的:

runtime! syntax/tex.vim 

如果我現在打開一個.Rtex文件,整個文件被高亮顯示爲TeX,包括任何文字如預期的那樣在\begin{python}...\end{python}之內。

第四步:按照Vim的:help syn-include的說明,包括Python高亮,它適用於\begin{python}\end{python}分隔的所有地區。我rtex.vim文件現在看起來是這樣的:

runtime! syntax/tex.vim 
unlet! b:current_syntax 
syntax include @Python syntax/python.vim 
syntax region pythonCode start="\\begin{python}" end="\\end{python}" [email protected] 

unlet! b:current_syntax命令是爲了迫使python.vim語法文件來執行,即使現有的語法(特)已經被激活。

問題:如果我現在打開一個.Rtex文件,整個文件仍然只會高亮顯示爲TeX。 \begin{python}...\end{python}區域似乎沒有效果。

實驗:如果我刪除或註釋掉runtime!命令,我 GET蟒蛇高亮,在\begin{python}...\end{python}區域內,正如所期望的,但當然沒的TeX的文檔的其餘部分突出。因此,我得出結論說,TeX突出顯示對防止蟒蛇地區發揮作用負有某種責任。

Vim的Master可以給我提供什麼建議嗎?我目前很難過。我已經看了幾頁,似乎有關問題的計算器,但他們都沒有到目前爲止導致了一個解決方案:

回答

14

經過對手冊的更多研究,以及更多的試驗和錯誤,我終於回答了我自己的問題(一個同時令人尷尬和崇高的成就),我現在在這裏爲後代保存。

基本上,我認爲這個問題是因爲pythonCode區域本身是包含在由tex.vim限定的區域或高亮組的Python高亮不會生效,所以還不是頂級。解決方案也是include(而不僅僅是runtimetex.vim,給它一個名稱,如@TeX,然後將[email protected]添加到我的python區域定義中。所以syntax/rtex.vim現在看起來像這樣:

let b:current_syntax = '' 
unlet b:current_syntax 
runtime! syntax/tex.vim 

let b:current_syntax = '' 
unlet b:current_syntax 
syntax include @TeX syntax/tex.vim 

let b:current_syntax = '' 
unlet b:current_syntax 
syntax include @Python syntax/python.vim 
syntax region pythonCode matchgroup=Snip start="\\begin{python}" end="\\end{python}" [email protected] [email protected] 

hi link Snip SpecialComment 
let b:current_syntax = 'rtex' 

而且這個工程!我不確定是否所有這些unlet b:current_syntax命令都是必需的。我還給python區域分隔符指定了一個匹配組(Snip),以便它們可以高亮顯示(顏色爲SpecialComment),而不是簡單地留下,這顯然是默認情況下發生的情況,因爲它們不再被視爲TeX的一部分。

現在爲不同語言添加更多高亮區域(例如,\begin{Scode}...\end{Scode})是一件微不足道的事情,如果您正在進行文學編程 - 這是我的問題的最初動機,那麼這非常棒。

編輯:這裏是展示它如何與嵌入的TeX文件在Python和R的代碼截圖: Screenshot: Python and R embedded in TeX

+0

這是否導致LaTex編譯時錯誤,因爲'\ begin {Python}'是未知的? – puk 2012-02-02 21:04:54

+1

不要注意定義'python'環境的'\ usepackage {python}'。 – 2012-02-04 02:22:06

+0

如果我想使用基於'\ begin {Puk'sSuperAmazingLanguage}'的語法怎麼辦? = P – puk 2012-02-04 16:11:08

0

我不知道它是否有幫助,但我用我的Rnw文件同時使用tex和rnoweb功能的破解如下:

au BufEnter *.Rnw set filetype=tex | set filetype=rnoweb 

將改編版本在你的情況下工作嗎?

+0

對,所以,讓這兩個文件類型的文件,導致雙方熒光筆到處申請 - 只有部分解決方案,因爲我只想在特定區域內突出顯示python。不過,我不知道你可以使用這樣的管道(而不是'set filetype = tex.rnoweb'),所以謝謝! – 2011-03-03 15:14:15

+0

這個管道與使用點符號如'setfiletype = js.php'有什麼不同? – puk 2012-02-05 18:28:54