在Vim中突出显示复制的区域

11
我想模仿游戏Vim Adventures中的一个不错的效果:当执行yank命令时,我希望被yanked的区域在一秒钟内被高亮显示(比如红色),以便向我展示我的选择是否正确。
例如,yy会在一秒钟内以红色高亮显示当前行,然后我就知道被选中了什么。

1
为什么你不在删除之前先可视化选择呢? - romainl
2
因为yi(命令比如vi(y命令更容易输入。而且无论如何,通过视觉上看到复制已完成总是让人感到放心。 - user2854544
你需要在自信和简洁/速度之间找到平衡。 - romainl
+1 这个想法很有趣。然而,按时间删除高亮可能会有些棘手,因为据我所知,Vim 缺乏定时器/异步功能(除非使用某些插件/补丁)。 - Yosh
4个回答

12

适用于Neovim和Vim

有一个名为vim-highlightedyank的插件可以实现这一功能,它既可用于Vim也可用于Neovim。安装它后,就能直接使用了。您还可以添加以下配置设置高亮显示的持续时间:

" set highlight to 1000 ms
let g:highlightedyank_highlight_duration = 1000

仅限于 Neovim

如果你正在使用 nvim 0.5+,它们已经在 这个拉请求 中将这个小功能内置了。

在这种情况下不需要插件。只需安装 nvim 0.5+ 并将以下配置添加到你的 init.vim 文件中:

augroup highlight_yank
    autocmd!
    au TextYankPost * silent! lua vim.highlight.on_yank({higroup="IncSearch", timeout=700})
augroup END

请查看 Neovim文档 以了解更多关于该功能的信息。


最新的Neovim版本需要安装插件吗? - prateek
1
@prateek 如果你已经安装了最新版本的neovim,你可以尝试使用neovim-only方法。无需安装vim-highlightedyank插件。 - jdhao

10

对于Neovim >= 0.7

Neovim包含一个在复制时高亮选定内容的功能,请参阅Neovim Lua文档

在Neovim版本 >= 0.7中,您还可以使用Neovim API定义自动命令来在事件中使用它。将以下配置添加到您的文件中:

vim.api.nvim_create_autocmd('TextYankPost', {
  group = vim.api.nvim_create_augroup('highlight_yank', {}),
  desc = 'Hightlight selection on yank',
  pattern = '*',
  callback = function()
    vim.highlight.on_yank { higroup = 'IncSearch', timeout = 500 }
  end,
})

6
我只需要更改第二行为group = vim.api.nvim_create_augroup('highlight_yank', {})。我正在使用NeoVim版本0.8.0。 - Fábio Roberto Teodoro
真是太棒了的贡献,我在neovim中尝试了一段时间..! - rodolfoksveiga
感谢@FábioRobertoTeodoro的纠正,没有函数的第二个参数,代码是无法运行的。太棒了! - rodolfoksveiga

1

一个Vim用户(不是我)看到了这个问题,并为此刚刚编写了一个插件。请注意,这不是一个简单的解决方案,可能不适合那些喜欢保持Vim最小的人,但它真的很好用。同时,请注意这并不意味着这是一个严肃的工作,因此您不能一定寻求稳定的支持。


需要安装的插件

使用您喜欢的方式安装这些插件。

设置

假设您想使用 Meta+y 进行“复制并高亮显示”。请在您的 .vimrc 中编写以下设置。

noremap <expr> <Plug>(yank-highlight) operator#sequence#map("y", "\<Plug>(operator-highlight)")
nmap <A-y> <Plug>(yank-highlight)
vmap <A-y> <Plug>(yank-highlight)

<A-y>更改为您想要使用的任何快捷键映射(仅使用y可能无效):<Leader>y可以是不错的选择,例如。

高亮显示可以自动清除。编写以下内容:

let g:operator#highlight#clear_time=2.0

这将在大约2秒钟内清除高亮显示。时间间隔也取决于:set updatetime?,其默认值为4000毫秒,因此如果似乎无法清除突出显示,请尝试将updatetime设置为较小的值。


哇,我很期待测试那个!谢谢! - user2854544
我遇到了一个错误 *E15: Invalid expression: operator#sequence#map("y", "<Plug>(operator-highlight)")*。有什么办法可以解决这个问题? - user2854544
嗯...我不太确定,抱歉。当vim-operator-sequence未安装时,我会遇到这种错误,所以也许你可以先检查一下是否已经安装了它? - Yosh
插件已安装,我可以看到它的状态。好的。 - user2854544
在这种情况下,很抱歉我无法提供帮助。我已经从我的.vimrc中删除了除这三个插件和设置之外的所有内容,它仍然可以正常工作。我能想到的唯一建议是(因为我知道很少的vim脚本),如果您使用的是旧版本的vim,请尝试使用更新的vim(我尝试了来自Ubuntu存储库的7.4.52,并没有出现问题)或类似的事情。对不起。如果nnoremap <expr> <A-y> operator#sequence#map("y")失败(这很不可能,因为您看到它的状态是OK),则表明问题不是来自vim-operator-highlight。 - Yosh

0

我使用了由markonm开发的插件hlyank.vim

我打开了这个插件并将时间从200更改为800,因为它只是在屏幕上闪烁颜色。在autoload文件夹中,我打开了hlyank.vim并编辑了以下几行:

  call timer_start(800, {-> matchdelete(id, winid)})
else
  call timer_start(800, {-> matchdelete(id)})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接