整个缓冲区是否有文本对象?


28

我经常发现自己输入类似gg"+yG或的命令,ggdG并且希望有一种更有效的方法来执行此操作,而不必两次移动光标。我有什么命令可以使用,例如y[movement]在不移动光标的情况下复制整个缓冲区?

Answers:


36

由于vim使用百分号引用当前缓冲区,因此您可以使用它快速获取所有内容。

:%y将拉动整个缓冲区, :%y+并将其拉动到+寄存器(假设vim是使用正确的选项编译的,则可能是剪贴板)。

:%d并将:%d+删除操作相同。

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


哇,这些时间我一直在使用mmgg"+yG`m,却从未想到过。谢谢,这在.vimrc中是正确的。
门把手2015年

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

10

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

该插件取决于同一作者的vim-textobj-user,它使用户可以舒适地定义任何文本对象。有许多插件可以很好地利用此功能。


8

默认情况下,整个文件没有文本对象,但是可以使用创建它们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

@ Random832 ``在末尾添加a 将使光标返回到先前的位置。
SnoringFrog 2015年

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

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

2

以下是完成任务的一些快速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 @=
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.