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 时,光标的变化方式与使用鼠标阻止选择文本时的变化方式相同,但此时任何光标移动都会导致光标变回一个普通的光标。是否继续按住Ctrl、Ctrl-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
建议的命令序列为j
、1
、w
是可以理解的和有教育意义的,但仍然没有解决问题背后的意图。总而言之,这个答案仍然是回答所提问题的答案,尽管非常感谢 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 <C-Q> <C-V>
将原始命令重新映射为 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?的主要内容,如果未能解决你的问题,请参考以下文章