2015-11-05 177 views
4

我希望在我的Python文檔中看到一些很好的語法突出顯示和着色(當然是有效的RESt)。例如:在Python文檔中嵌入reStructuredText文檔

''' 
A section 
========= 

an example:: 

    some code 
''' 
rest of python code 

我得到的最接近是這在我.vim/after/syntax/python.vim

syn include syntax/rst.vim 
syn region pythonDocstring start=+^\s*'''+ end=+'''+ contained 

根據the documentation of syntax-include應該足以。還要注意的是rst.vim重新定義了一堆蟒蛇實體所以我不得不註釋掉相關代碼的所有部分:

" syn region rstCodeBlock contained matchgroup=rstDirective 
"  \ start=+\%(sourcecode\|code\%(-block\)\=\)::\_s*\n\ze\z(\s\+\)+ 
"  \ skip=+^$+ 
"  \ end=+^\z1\@!+ 
"  \ [email protected] 
" syn cluster rstDirectives add=rstCodeBlock 

" if !exists('g:rst_syntax_code_list') 
[...] 

最後,我不能使用!runtime因爲rst.vim什麼也不做,如果b:current_syntax變量已經定義:

if exists("b:current_syntax") 
    finish 
endif 

儘管我努力,我的文檔字符串保持顏色相同的其他意見,沒有語法高亮。

我試過也是這個:

syn region pythonDocstring start=+^\s*'''+ end=+'''+ contains=CONTAINED 

但我只設法改變塊的顏色是Special而非Comment

也許我應該定義pythonDocstring不要有任何默認的着色?

進一步注意:如果我在python.vim中刪除了對python原始字符串的引用,着色就消失了,但我只獲得突出顯示的python關鍵字。


更新

嘗試下面我後/語法/ python.vim文件的解決方案之一:

syn include @pythonRst syntax/rst.vim 
syn region pythonDocstring start=+^\s*'''+ end=+'''+ [email protected] 

在其餘的文件,導致與.py打開文件時被變灰擴展名:

python syntax

同時打開與.rst相同的文件。擴展似乎做工精細(只是爲了顯示我有一個休息的語法文件):

rest syntax

請注意,我既沒有colorscheme在我的.vimrc

回答

3

因爲其他語法嘗試應該只應用裏面的 Python文檔字符串,您必須將它們包括到語法集羣中(這裏:@pythonRst)。否則,Vim會嘗試在任何地方匹配它們。

syn include @pythonRst syntax/rst.vim 

然後,定義涵蓋那些文檔字符串的區域,並明確指示Vim高亮的reST語法在那裏(通過contains=

syn region pythonDocstring start=+^\s*'''+ end=+'''+ [email protected] 
+0

我已經試過了,但它似乎並沒有這樣的伎倆。我會張貼幾張照片作爲更新。 – lorenzog

2

我終於成功地破解它。

首先我複製從$ VIMRUNTIME /語法rst.vim文件到我的.vim/syntax/文件夾

其次,這是我.vim/after/syntax/python.vim文件(感謝@Ingo):

syn include @pythonRst syntax/rst.vim 
syn region pythonDocstring start=+^\s*"""+ end=+"""+ [email protected] 

第三我編輯的文件和註釋掉此塊忽略當前語法是否設置:

if exists("b:current_syntax") 
    finish 
endif 

此塊加載代碼的插件(這是造成因爲它試圖加載一個Python語法文件,加載該語法文件中的一些遞歸問題:

for code in g:rst_syntax_code_list 
    unlet! b:current_syntax 
[...] 
    unlet! prior_isk 
endfor 

最後該塊結尾:

let b:current_syntax = "rst" 

因此,語法將保持爲python。

結果:

success!