Vim可以将shiftround作为一个整体应用于块而不是行吗?

时间:2014-11-19 11:02:08

标签: vim

我一般都喜欢Vim中的shiftround选项,但有几个 它不能很好地工作的情况。例如,举个例子:

f(x,
  y)

选择两行并使用>移动并选择两行 我(和shiftwidth设置为4):

    f(x,
    y)

当我真的想要的时候:

    f(x,
      y)

换句话说,当我的时候,Vim将块的每一行都推进到下一个tabstop 真的希望它在每一行插入相同数量的插入 - 但我想要 在最后一个tabstop上最小的缩进行。

是否有一种简单的方法可以在Vim中获得此行为?我的目标是让这项工作 <>(使用视觉选择)而不是其他解决方法。

2 个答案:

答案 0 :(得分:0)

Ctrl + V ,在需要移动的文本之前选择垂直列( j 只有两行), Shift + I ,插入所需数量的制表符或空格, Esc

您实际上可以使用此方法插入任意文本,例如,您可以插入#//来评论某些代码。有关:help blockwise-operators的更多信息。

答案 1 :(得分:0)

我会通过一组单独的映射来解决这个问题,这些映射将>>命令括起来并临时清除'shiftround'。这是一个实现:

" g>>               Shift [count] lines one 'shiftwidth' rightwards, without
"                   'shiftround'.
"{Visual}[count]>   Shift the highlighted lines [count] 'shiftwidth'
"                   rightwards (for {Visual} see |Visual-mode|), without
"                   'shiftround'.
" g<<, {Visual}[count]<
function! s:Shift( command )
    let s:save_shiftround = &shiftround
    set noshiftround
    return a:command
endfunction
function! s:RestoreShiftRound()
    let &shiftround = s:save_shiftround
    return ''
endfunction
nnoremap <expr> <SID>(RestoreShiftRound) <SID>RestoreShiftRound()
nnoremap <expr> <SID>(ShiftRight) <SID>Shift('>>')
xnoremap <expr> <SID>(ShiftRight) <SID>Shift('>')
nnoremap <expr> <SID>(ShiftLeft) <SID>Shift('<<')
xnoremap <expr> <SID>(ShiftLeft) <SID>Shift('<')
nnoremap <silent> <script> <Plug>(ShiftRightNoRound)          <SID>(ShiftRight)<SID>(RestoreShiftRound)
xnoremap <silent> <script> <Plug>(ShiftRightNoRoundSelection) <SID>(ShiftRight)<SID>(RestoreShiftRound)
nnoremap <silent> <script> <Plug>(ShiftLeftNoRound)           <SID>(ShiftLeft)<SID>(RestoreShiftRound)
xnoremap <silent> <script> <Plug>(ShiftLeftNoRoundSelection)  <SID>(ShiftLeft)<SID>(RestoreShiftRound)
nmap g>> <Plug>(ShiftRightNoRound)
xmap g>  <Plug>(ShiftRightNoRoundSelection)
nmap g<< <Plug>(ShiftLeftNoRound)
xmap g<  <Plug>(ShiftLeftNoRoundSelection)

我没有覆盖>{motion}命令,因为这会更复杂。