等效于Python文件的%移动

发布于 2021-01-29 15:58:27

对于带有{}表示块的语言,vim具有全能%键。python代码的等效运动是什么?或至少以相同的缩进量移至下一行/上一行。

关注者
0
被浏览
146
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    VIM维基建议绑定,例如:

    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跳到缩进级别低于当前行的上一行或下一行。


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看