我一般都喜欢Vim中的shiftround选项,但有几个 它不能很好地工作的情况。例如,举个例子:
f(x,
y)
选择两行并使用>
移动并选择两行
我(和shiftwidth
设置为4):
f(x,
y)
当我真的想要的时候:
f(x,
y)
换句话说,当我的时候,Vim将块的每一行都推进到下一个tabstop 真的希望它在每一行插入相同数量的插入 - 但我想要 在最后一个tabstop上最小的缩进行。
是否有一种简单的方法可以在Vim中获得此行为?我的目标是让这项工作
<
和>
(使用视觉选择)而不是其他解决方法。
答案 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}
命令,因为这会更复杂。