在Python文档字符串中嵌入reStructuredText

在Python文档字符串中嵌入reStructuredText,python,vim,python-sphinx,restructuredtext,Python,Vim,Python Sphinx,Restructuredtext,我想在Python的docstrings中看到一些漂亮的语法高亮显示和着色,这些(当然)都是有效的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*'''

我想在Python的docstrings中看到一些漂亮的语法高亮显示和着色,这些(当然)都是有效的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')
[...]
最后,我不能使用
!运行时
因为rst.vim如果已经定义了
b:current_语法
变量,则不会执行任何操作:

if exists("b:current_syntax")
  finish
endif
尽管我做出了努力,我的docstring仍然与其他注释保持相同的颜色,没有语法突出显示

我也试过这个:

syn region pythonDocstring  start=+^\s*'''+ end=+'''+ contains=CONTAINED
但我只是设法将块的颜色更改为
特殊
,而不是
注释

也许我应该定义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文件变灰:

使用
.rst
打开同一文件时。扩展似乎工作正常(只是为了表明我有一个rest语法文件):


注意,我在my.vimrc

中尝试了使用和不使用
colorscheme
,因为reST语法应该只应用于Python文档字符串中,所以必须将它们包括在语法集群中(这里:
@pythonRst
)。否则,Vim会尝试在任何地方匹配它们

syn include @pythonRst syntax/rst.vim
然后,定义一个覆盖这些文档字符串的区域,并明确指示Vim突出显示其中的reST语法(通过
contains=


我终于设法破解了它

首先,我将
rst.vim
文件从$VIMRUNTIME/syntax复制到我的
.vim/syntax/
文件夹中

其次,这是我的
.vim/after/syntax/python.vim
文件(谢谢@Ingo):

第三,我编辑了文件,注释掉了该块,以忽略是否设置了当前语法:

if exists("b:current_syntax")
  finish
endif
此块用于加载代码插件(它导致了一些递归问题,因为它试图加载python语法文件,而python语法文件加载了以下语法文件:

for code in g:rst_syntax_code_list
    unlet! b:current_syntax
[...]
   unlet! prior_isk
endfor
最后,这一块在最后:

let b:current_syntax = "rst"
因此语法将保持为python

结果:


我已经试过了,但似乎没有效果。我将发布一些图片作为更新。
for code in g:rst_syntax_code_list
    unlet! b:current_syntax
[...]
   unlet! prior_isk
endfor
let b:current_syntax = "rst"