gg"+yG
或ggdG
之类的命令,并且想要一种更有效的方式来执行此操作,而不必两次移动光标。有什么我可以使用的命令y[movement]
是否要复制整个缓冲区而不移动光标?#1 楼
由于vim使用百分号来引用当前缓冲区,因此您可以使用它快速获取所有内容。剪贴板,前提是vim是使用正确的选项编译的)。:%y
和:%y+
的删除操作相同。 在每种情况下,光标都保持在原处。
#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>
现在可以分别使用yY
和dD
取消/删除。它不如使用完整的文本对象好,但有时最简单的解决方案是最好的。有关更多帮助,请参见:
: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
评论
哇,一直以来我一直在使用mmgg“ + yG`m,却从未想到这一点。谢谢,在.vimrc中这是正确的。
–门把手
2015年3月3日14:01
@Doorknob无需设置和使用标记,您只需使用C-o两次即可返回。
–俄罗斯
18年1月3日在16:48