对于使用 来表示块的语言{},vim 拥有万能的%键。对于 python 代码,等效的移动操作是什么?或者至少移动到具有相同缩进的下一行/上一行。
绑定如下:
nnoremap <M-,> k:call search('^'. matchstr(getline(line('.')+1), '\(\s*\)') .'\S', 'b')<CR>^ nnoremap <M-.> :call search('^'. matchstr(getline(line('.')), '\(\s*\)') .'\S')<CR>^
并提供更全面的解决方案:
" Jump to the next or previous line that has the same level or a lower " level of indentation than the current line. " " exclusive (bool): true: Motion is exclusive " false: Motion is inclusive " fwd (bool): true: Go to next line " false: Go to previous line " lowerlevel (bool): true: Go to line with lower indentation level " false: Go to line with the same indentation level " skipblanks (bool): true: Skip blank lines " false: Don't skip blank lines function! NextIndent(exclusive, fwd, lowerlevel, skipblanks) let line = line('.') let column = col('.') let lastline = line('$') let indent = indent(line) let stepvalue = a:fwd ? 1 : -1 while (line > 0 && line <= lastline) let line = line + stepvalue if ( ! a:lowerlevel && indent(line) == indent || \ a:lowerlevel && indent(line) < indent) if (! a:skipblanks || strlen(getline(line)) > 0) if (a:exclusive) let line = line - stepvalue endif exe line exe "normal " column . "|" return endif endif endwhile endfunction " Moving back and forth between lines of same or lower indentation. nnoremap <silent> [l :call NextIndent(0, 0, 0, 1)<CR> nnoremap <silent> ]l :call NextIndent(0, 1, 0, 1)<CR> nnoremap <silent> [L :call NextIndent(0, 0, 1, 1)<CR> nnoremap <silent> ]L :call NextIndent(0, 1, 1, 1)<CR> vnoremap <silent> [l <Esc>:call NextIndent(0, 0, 0, 1)<CR>m'gv'' vnoremap <silent> ]l <Esc>:call NextIndent(0, 1, 0, 1)<CR>m'gv'' vnoremap <silent> [L <Esc>:call NextIndent(0, 0, 1, 1)<CR>m'gv'' vnoremap <silent> ]L <Esc>:call NextIndent(0, 1, 1, 1)<CR>m'gv'' onoremap <silent> [l :call NextIndent(0, 0, 0, 1)<CR> onoremap <silent> ]l :call NextIndent(0, 1, 0, 1)<CR> onoremap <silent> [L :call NextIndent(1, 0, 1, 1)<CR> onoremap <silent> ]L :call NextIndent(1, 1, 1, 1)<CR>
其用途:
[l
]l
[L
]L