VIM:如何在不更改列的情况下将光标向下移动到块中文本的最后一行?



很多时候我想以相同的方式编辑文本块中的每一行,所以我会输入

<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')

最新更新