在vim中跳转到下一个Python类或函数

7

我试图使用以下命令在vim中跳转到下一个Python类或函数:

autocmd FileType python nnoremap <buffer> [[ ?^class|^\s*def<CR>
autocmd FileType python nnoremap <buffer> ]] /^class|^\s*def<CR>

但它没有起作用。Vim提示:

Error detected while processing FileType Auto commands for "python":
E492: Not an editor command: ^\s*def<CR>

如何解决这个问题?

为什么不使用插件,例如Python-mode?请查看此答案 - Remi Guan
@KevinGuan 谢谢,我之前试过了。它有一些bug,而且我只需要其中的一小部分功能。所以我想也许我可以写一些更适合我的东西 :) - Searene
$VIMRUNTIME/ftplugin/python.vim中已经定义了这些映射关系时,为什么要费那么大的劲去重新定义呢? - romainl
1
@romainl 但是当我在vim中尝试使用[[]]时,没有任何额外的配置,它只能跳转到前/后一个类,跳过中间的所有类方法。 - Searene
1
@romainl жҲ‘еҲҡеҲҡзҝ»йҳ…дәҶpython.vimж–Ү件пјҢеҸ‘зҺ°[mе’Ң]mзҡ„е·ҘдҪңж–№ејҸдёҺжҲ‘йў„жңҹзҡ„дёҖж ·гҖӮи°ўи°ўдҪ гҖӮ :) - Searene
2个回答

6

经过多次尝试,我发现以下代码有效。在 | 前面需要添加 \\

autocmd FileType python nnoremap <buffer> [[ ?^class\\|^\s*def<CR>
autocmd FileType python nnoremap <buffer> ]] /^class\\|^\s*def<CR>

作为另一种选择,我发现将这两行代码放在~/.vim/ftplugin/python.vim中更加方便。
nnoremap [[ ?^class\|^\s*def<CR>
nnoremap ]] /^class\|^\s*def<CR>

谢谢。我使用了以下改进的正则表达式:autocmd FileType python nnoremap <buffer> <C-k> ?^\s*\zs\<class\>\\|^\s*\zs\<def\><CR>(另一个类似,映射到 C-j)。 - Torben Klein
你好,为什么在.vimrc中使用以下代码时,不带<buffer>的第二个代码 nnoremap [[ ?^class\|^\s*def<CR> 无法正常工作?我主要使用Python。 - Grzegorz Krug
@GrzegorzKrug,将“\”更改为“\”这一观察结果对第二种形式也适用。 - Caco

0
目前在这种情况下,一个很好的选择是使用官方 nvim/vim 仓库中提供的 vim-ftplugin-python
在这个 中,我们有相关的映射。
let b:next_toplevel='\v%$\|^(class\|def\|async def)>'
let b:prev_toplevel='\v^(class\|def\|async def)>'
let b:next_endtoplevel='\v%$\|\S.*\n+(def\|class)'
let b:prev_endtoplevel='\v\S.*\n+(def\|class)'
let b:next='\v%$\|^\s*(class\|def\|async def)>'
let b:prev='\v^\s*(class\|def\|async def)>'
let b:next_end='\v\S\n*(%$\|^(\s*\n*)*(class\|def\|async def)\|^\S)'
let b:prev_end='\v\S\n*(^(\s*\n*)*(class\|def\|async def)\|^\S)'

if !exists('g:no_plugin_maps') && !exists('g:no_python_maps')
    execute "nnoremap <silent> <buffer> ]] :call <SID>Python_jump('n', '". b:next_toplevel."', 'W', v:count1)<cr>"
    execute "nnoremap <silent> <buffer> [[ :call <SID>Python_jump('n', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
    execute "nnoremap <silent> <buffer> ][ :call <SID>Python_jump('n', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>"
    execute "nnoremap <silent> <buffer> [] :call <SID>Python_jump('n', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>"
    execute "nnoremap <silent> <buffer> ]m :call <SID>Python_jump('n', '". b:next."', 'W', v:count1)<cr>"
    execute "nnoremap <silent> <buffer> [m :call <SID>Python_jump('n', '". b:prev."', 'Wb', v:count1)<cr>"
    execute "nnoremap <silent> <buffer> ]M :call <SID>Python_jump('n', '". b:next_end."', 'W', v:count1, 0)<cr>"
    execute "nnoremap <silent> <buffer> [M :call <SID>Python_jump('n', '". b:prev_end."', 'Wb', v:count1, 0)<cr>"

    execute "onoremap <silent> <buffer> ]] :call <SID>Python_jump('o', '". b:next_toplevel."', 'W', v:count1)<cr>"
    execute "onoremap <silent> <buffer> [[ :call <SID>Python_jump('o', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
    execute "onoremap <silent> <buffer> ][ :call <SID>Python_jump('o', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>"
    execute "onoremap <silent> <buffer> [] :call <SID>Python_jump('o', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>"
    execute "onoremap <silent> <buffer> ]m :call <SID>Python_jump('o', '". b:next."', 'W', v:count1)<cr>"
    execute "onoremap <silent> <buffer> [m :call <SID>Python_jump('o', '". b:prev."', 'Wb', v:count1)<cr>"
    execute "onoremap <silent> <buffer> ]M :call <SID>Python_jump('o', '". b:next_end."', 'W', v:count1, 0)<cr>"
    execute "onoremap <silent> <buffer> [M :call <SID>Python_jump('o', '". b:prev_end."', 'Wb', v:count1, 0)<cr>"

    execute "xnoremap <silent> <buffer> ]] :call <SID>Python_jump('x', '". b:next_toplevel."', 'W', v:count1)<cr>"
    execute "xnoremap <silent> <buffer> [[ :call <SID>Python_jump('x', '". b:prev_toplevel."', 'Wb', v:count1)<cr>"
    execute "xnoremap <silent> <buffer> ][ :call <SID>Python_jump('x', '". b:next_endtoplevel."', 'W', v:count1, 0)<cr>"
    execute "xnoremap <silent> <buffer> [] :call <SID>Python_jump('x', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<cr>"
    execute "xnoremap <silent> <buffer> ]m :call <SID>Python_jump('x', '". b:next."', 'W', v:count1)<cr>"
    execute "xnoremap <silent> <buffer> [m :call <SID>Python_jump('x', '". b:prev."', 'Wb', v:count1)<cr>"
    execute "xnoremap <silent> <buffer> ]M :call <SID>Python_jump('x', '". b:next_end."', 'W', v:count1, 0)<cr>"
    execute "xnoremap <silent> <buffer> [M :call <SID>Python_jump('x', '". b:prev_end."', 'Wb', v:count1, 0)<cr>"
endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接