使用 PhpStorm IdeaVim,我无法使用 shift+箭头键选择单词

Posted

技术标签:

【中文标题】使用 PhpStorm IdeaVim,我无法使用 shift+箭头键选择单词【英文标题】:Using PhpStorm IdeaVim, I can't use shift+arrow keys to select words 【发布时间】:2014-03-09 19:28:38 【问题描述】:

我正在使用 phpStorm 7.1.2 和 IdeaVim 插件。

在插入模式下,我想使用Shift + ArrowKey 选择单词。但是,这个 IdeaVim 插件似乎阻止了这样做。我只能使用v 键在命令模式下突出显示单词。

shift+Home/End/PageDown/PageUpshift+ctrl+arrowKeys 都不能正常工作。

我尝试在 Keymap 设置中更改快捷键(即选择右 => shift+right),但没有奏效。

有什么方法可以实现这种非 vim 行为?

更新 1

在他们的bug tracking system 中打开了一张票,没有任何修复。所以我想我不能做我上面描述的。

更新 2(2019 年 11 月 14 日)

从那个 bug 票中的 this last comment 开始,ideaVim 现在支持这种 shift+arrowKeys 选择。在问了这个问题几年后,我从 intellij 搬到了纯 vim,所以我不会尝试这个,但只想更新这个问题以确保完整性。并在编写此更新后看到了@citizenmatt 的答案,因此请参阅下面的@citizenmatt 的答案以获取更多详细信息。

【问题讨论】:

为什么需要那个插件?我猜你喜欢用 vim 编辑。如果是这样,问问自己,是否可以在纯 vim 中做到这一点。你如何在 vim 中进行这些编辑? @Kent 尽管我喜欢 vim 实现移动和编辑功能的方式,但在某些情况下,我还是想在插入模式下使用普通的 shift 键功能。这不是一个问我在哪里可以在纯 Vim 中进行移位操作的问题。相反,我问的是“我能否在 PhpStorm 中使用 IdeaVim 插件进行移位操作” 你似乎已经有了答案。 @romainl 对不起,我不认为我理解你。我对自己有什么答案?你是说我在使用 IdeaVim 插件时不能进行移位操作? 是的,我认为您的问题没有解决方案。 IdeaVim 的目标是在 Idea* IDE 中为我们提供令人信服的 Vim 编辑体验。从这个角度来看,既然你不能在 Vim 中做你所要求的,所以没有理由让它在 IdeaVim 中可行。老实说,我的观点也是在插入模式下应该尊重默认的文本编辑行为,但似乎并非如此。不管怎样,你试过their bug tracker? 【参考方案1】:

我会用以下几行创建一个~/.ideavimrc

nmap <S-Up> v<Up>
nmap <S-Down> v<Down>
nmap <S-Left> v<Left>
nmap <S-Right> v<Right>
vmap <S-Up> <Up>
vmap <S-Down> <Down>
vmap <S-Left> <Left>
vmap <S-Right> <Right>
imap <S-Up> <Esc>v<Up>
imap <S-Down> <Esc>v<Down>
imap <S-Left> <Esc>v<Left>
imap <S-Right> <Esc>v<Right>

它使我的代码以相同的方式选择文本。

【讨论】:

只是评论:@jbyler 的答案最终更实用,因为它暂时禁用了ideavim,这样它就不会干扰其他 IntelliJ 功能。比如当我需要使用多个游标的时候,我禁用ideavim,使用多个游标编辑我想要的,然后我直接回到vim。【参考方案2】:

使用以下行创建 ~/.ideavimrc 文件

nnoremap <S-Left> :action EditorLeftWithSelection<CR>
nnoremap <S-Right> :action EditorRightWithSelection<CR>
nnoremap <S-Up> :action EditorUpWithSelection<CR>
nnoremap <S-Down> :action EditorDownWithSelection<CR>

inoremap <S-Left> <C-O>:action EditorLeftWithSelection<CR>
inoremap <S-Right> <C-O>:action EditorRightWithSelection<CR>
inoremap <S-Up> <C-O>:action EditorUpWithSelection<CR>
inoremap <S-Down> <C-O>:action EditorDownWithSelection<CR>

【讨论】:

这非常有效。它应该是公认的答案。 这比***.com/a/31714564/865499 效果更好,因为我可以将 Shift 与箭头(和 Option/Alt)结合起来,并在选择中添加/减去一个单词。如果我进行初始选择,然后在按住 Shift 键的同时尝试更改它,则另一个解决方案将失败。 使用这个。这是完美的 看起来这在最新版本中被破坏了。任何想法如何通过 .ideavimrc 修复它? 此映射适用于正常和插入模式。但是从 0.52 开始,创建选择会将 IdeaVim 切换到 Visual 或 Select 模式,并且没有指定这些映射。添加另一个带有vnoremap 和可能snoremap 的块,它应该可以按预期工作。但是,也请查看 :set keymodel^=startsel,它是在 0.52 中添加的以正确解决问题(尽管插入模式存在问题 - VIM-1756)【参考方案3】:

这似乎不可能开箱即用。然而,只要你有ideavim,破解插件来删除shift +箭头键的硬编码vim操作并不难。这具有允许使用默认行为的效果。

步骤:

    git clone https://github.com/JetBrains/ideavim.git 在ideavim中打开新克隆的项目。 在文件/项目结构中设置 intellij sdk 依赖项(如有必要)。 编辑ideavim/src/com/maddyhome/idea/vim/RegisterActions.java。 删除所有重新定义 shift+箭头键的键操作)::s%/^.*KeyEvent.VK_\(KP_\)\?\(LEFT\|RIGHT\|UP\|DOWN\), KeyEvent.SHIFT_MASK.*$//。 使用 ant 任务 clean compile dist 进行重建。 通过选项/插件/从磁盘安装插件重新安装插件并找到ideavim/out/dist/ideavim-xx-dev.zip

【讨论】:

感谢乔的提示!我在这里创建了一个包含所有更改和最新安装说明的分支:github.com/epegzz/ideavim 是的,这肯定需要插件中的某种选项。 于是 IdeaVim 经历了一次大重构。我已经破解了一个不绑定到箭头键的副本:github.com/shaunpatterson/ideavim。我最喜欢这个解决方案.. 给了我两个编辑世界中最好的。 您不需要构建自己的版本。可以通过~/.ideavimrc文件中的映射来处理。见this comment。修复 VIM-1756 后,您还可以使用 'keymodel' 选项进行修复。【参考方案4】:

如果您有启用/禁用 IdeaVIM 的绑定,您可以通过暂时禁用 IdeaVIM,然后使用 shift-arrow 选择,然后重新启用 IdeaVIM 来获得 shift-arrow 选择。

Keymap 对话框中的操作称为“Vim Emulator”,在“Default”键盘映射中它绑定到 V;在“Mac OS X 10.5+”键盘映射中,它绑定到 V

您可以在 Preferences => Keymap 对话框或 Help => Find Action... 菜单中查找您的 keymap 的快捷键。

(注意: 也称为“option”或“alt”; 在 Mac 上是“command”键。)

【讨论】:

【参考方案5】:

从 IdeaVim 0.52 开始,VIM-437 已得到修复,您可以使用 'keymodel' 选项启用带有移位键和选择的特殊行为。如果将:set keymodel^=startsel 添加到~/.ideavimrc,则shift + 光标键会将您更改为可视模式(如果'selectmode' 包含key,则为选择模式)。不幸的是,目前似乎存在一个错误,这意味着这仅适用于普通模式,而不适用于插入模式。见VIM-1756。

'keymodel' 有更多可能有用的选项。查看the docs。

【讨论】:

【参考方案6】:

2021 答案

其他答案对我来说仍然存在问题,选择不准确,或者在视觉模式下不工作。

@citizenmatt 在 cmets 中提到使用“set keymodel=startsel”,但我对此有很多问题。即使放开 shift 也会继续选择,而且选择的开始有时会移动一个字符。

如果您想撤消“set keymodel=startsel”,请使用默认设置,“set keymodel=startsel,stopsel”

解决方案

将此添加到您的 ~/.ideavimrc:

nmap <S-Left> <Action>(EditorLeftWithSelection)
nmap <S-Right> <Action>(EditorRightWithSelection)
nmap <S-Up> <Action>(EditorUpWithSelection)
nmap <S-Down> <Action>(EditorDownWithSelection)
imap <S-Left> <Action>(EditorLeftWithSelection)
imap <S-Right> <Action>(EditorRightWithSelection)
imap <S-Up> <Action>(EditorUpWithSelection)
imap <S-Down> <Action>(EditorDownWithSelection)
vmap <S-Left> <Action>(EditorLeftWithSelection)
vmap <S-Right> <Action>(EditorRightWithSelection)
vmap <S-Up> <Action>(EditorUpWithSelection)
vmap <S-Down> <Action>(EditorDownWithSelection)

这使用了新的&lt;Action&gt; 语法,因此您不必担心使用&lt;C-O&gt; 或冲突的递归映射。你永远不会离开原来的模式。

【讨论】:

【参考方案7】:

禁用 Vim 模拟器 2种方式:

1.- Ctrl+alt+v / Cmd+alt+v
2.- Tools (menu) -> Vim emulator

【讨论】:

【参考方案8】:

要添加到 Clavum 的答案 (https://***.com/a/69002041/18003382):以下添加 Shift-Home 和 Shift-End 以将当前选择移动到行首和行尾。

nmap <S-Home> <Action>(EditorLineStartWithSelection)
nmap <S-End> <Action>(EditorLineEndWithSelection)
imap <S-Home> <Action>(EditorLineStartWithSelection)
imap <S-End> <Action>(EditorLineEndWithSelection)
vmap <S-Home> <Action>(EditorLineStartWithSelection)
vmap <S-End> <Action>(EditorLineEndWithSelection)

【讨论】:

【参考方案9】:

我已经破解了最新版本的 IdeaVim,使其不绑定到箭头键。我发现 keymodel 并没有完全做到我想要的。我已经习惯了 Joe Thomas 在以前的版本中的 hack,无法改变我的方式。

我的破解版可以在这里找到:https://github.com/shaunpatterson/ideavim

【讨论】:

【参考方案10】:

我可以建议这可能不是一个好问题吗?

使用 vim 的一个优点是减少了字母数字键和箭头之间的手臂移动量。使用 shift+arrow 违背了这个目的。

一种无需箭头即可实现单词选择的简单方法:

    将光标放在要选择的文本的开头 按v 进入可视模式(相当于按shift 键) 将光标与w 一起移动一次或多次到要选择的文本的末尾。 (这相当于按箭头) 随意剪切/复制

【讨论】:

是的,在使用纯 vim 一段时间后,我同意你所说的。大约 6 年前,当我问这个问题时,我开始使用 vim 后不久。所以我可能正在寻找一种方法来平滑从普通编辑器到 vim 的过渡。现在,我在可视模式下完成所有选择,效果很好。

以上是关于使用 PhpStorm IdeaVim,我无法使用 shift+箭头键选择单词的主要内容,如果未能解决你的问题,请参考以下文章

如何将 IdeaVim 正常模式的键映射到编辑器的操作?

IdeaVim 与 PyCharm 上的 Jupyter Notebook

PHPStorm 无法解析绝对包含路径

无法在 phpstorm 中显示 PDO 类

Intelli IDEA快捷键(配合IdeaVim)(转)

IDEAVIM 常用快捷键总结和使用说明