GVim Win32 中的仅键盘列块选择,或者当包含 mswin.vim 时,为啥 Ctrl-Q 不模拟 Ctrl-V?

Posted

技术标签:

【中文标题】GVim Win32 中的仅键盘列块选择,或者当包含 mswin.vim 时,为啥 Ctrl-Q 不模拟 Ctrl-V?【英文标题】:Keyboard-only column block selection in GVim Win32, or why does Ctrl-Q not emulate Ctrl-V when mswin.vim is included?GVim Win32 中的仅键盘列块选择,或者当包含 mswin.vim 时,为什么 Ctrl-Q 不模拟 Ctrl-V? 【发布时间】:2012-12-19 06:36:22 【问题描述】:

当我在 Windows 上使用 GVim 时,我希望能够仅使用键盘选择柱状块,但在 Windows XP 上使用 gvim (7.2) 时似乎无法这样做。 编辑:为方便起见,最好使用箭头键进行选择,这在其他版本的 vi/vim 中很常见。

在终端中,使用 vim 定义块时,可以通过按 Ctrl-V 并方便地移动光标用箭头键来选择柱状块.

在 mswin 上使用 GVim 时,Ctrl-V 映射到粘贴操作。在该主题上找到的每个参考资料都提到,在 mswin 上,Ctrl-Q 设置为与 Ctrl-V 在其他平台上的工作方式相同,但这不适用于我。

在研究表明 Ctrl-Q 行为是通过包含 mswin.vim 来实现的,看来 mswin.vim 可能没有被 GVim 加载。 mswin.vim 显然是通过 _vimrc 加载的。似乎 mswin.vim 没有加载,所以可能 _vimrc 没有正确设置,但是...

C:\Program Files\Vim\_vimrc 存在包含:

source $VIMRUNTIME/mswin.vim
behave mswin

C:\Program Files\Vim\vim72\mswin.vim 存在并包含:

" Use CTRL-Q to do what CTRL-V used to do
noremap <C-Q>       <C-V>

C:\Program Files\Vim\_vimrc 应该从 Edit | 加载GVim 图形菜单中的设置窗口加载此文件进行编辑,很明显C:\Program Files\Vim\vim72\mswin.vim 正在加载,因为可以在该文件中插入语法错误,GVim 会在启动时抱怨它(它被备份了测试和恢复以防止意外损坏)。

当按下 Ctrl-Q 时,光标的变化方式与使用鼠标阻止选择文本时的变化方式相同,但此时任何光标移动都会导致光标变回一个普通的光标。是否继续按住CtrlCtrl-Q都没有关系。

编辑:Ctrl-Q 进入块选择模式,如光标变化所示,因为其他光标移动命令扩展了块,但是,这个问题的初衷是学习如何使用箭头键(与它们能够在编辑器的其他实现中使用的方式相同),尽管在问题的原始未答复修订版中没有明确说明这一点。

可以通过在按住鼠标左键的同时按Alt来直观地选择柱状块,但是在按Ctrl-之后的箭头键移动过程中Alt Q 也不行。

研究似乎还表明,在命令模式下按 v 会进入可视模式,这也许是相关的,但使用它似乎对这种情况没有帮助。

C:\Program Files\Vim\vimfiles 除了空目录结构外不包含任何内容。 C:\Documents and Settings\username 不包含 vim 配置文件,C:\Documents and Settings\username\My Documents 也不包含。通常存储应用程序特定或本地设置的其他C:\Documents and Settings\username 位置似乎也没有vim 设置。 %HOMEDRIVE% 和环境变量也是如此。

【问题讨论】:

【参考方案1】:

在 Win32 上仅使用键盘直观地选择 GVim 中的列块的一种方法是按 Ctrl-Q,松开它,然后按住 Shift 键同时使用箭头键选择列块。

为什么 Ctrl-Q 列选择会以这种方式表现尚不清楚,但这并不重要,因为目标是仅使用键盘选择列块。在 Vim 中,使用 Ctrl-V 选择块时不使用 Shift

:help mswin 没有提到 CTRL-V 替代方案的这种细微差别。

【讨论】:

虽然我赞成romainl 的回复并通过卸载mswin.vim 来“选择”它,但它并没有从最严格的意义上回答原始问题。该问题的原始未回答修订版省略了需要使用箭头键(如在 vi/vim 的其他修订版中使用的那样),因此Ingo Karkat 建议的命令序列为j1w是可以理解的和有教育意义的,但仍然没有解决问题背后的意图。总而言之,这个答案仍然是回答所提问题的答案,尽管非常感谢 romainl 对该问题的扩展感知。 已经有一段时间了,但您可能会觉得它很有趣。您想知道Why Ctrl-Q columnar selection behaves this way:因为它切换选择类型。当前选择,而不是未来的亮点动作!请尝试以下操作:将光标移动到所需块的起始位置,按住 shift,将光标移动到所需块的结束位置(忽略它会进行正常的行选择),现在释放 shift 并按Ctrl+Q。从头到尾的线性选择将变成从头到尾的垂直/块选择。现在,如果您随后立即移动了光标,您将取消选择!【参考方案2】:

最好的办法是从你的 vimrc 中删除这些行。它们完全没有必要,而且改变了太多的基本 Vim 功能。

【讨论】:

+1 在发现 GVim 也没有像我在 Vim 中那样进行仅键盘复制/粘贴之后,我倾向于同意。我不记得 _vimrc 是如何在其中安装此设置的,但现在想知道它是否默认以这种方式安装。您的回答让我四处寻找,发现我上次编辑 _vimrc 是在 09 年,并且编辑后的文件缺少 mswin.vim 的源,而标记为“原始”的备份副本存在。我的旧系统崩溃了,我想我忘记了我已经自定义了我的 _vimrc。因为这样的事情,我一直在避免使用 GVim——也许我现在可以停止避免使用它了。【参考方案3】:

mswin.vim 中的noremap &lt;C-Q&gt; &lt;C-V&gt; 将原始命令重新映射为 Ctrl + Q

如果包含 mswin.vim,按 Ctrl + Q 后,指示的模式应该切换到 Visual Block,并且任何移动 (例如 j, l, w) 扩展了视觉选择。如果这对你不起作用,你可能有一些干扰。

这些移动命令本身是否已重新映射,或者CursorMoved 上是否有autocmd?!尝试禁用您的插件 (vim --noplugin) 和大部分 .vimrc

请注意,光标键通常不会构成正确的移动(并且它们在 Vim 中的使用是不受欢迎的)。

您认为扩展选择的正确(也是唯一)方法(使用移动的光标键)只是:set selectmode=key 的结果,正如:behave mswin 所做的那样。

【讨论】:

"... 光标键通常不构成适当的移动(并且它们在 Vim 中的使用是不受欢迎的)是非常无用的,并且表明使用键盘来指示移动的长期、正常的方式是不合适的, 虽然 gvim 本身在不包含 mswin.vim 时支持这样的输入。 描述 OP 对“扩展选择的正确(也是唯一)方法”的看法的陈述可能是不正确的。引用的答案只是记录了一种获得所需行为的方法,并且没有断言没有其他正确和正确的方法来完成列选择。 关于“长期的、正常的键盘使用方式”:创建 vi(Vim 的前身)时,没有光标键。 catonmat.net/blog/why-vim-uses-hjkl-as-arrow-keys由于位置较远,仍然无法快速编辑。 我们不必拘泥于过去的局限,这当然是一种祝福。这个问题让我敏锐地意识到,我同样感谢布拉姆·穆勒纳尔(Bram Moolenaar)没有因为过去的局限而盲目地削弱自己。在这种情况下,位置距离的影响很小。在编辑栏目时,我很少生成内容,任何因距离而变慢的原因都是因为很容易记住如何使用工具,因为许多其他工具也以这种方式工作。我在 SVR3/SVR4 上使用了 vi。我不打算回去了。应该很容易找出原因。

以上是关于GVim Win32 中的仅键盘列块选择,或者当包含 mswin.vim 时,为啥 Ctrl-Q 不模拟 Ctrl-V?的主要内容,如果未能解决你的问题,请参考以下文章

.NET下如何拦截鼠标、键盘消息?Win32NET来帮你

gvim 全屏f11

gvim 全屏f11

win32 窗口阻止键盘布局更改

如何将键盘事件发送到 Pywin32 中的不同窗口?

Gvim的字体颜色背景设置