Equivalent of % movement for Python files

后端 未结 3 1593
旧时难觅i
旧时难觅i 2021-01-02 09:31

For languages with {} to denote blocks, vim has the almighty % key. What is the equivalent movement thing for python code? Or at least to move to

3条回答
  •  -上瘾入骨i
    2021-01-02 10:20

    The vim wiki suggest bindings such as:

    nnoremap  k:call search('^'. matchstr(getline(line('.')+1), '\(\s*\)') .'\S', 'b')^
    nnoremap  :call search('^'. matchstr(getline(line('.')), '\(\s*\)') .'\S')^
    

    As well as offering a more comprehensive solution:

    " 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  [l :call NextIndent(0, 0, 0, 1)
    nnoremap  ]l :call NextIndent(0, 1, 0, 1)
    nnoremap  [L :call NextIndent(0, 0, 1, 1)
    nnoremap  ]L :call NextIndent(0, 1, 1, 1)
    vnoremap  [l :call NextIndent(0, 0, 0, 1)m'gv''
    vnoremap  ]l :call NextIndent(0, 1, 0, 1)m'gv''
    vnoremap  [L :call NextIndent(0, 0, 1, 1)m'gv''
    vnoremap  ]L :call NextIndent(0, 1, 1, 1)m'gv''
    onoremap  [l :call NextIndent(0, 0, 0, 1)
    onoremap  ]l :call NextIndent(0, 1, 0, 1)
    onoremap  [L :call NextIndent(1, 0, 1, 1)
    onoremap  ]L :call NextIndent(1, 1, 1, 1)
    

    Which uses:

    • [l and ]l jump to the previous or the next line with the same indentation level as the current line.
    • [L and ]L jump to the previous or the next line with an indentation level lower than the current line.

提交回复
热议问题