我非常习惯在终端中使用鼠标双击来复制单词,例如文件名,然后在不同的终端中使用鼠标中键进行粘贴。
然而,在 Fedora 24 下使用 vim 时,这种行为似乎不起作用。如果我在 vim 会话中双击,它只会选择文件名的一个片段,并且实际上不会将该片段复制到剪贴板,因为我无法通过中键单击粘贴它。
vim 中是否有某些设置会导致此行为(所以我可以禁用它)?如果我使用\vi file
复制粘贴可以正常工作,但我会失去语法突出显示。
我使用的是 Fedora 24 和 vim 版本 2:8.0.124-2.fc24。我安装了以下软件包:vim-common、vim-enhanced、vim-filesystem、vim-minimal。
答案1
所有这些是在vim在线帮助中。但它分布在 doco 中的许多变量和选项,并且没有真正的总体指南来指导整个事情。
正常模式
您的终端模拟器有两种模式。在正常模式下,它本身处理所有鼠标交互。当您双击时,终端模拟器会决定单词是什么,并突出显示您的选择。当您单击鼠标中键时,终端仿真器会从 X 服务器获取选择并将其发送到终端,就像普通的键入输入一样。
如果你运行最小的 vim (这是名为 的程序vi
),或者使用:set mouse=
完整的 vim,这就是你得到的。如果您曾经尝试使用鼠标中键粘贴到 vim 中,您会发现 vim 显然不参与粘贴,因为如果您当时没有处于插入模式,则粘贴的文本将被视为 vim 命令。
鼠标报告模式
在其鼠标报告模式,但是,您的终端模拟器本身不处理鼠标操作。相反,它传输动作就像普通的键入输入一样,编码为特殊的控制序列。应用程序输出其他控制序列以转动鼠标报告模式打开和关闭。 (这有很多微妙之处,与自由软件世界发明的一些鼠标报告协议非常糟糕这一事实有关。但这超出了本答案的范围。)
当您在 vim 中进行mouse=a
或mouse=h
类似的设置时,它会在正常和鼠标报告模式之间动态更改终端模式,具体取决于mouse
您当时正在执行的操作的确切设置。例如:当 时mouse=h
,它会在您切换到帮助屏幕时打开鼠标报告,并在您再次切换离开时关闭。
当鼠标报告模式打开时,vim 本身它决定单词是什么,突出显示您的选择,并将选择与 X 服务器进行通信。如果您使用mouse=a
或类似的方式运行(完整)vim,但无法知道是否有可用的 GUI,通过DISPLAY
从其环境中删除环境变量,您会发现在选择和粘贴工作时之内vim,它看不到 X 选择,X 应用程序也看不到它的选择。事实上,屏幕上可以同时有两个选择,一个在 X 应用程序中,一个在 vim 中。 (最小化的 vim 根本没有能力在其代码中与 X 服务器对话。)
决定什么是单词
决定单词是什么的规则是不同的。您的终端仿真器(取决于它是什么仿真器程序)可能会也可能不会让您配置它如何确定字边界。 roxterm、Terminate 和 LXTerminal 在其首选项对话框中都有“按字选择字符”设置。其他人只是简单地对此进行硬连接。
无论是哪种情况,它显然都认为这a/b/c/d
只是一个词。因此,当终端仿真器负责处理鼠标操作时,这就是它设置为响应双击的选择。
vim 有自己的一组非常独立的设置,这些设置基于被认为是“关键字”的内容,因此也链接到正则表达式匹配和语法着色。显然,无论您配置 vim 来了解当前文件(该iskeyword
选项位于缓冲区本地并可通过您选择的文件类型进行调整),a/b/c/d
都被视为由斜杠分隔的多个单词。这就是当 vim 负责处理鼠标操作时你会得到的结果。
进一步阅读
:help mouse-using
:help mouse
:help ttymouse
:help double-click
:help iskeyword
- “鼠标报告”是什么意思?
- 在 Fedora 上将 Vi 全局替换为 Vim
- https://unix.stackexchange.com/a/307925/5132