V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hadixlin
V2EX  ›  程序员

改善编程体验: IdeaVimExtension 介绍

  •  
  •   hadixlin · 2019-05-31 15:57:02 +08:00 · 2937 次点击
    这是一个创建于 1763 天前的主题,其中的信息可能已经有所发展或是发生改变。

    动机

    Intellij IDEA 是个非常优秀的开发环境,提供了相当好用的快捷键,让用户有机会脱离鼠标来使用 IDE.

    另外官方还提供了 IdeaVim 插件,熟悉 vim 的用户可以使用几乎与 vim 相同的方式操作 IDEA 的编辑器来编写代码.但是作为非英文用户,却有一个"输入法切换"的痛点.

    考虑如下两种情况:

    1. 编辑器中在 insert 模式下,编写了一段中文注释,然后需要回到 normal 模式移动光标到其他位置继续编写代码.
    2. 正在编辑器 normal 模式下操作,此时突然有紧急邮件或者钉钉消息需要回复,输入法切换为中文回复后再回到编辑器.

    类似上面两种场景,当回到 normal 模式编辑器时,我们都不得不人工操作一次输入法切换,即使您已经为输入法切换设置了非常好用的快捷键(按一下 Shift),这个操作依然是恼人的,经常会忘记,输入几个字符后才发现,这可能带来误操作.

    我们的期望只有一个:

    在任何情况下,进入 normal 模式,输入法必是英文状态.

    因此我基于 IdeaVim 的扩展点开发了一个帮助切换输入法的小插件IdeaVimExtension

    IdeaVimExtension 安装使用

    1. 如果您已经是 IdeaVim 的用户,那么直接在 Intellj IDEA 的插件中心搜索IdeaVimExtension进行安装.或者到IdeaVimExtension插件主页进行下载安装.

      IdeaVimExtension 是依赖 IdeaVim 的,需要事先安装 IdeaVim

    2. 确保你的操作系统已经开启了英文输入法

      • Windows 需要开启 en_USimage-20190320104934233输入法

      • macOS 需要开启 ABCimage-20190320104604867

        或 en_USimage-20190320104634422输入法

      • Linux 需要使用小企鹅输入法(Fcitx)

    3. 安装重启 IDEA 后,输入法自动切换功能会默认启用

    也可以通过打开任意代码编辑器在 normal 模式下输入如下两个命令来激活 IdeaVimExtension 插件

    • :set keep-english-in-normal : 在 normal 模式保持英文状态(这也是默认启用的状态)
    • :set keep-english-in-normal-and-restore-in-insert : 在 normal 模式保持英文状态,并在回到 insert 时恢复输入法到原来的状态.例如,编写一段中文注释,用中文输入法写了一段文字,进入 normal 模式移动光标到下一行,再回到插入模式继续使用中文编辑.
    1. 上面两个命令在每次 IDEA 重启后都需要重新输入,也可以通过在用户目录下添加.ideavimrc文件,将命令添加到该文件中,这样在 IDEA 重启时可以自动执行该文件中的指令.另外,该文件中也可以添加其他受支持的 vim 指令.类似 vim 的.vimrc文件.

    2. 如果要关闭输入法切换功能直接直接输入对应的:set nokeep-english-in-normal[-and-restore-in-insert]

    接下来就可以愉快的使用全键盘操作来编写代码了.

    额外一点分享

    相信很多同学都是使用苹果电脑的.苹果电脑的键盘设计对 vim 用户越来越不友好了.对 vim 用户来说ESC是个非常高频的按键.但是苹果键盘的ESC设计比较小,且位置偏远,有 bar 的新 MBP 的ESC是虚拟的基本没有任何按键反馈.我的处理方法是使用karabiner软件将ESC和不常用的~进行交换.

    另外键盘上的方向键,新 MBP 的上下被缩小到一个按键的面积偏小,且需要移动右手去按,对编写代码这样的文字工作是不友好的在使用 vim 编辑器是可以通过hkjl来替换,但也总有非 vim 环境需要使用方向键,比如 IDEA 的 Project 视图等.我的处理方法是设置Ctrl+hkjl来替换方向键,为了纠正习惯将原始的方向键禁用了.

    最后CapsLock键用处不大,有时会误按造成 vim-normal 模式下的误操作,所以我将该键跟左下角的 Ctrl 交换了.这样既改善了Ctrl的按键体验,也可以避免误按CapsLock

    Windows 用户请自行寻找键位映射工具.

    v2ex 不能上传附件,所以需要我的 karabiner 配置文件的朋友可以发邮件给我: [email protected]

    该文初始发表在hadix.xyz

    第 1 条附言  ·  2019-05-31 18:01:12 +08:00

    1.3.6版本才会默认开启自动输入法切换,但这个版本目前还在插件中心审核中,预计明天可以通过插件中心升级。 1.3.5及之前的版本,安装后需要使用:set keep-english-in-normal来启用

    19 条回复    2020-12-12 17:05:45 +08:00
    mr2xd
        1
    mr2xd  
       2019-05-31 17:30:35 +08:00
    https://github.com/hadix-lin/ideavim_extension/issues/9

    “ macOS 需要开启 ABC 或 en_US 输入法”

    开了 ABC,中文用系统双拼不生效
    hadixlin
        2
    hadixlin  
    OP
       2019-05-31 17:59:04 +08:00
    @mr2xd 我试了一下是可以的,你试一下先执行`:set keep-english-in-normal`

    默认开启输入法自动切换功能需要使用 1.3.6 版本,估计要明天插件中心才能通过审核。
    lihongjie0209
        3
    lihongjie0209  
       2019-05-31 18:01:59 +08:00
    我记得 vim 插件和 idea 的快捷键有冲突
    chendy
        4
    chendy  
       2019-05-31 18:14:58 +08:00
    快捷键有冲突+1,门槛更高了…
    Sivan
        5
    Sivan  
       2019-05-31 18:15:35 +08:00 via iPhone
    太感谢了🙏!之前就是因为这个原因把我 IdeaVim 关掉的。
    mr2xd
        6
    mr2xd  
       2019-05-31 19:33:14 +08:00
    @hadixlin #2 执行过的,和 ideavim 一起重新启停,添加到.ideavim 都没用,去年试用过没这个问题
    di94sh
        7
    di94sh  
       2019-05-31 19:36:03 +08:00 via Android
    用了很长时间了,写完代码狂按 esc😋。
    di94sh
        8
    di94sh  
       2019-05-31 19:37:19 +08:00 via Android
    @lihongjie0209 可以设置是用 vim 的还是 idea 的。
    lihongjie0209
        9
    lihongjie0209  
       2019-05-31 19:59:47 +08:00
    @di94sh 但是没办法共存, 所以还是放弃了
    hadixlin
        10
    hadixlin  
    OP
       2019-05-31 22:14:15 +08:00 via iPhone
    @lihongjie0209 看个人习惯,找到自己最舒服的点就好
    hadixlin
        11
    hadixlin  
    OP
       2019-05-31 22:16:36 +08:00 via iPhone
    @mr2xd 配置文件应该是.ideavimrc
    hadixlin
        12
    hadixlin  
    OP
       2019-05-31 22:18:29 +08:00 via iPhone
    @di94sh 多谢支持,如果使用有问题请反馈给我,谢谢
    yc0826
        13
    yc0826  
       2019-06-03 10:14:45 +08:00
    快捷键有冲突+2,门槛更高了…
    yc0826
        14
    yc0826  
       2019-06-03 10:15:55 +08:00
    主要还是 现在跨应用内容复制操作太多了,对 vim 操作还是很不友好,我的 hhkb 无用武之地了
    hadixlin
        15
    hadixlin  
    OP
       2019-06-03 10:22:24 +08:00 via iPhone
    @yc0826 把 vi 的默认缓冲区设置为系统剪贴板就可以了
    hadixlin
        16
    hadixlin  
    OP
       2019-06-03 10:23:48 +08:00 via iPhone
    @yc0826 说错了不是默认缓冲区,是默认寄存器
    terry1024
        17
    terry1024  
       2020-08-10 11:26:37 +08:00
    太棒了 这插件解决了困扰我很久的问题。
    terry1024
        18
    terry1024  
       2020-12-11 10:01:22 +08:00
    hi 我今天升级了 idea 的 2020.3 apple silicon 测试版 目前使用插件报错

    错误信息如下:
    java.lang.UnsatisfiedLinkError: Unable to load library 'input-source-switcher':
    dlopen(libinput-source-switcher.dylib, 9): image not found
    dlopen(libinput-source-switcher.dylib, 9): image not found
    dlopen(/Users/Terry/Library/Frameworks/input-source-switcher.framework/input-source-switcher, 9): image not found
    dlopen(/Library/Frameworks/input-source-switcher.framework/input-source-switcher, 9): image not found
    dlopen(/System/Library/Frameworks/input-source-switcher.framework/input-source-switcher, 9): image not found
    Native library (darwin-aarch64/libinput-source-switcher.dylib) not found in resource path (/Applications/IntelliJ IDEA.app/Contents/lib/bootstrap.jar:/Applications/IntelliJ IDEA.app/Contents/lib/extensions.jar:/Applications/IntelliJ IDEA.app/Contents/lib/util.jar:/Applications/IntelliJ IDEA.app/Contents/lib/jdom.jar:/Applications/IntelliJ IDEA.app/Contents/lib/log4j.jar:/Applications/IntelliJ IDEA.app/Contents/lib/jna.jar)
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:301)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:461)
    at com.sun.jna.Native.register(Native.java:1722)
    at com.sun.jna.Native.register(Native.java:1443)
    at io.github.hadixlin.iss.mac.MacNative.<clinit>(MacNative.kt:9)
    at io.github.hadixlin.iss.mac.MacInputMethodSwitcher.switchToEnglish(MacInputMethodSwitcher.kt:31)
    at io.github.hadixlin.iss.SystemInputMethodSwitcher.switchToEnglish(SystemInputMethodSwitcher.kt:18)
    at io.github.hadixlin.iss.InputMethodAutoSwitcher$focusListener$1$focusGained$1.run(InputMethodAutoSwitcher.kt:137)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
    Suppressed: java.lang.UnsatisfiedLinkError: dlopen(libinput-source-switcher.dylib, 9): image not found
    at com.sun.jna.Native.open(Native Method)
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:191)
    ... 10 more
    Suppressed: java.lang.UnsatisfiedLinkError: dlopen(libinput-source-switcher.dylib, 9): image not found
    at com.sun.jna.Native.open(Native Method)
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:204)
    ... 10 more
    Suppressed: java.lang.UnsatisfiedLinkError: dlopen(/Users/Terry/Library/Frameworks/input-source-switcher.framework/input-source-switcher, 9): image not found
    at com.sun.jna.Native.open(Native Method)
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:248)
    ... 10 more
    Suppressed: java.lang.UnsatisfiedLinkError: dlopen(/Library/Frameworks/input-source-switcher.framework/input-source-switcher, 9): image not found
    at com.sun.jna.Native.open(Native Method)
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:248)
    ... 10 more
    Suppressed: java.lang.UnsatisfiedLinkError: dlopen(/System/Library/Frameworks/input-source-switcher.framework/input-source-switcher, 9): image not found
    at com.sun.jna.Native.open(Native Method)
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:248)
    ... 10 more
    Suppressed: java.io.IOException: Native library (darwin-aarch64/libinput-source-switcher.dylib) not found in resource path (/Applications/IntelliJ IDEA.app/Contents/lib/bootstrap.jar:/Applications/IntelliJ IDEA.app/Contents/lib/extensions.jar:/Applications/IntelliJ IDEA.app/Contents/lib/util.jar:/Applications/IntelliJ IDEA.app/Contents/lib/jdom.jar:/Applications/IntelliJ IDEA.app/Contents/lib/log4j.jar:/Applications/IntelliJ IDEA.app/Contents/lib/jna.jar)
    at com.sun.jna.Native.extractFromResourcePath(Native.java:1095)
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:275)
    ... 10 more
    hadixlin
        19
    hadixlin  
    OP
       2020-12-12 17:05:45 +08:00
    @terry1024 建议把这个问题提到 github 上,https://github.com/hadix-lin/ideavim_extension/issues
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4070 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:17 · PVG 18:17 · LAX 03:17 · JFK 06:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.