在Vim中选择/修改Python文档字符串

在Vim中选择/修改Python文档字符串,python,vim,Python,Vim,考虑以下函数定义: def function(self, arg1, arg2): """Function for doing something. Args: arg1: Argument 1. arg2: Argument 2. Returns: Returns something. """ ... ... 选择整个docstring最简单的方法是什么?例如,我可以使用内置方括号映射(即

考虑以下函数定义:

def function(self, arg1, arg2):
    """Function for doing something.

    Args:
         arg1: Argument 1.
         arg2: Argument 2.
    Returns:
         Returns something.
    """
    ...
    ...
选择整个docstring最简单的方法是什么?例如,我可以使用内置方括号映射(即
[m
]m
)轻松选择函数的内外周长,但文档字符串本身又如何呢?现在我能做的最好的事情就是使用方括号映射跳转到函数定义的开头,沿着一行往下走,然后使用视觉模式选择手动高亮显示。假设我的光标位于功能块内,我将以这种方式进行docstring选择:

  • [m
    转到函数定义的开头
  • j
    下线
  • V
    进入逐行视觉模式
  • {n}j
    向下移动,无论最后一个
    的相对行号是多少
  • 有没有办法让这更容易?我想至少第4步必须有一些解决办法,这可能会非常繁琐。也许一些模式匹配?
    g*
    选择是我的想法,但只有当三个引号在它们自己的行中被隔离时,它才会起作用。

    快速而肮脏:

    nmap <f10> [m/"""<cr>vn
    
    nmap[m/”vn
    
    在函数/方法正文中,按
    将选择docstring。

    快速和脏:

    nmap <f10> [m/"""<cr>vn
    
    nmap[m/”vn
    

    在函数/方法体中,按
    将选择docstring。

    我建议创建docstring文本对象。如
    id
    /
    ad

    将以下内容放入
    ~/.vim/after/ftplugin/python.vim

    function! s:docstring(...)
        call search('^\s*def.*\n\s*\zs"""\_s*.', 'bc' . (a:0 ? 'e' : ''))
        normal! m<
        if a:0
            call search('.\ze\_s*"""', 'e')
        else
            call search('"""', 'e')
            call search('"""', 'e')
        endif
        normal! m>
        normal! `<v`>
    endfunction
    
    xnoremap <buffer> id :<c-u>call <SID>docstring(1)<cr>gv
    xnoremap <buffer> ad :<c-u>call <SID>docstring()<cr>gv
    onoremap <buffer> id :normal vid<cr>
    onoremap <buffer> ad :normal vad<cr>
    
    函数!s:docstring(…)
    调用搜索(“^\s*def.*\n\s*\zs”“”\\u s*,“bc.”(a:0?'e':“”))
    正常<
    如果a:0
    调用搜索(“.\ze\\u s*”“”,“e”)
    其他的
    调用搜索(“”“”,“e”)
    调用搜索(“”“”,“e”)
    恩迪夫
    正常!m>
    正常`
    端功能
    xnoremap id:调用docstring(1)gv
    xnoremap广告:调用docstring()gv
    onoremap id:正常视频
    onoremap ad:正常vad
    

    现在,您可以像使用任何Vim文本对象一样使用
    id
    /
    ad
    文本对象。

    我建议创建docstring文本对象。如
    id
    /
    ad

    将以下内容放入
    ~/.vim/after/ftplugin/python.vim

    function! s:docstring(...)
        call search('^\s*def.*\n\s*\zs"""\_s*.', 'bc' . (a:0 ? 'e' : ''))
        normal! m<
        if a:0
            call search('.\ze\_s*"""', 'e')
        else
            call search('"""', 'e')
            call search('"""', 'e')
        endif
        normal! m>
        normal! `<v`>
    endfunction
    
    xnoremap <buffer> id :<c-u>call <SID>docstring(1)<cr>gv
    xnoremap <buffer> ad :<c-u>call <SID>docstring()<cr>gv
    onoremap <buffer> id :normal vid<cr>
    onoremap <buffer> ad :normal vad<cr>
    
    函数!s:docstring(…)
    调用搜索(“^\s*def.*\n\s*\zs”“”\\u s*,“bc.”(a:0?'e':“”))
    正常<
    如果a:0
    调用搜索(“.\ze\\u s*”“”,“e”)
    其他的
    调用搜索(“”“”,“e”)
    调用搜索(“”“”,“e”)
    恩迪夫
    正常!m>
    正常`
    端功能
    xnoremap id:调用docstring(1)gv
    xnoremap广告:调用docstring()gv
    onoremap id:正常视频
    onoremap ad:正常vad
    

    现在,您可以像使用任何Vim文本对象一样使用
    id
    /
    ad
    文本对象。

    这是一个docstring,不是注释。@IgnacioVazquez Abrams Oops。感谢您的澄清。我对问题进行了适当的编辑。我很高兴您找到了
    [m
    和其他”方法“映射。我发现这些映射的利用率非常低。这是一个文档字符串,不是注释。@IgnacioVazquez Abrams Oops。感谢您的澄清。我对问题进行了适当的编辑。我非常高兴您找到了
    [m
    和其他“方法”映射。我发现这些映射的利用率非常低。
    [m
    @phdthere is
    [m
    @phd