我经常发现自己在键入诸如gg"+yGggdG之类的命令,并且想要一种更有效的方式来执行此操作,而不必两次移动光标。有什么我可以使用的命令y[movement]是否要复制整个缓冲区而不移动光标?

#1 楼

由于vim使用百分号来引用当前缓冲区,因此您可以使用它快速获取所有内容。剪贴板,前提是vim是使用正确的选项编译的)。

:%y:%y+的删除操作相同。

在每种情况下,光标都保持在原处。

评论


哇,一直以来我一直在使用mmgg“ + yG`m,却从未想到这一点。谢谢,在.vimrc中这是正确的。

–门把手
2015年3月3日14:01

@Doorknob无需设置和使用标记,您只需使用C-o两次即可返回。

–俄罗斯
18年1月3日在16:48

#2 楼

另一个解决方案是使用一个名为vim-textobj-entire的插件。默认情况下,此插件为整个缓冲区提供文本对象ae,为整个缓冲区提供文本对象ie(前导和尾随的空行除外)。

该插件依赖同一作者的vim-textobj-user,使用户可以轻松地定义任何文本对象。有许多插件可以很好地利用此功能。

#3 楼

默认情况下,整个文件没有文本对象,但是可以使用omap创建它们。在这种情况下,它看起来像这样:

onoremap f :<c-u>normal! mzggVG<cr>`z


以下是其工作原理的详细信息:

onoremap f " make 'f' the text object name
:<c-u> " use <c-u> to prevent vim from inserting visual selection marker at the beginning of the command automatically.
normal! " use normal to make key presses ignoring any user mappings
mzggVG<cr>`z " make a marker in register z, select the entire file in visual line mode and enter the normal command, and go back to the z marker


注释:

Ctrlu可以在命令行模式下使用,以删除光标位置左侧的所有内容。这样做的原因是因为如果您从可视模式直接输入命令行,它将自动在命令行上插入'<,'>,而这不是我们想要的。我还建议您使用f以外的其他东西,因为f通常用于移动到行中的下一个搜索字符。例如,fi将转到当前行的下一个i

相关帮助主题:

:help omap-info
:help :normal
:help c_CTRL-U
:help v_:


评论


有没有办法让光标保持不动呢?

–Random832
15年3月2日在20:17

@ Random832在末尾添加``将使光标返回到上一个位置。

–SnoringFrog
2015年3月2日在20:22



我担心这将使选择不应用于yank命令。我今天会做一些实验。

–Random832
15年3月2日在20:24

我在映射中添加了标记命令,它应该将光标留在现在的位置。

–EvergreenTree
15年3月2日在20:42

#4 楼

以下是完成任务的一些快速n'脏映射:

nnoremap yY :%yank <c-r>=v:register<cr><cr>
nnoremap dD :%delete <c-r>=v:register<cr><cr>
现在可以分别使用yYdD取消/删除。它不如使用完整的文本对象好,但有时最简单的解决方案是最好的。

有关更多帮助,请参见:

:h :y
:h :d
:h [range]
:h v:register
:h c_ctrl-r
:h @=


#5 楼

推荐的解决方案

@filbranden在此处回答我的问题创建的

" Create text-object `A` which operates on the whole buffer (i.e. All)
" Keeps the cursor position in the same position
function TextObjectAll()
    let g:restore_position = winsaveview()
    normal! ggVG
    " For delete/change ALL, we don't wish to restore cursor position.
    if index(['c','d'], v:operator) == -1
        call feedkeys("\<Plug>(RestoreView)")
    end
endfunction
onoremap A :<C-U>call TextObjectAll()<CR>
nnoremap <silent> <Plug>(RestoreView) :call winrestview(g:restore_position)<CR>


1衬管解决方案

" Use operator pending mode to visually select the whole buffer
" e.g. dA = delete buffer ALL, yA = copy whole buffer ALL
onoremap <silent> A :<C-u>normal! ggVG<CR>


可视模式

我以前有这个功能,但是在可视模式下,如果按A追加到行的末尾,它将被全选覆盖。您可以将其映射到其他内容:

" Allow one to press A in visual mode to select the whole buffer (ALL)
xnoremap <silent> A :<C-U>normal! ggVG<CR>


评论


感谢您在此处分享此答案!

–filbranden♦
20-04-29在20:10

nitpick非常小:在这种情况下,vnoremap以可视和选择模式进行映射,这可能不是您想要的。对于可视模式映射,请使用xnoremap。

–丰富
20-4-30上午10:51

我不使用选择模式,但是为了其他我的利益改变了它。

– run_the_race
20年4月30日在11:45