改善编程体验: IdeaVimExtension 介绍 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hadixlin
V2EX    程序员

改善编程体验: IdeaVimExtension 介绍

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

    动机

    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     Solana     2758 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 159ms UTC 12:37 PVG 20:37 LAX 05:37 JFK 08:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86