视觉模式 neovim 中的 Autocmd 用于将选择同步到 X11 缓冲区

问题描述 投票:0回答:1

我希望在视觉模式下选择的任何内容都进入 X11 缓冲区。我理想的工作流程是这样的:

  1. 我通过按 v(或 V 或 ctrl V 等)进入视觉模式
  2. 通过一些常用的动作 hjkl、wb 或类似的动作来选择一些文本
  3. 在终端之外,我单击中键(用滚轮单击),然后将 2 中的选择粘贴到我按下的位置

我可以用例如得到几乎类似的东西键盘映射:

vim.keymap.set("v",  "<leader>y", [["*ygv]])
,然后在 (2) 和 (3) 之间添加一个步骤,我按
<leader>y

我的实际问题是如何使这种拉动(同时保持视觉选择(我的示例键盘映射中的 gv))自动发生。

可能我想要类似自动命令的东西,但我不知道要观看的正确事件。看起来对工作有益的事情是:

vim.api.nvim_create_autocmd({"CursorMoved", "ModeChanged"}, {
    callback = function()
        local mode = vim.fn.mode(false)
        if mode == "v" or mode == "V" or mode == "^V" then
            vim.cmd([["*y]])
        end
    end,
})

但是有一些问题:

  • 它的运行频率可能有点激进
  • “^V”不是正确的匹配字符
  • 它搞砸了
    :V
    ,因为初始行选择被删除(但将
    gv
    添加到命令似乎不起作用)

更好的方法是什么?

我在 gnome 上运行 nvim v0.9.4。

lua neovim
1个回答
0
投票

如果我理解正确的话,当任何视觉选择更新主选择原子时,您需要标准的 X11 功能(而 CLIPBOARD 与 control-c 或类似功能一起使用)。顺便提一句。为 gtk/X11 构建的 gvim 本身支持此功能(称为自动选择等)。

但是,对于 nvim,情况就更复杂了。该应用程序是为终端构建的,没有任何特定的 gtk 或 X11 代码。操作系统剪贴板访问通常是通过执行外部应用程序(例如 xclip 或 xsel)来完成的。

因此,从技术上讲,您也许可以捕获 CursorMoved 事件,然后(当然,当前模式是可视的)每次调用时不断更新“star”寄存器。但是,老实说,我认为这不是一个好主意。

此类功能可能由某些 nvim gui shell(nvim-qt 等)内部实现。但我不知道有类似的事情发生过。

此外,请考虑 PRIMARY 选择的类似物未包含在 Wayland 核心中。因此它仅作为 Gnome/Wayland 实现中的额外功能而存在。

© www.soinside.com 2019 - 2024. All rights reserved.