很多时候我想以相同的方式编辑文本块中的每一行,所以我会输入
<C-V>}
这实现了选择整个块,但不幸的是,它越过块的最后一行并更改光标位置。因此,我必须按k,然后按任何顺序来校正光标位置。通常,我发现在最后一行之前按j
更容易。有没有更简单的方法来实现这一点?
示例:我想将以下内容从
std::cerr << "abc::blah " << std::endl;
std::cerr << "def::text " << std::endl;
std::cerr << "ggg::something " << std::endl;
std::cerr << "xyz::else " << std::endl;
std::cerr << "qrs::random " << std::endl;
自:
std::cerr << "Foo::blah " << std::endl;
std::cerr << "Foo::text " << std::endl;
std::cerr << "Foo::something " << std::endl;
std::cerr << "Foo::else " << std::endl;
std::cerr << "Foo::random " << std::endl;
所以我发现自己将光标放在第一行的第一个 a 上,然后我会输入<C-V>jjjjecFoo<ESC>
有没有办法将光标向下移动到块的末尾而不经过它或更改列,即相当于按 j 直到块的最后一行?
据我所知,没有任何内置内容,但您可以定义自定义映射(g}
似乎合适(,如 vi.stackexchange.com 上的这个答案所示:
vnoremap <silent> g} :<C-U>call cursor(line("'}")-1,col("'>"))<CR>`<1v``
我发现的唯一问题是,当段落的最后一行也是缓冲区的最后一行时,它不起作用,但是额外的j
将修复选择。
您可以定义一个自定义:help :map-operator
,该仅使用移动的行号,但保留当前列:
"<Leader>gl{motion} Jump to the line at the end of {motion}; keep the
" current column.
function! s:SetCursor( lnum, virtcol )
call cursor(a:lnum, 0)
execute 'normal!' a:virtcol . '|'
endfunction
function! OnlyLineJumpOperator( type ) abort
call s:SetCursor(line("']"), virtcol('.'))
endfunction
function! OnlyLineJumpVisual( type ) abort
normal! gv
call OnlyLineJumpOperator(a:type)
endfunction
function! s:OnlyOneCoordinateJumpExpression( what, mode ) abort
let &opfunc = printf('Only%sJump%s', a:what, a:mode)
return (a:mode ==# 'Visual' ? "<C-><C-n>" : '') . 'g@'
endfunction
nnoremap <expr> <Leader>gl <SID>OnlyOneCoordinateJumpExpression('Line', 'Operator')
xnoremap <expr> <Leader>gl <SID>OnlyOneCoordinateJumpExpression('Line', 'Visual')
有了这个,您的用例将变得 <C-v><Leader>gl}ecFoo<Esc>
.
奖金
为了完整起见,您还可以添加相反的映射(保留行并仅更改列(:
"<Leader>g|{motion} Jump to the column at the end of {motion}; keep the
" current line.
function! OnlyColumnJumpOperator( type ) abort
execute 'normal!' virtcol("']") . '|'
endfunction
function! OnlyColumnJumpVisual( type ) abort
normal! gv
call OnlyColumnJumpOperator(a:type)
endfunction
nnoremap <expr> <Leader>g<Bar> <SID>OnlyOneCoordinateJumpExpression('Column', 'Operator')
xnoremap <expr> <Leader>g<Bar> <SID>OnlyOneCoordinateJumpExpression('Column', 'Visual')