簡體   English   中英

在Python文檔字符串中嵌入reStructuredText

[英]Embedding reStructuredText in Python docstrings

我想在我的Python文檔字符串中看到一些不錯的語法突出顯示和着色(當然)是有效的RESt。 例如:

'''
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

根據語法包括的文檔,這應該足夠了。 另請注意, rst.vim重新定義了一堆python實體,因此我不得不注釋掉與代碼相關的所有部分:

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

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

最后,我不能使用!runtime因為如果已經定義了b:current_syntax變量, rst.vim不執行任何操作:

if exists("b:current_syntax")
  finish
endif

盡管經過我的努力,我的文檔字符串仍然與其他注釋保持相同的顏色,並且沒有突出顯示語法。

我也試過這個:

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

但是我只設法將塊的顏色更改為Special而不是Comment

也許我應該定義pythonDocstring不具有任何默認顏色?

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


更新資料

使用我的after / syntax / python.vim文件嘗試以下解決方案之一:

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

當打開擴展名為.py的文件時,導致RESt文件顯示為灰色:

python語法

同時使用.rst打開相同的文件。 擴展似乎可以正常工作(只是為了表明我有一個rest語法文件):

其余語法

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

由於reST語法僅應 Python文檔字符串中應用,因此您必須將它們包括在語法集群中(此處為@pythonRst )。 否則,Vim會嘗試在任何地方匹配它們。

syn include @pythonRst syntax/rst.vim

然后,定義一個覆蓋這些文檔字符串的區域,並明確指示Vim在其中突出顯示reST語法(通過contains=

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

我終於設法破解了。

首先,我將rst.vim文件從$ VIMRUNTIME / syntax復制到我的.vim/syntax/文件夾中

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

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

第三,我編輯了文件並注釋掉了該塊,以忽略是否設置了當前語法:

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。

結果:

成功!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM