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

造轮子: Vim 输入法切换插件

  •  1
     
  •   Neur2n · 2020-02-18 17:22:34 +08:00 · 5399 次点击
    这是一个创建于 1769 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Q:为什么造轮子? A: 纯粹手痒。

    我用过 VimIM,但是切换的时候很卡,也许是电脑不行。做过一些搜索,比如 vim-barbaric 和 vim-xkbswitch 等,要么没有支持 Windows (或者要另外安装 binary ),要么文档太长不想看。所以自己写了一个很简单的,也没有考虑复杂的特性或可能存在的性能隐患,因为还有没用户反馈。先上图。

    但是目前还有不少限制:

    1. Windows 只能在 10 上运行,10 以下的没试过,也许通过配置可以运行。
    2. Windows 10 上需要 Python 3、pynvim、pywin32
    3. Linux 里只在 Ubuntu 16.04 上测试过,而且调用的是 ibus (似乎不少人喜欢用 fcitx )
    4. 没有在 Mac 环境进行开发

    项目页面: https://github.com/Neur1n/neuims (文档还没补全 :p )

    望不吝赐教。

    19 条回复    2020-02-20 15:38:38 +08:00
    Buges
        1
    Buges  
       2020-02-18 17:30:14 +08:00 via Android
    一直想要一个这样的英文输入法
    emonber
        2
    emonber  
       2020-02-18 17:49:04 +08:00 via Android
    可以支持 wsl 环境下的 vim 吗?
    Neur2n
        3
    Neur2n  
    OP
       2020-02-18 18:12:40 +08:00
    @emonber 用的是 ibus 还是 fcitx ?
    emonber
        4
    emonber  
       2020-02-18 21:33:59 +08:00
    @Neur2n WSL 下用的是 Windows 自带输入法哈,不过 vim 调用的 Python 是 WSL 的( Linux ),无法直接使用 win32 api
    MrUser
        5
    MrUser  
       2020-02-18 21:34:20 +08:00
    没看懂有什么用,没有这个一样可以输入中文呀?
    j137tt736CExzlfM
        6
    j137tt736CExzlfM  
       2020-02-18 21:42:30 +08:00
    想在 windows 7 下使用,不知道是否可以
    Neur2n
        7
    Neur2n  
    OP
       2020-02-18 22:02:04 +08:00
    @lazzyboy 我找时间试一下,也可以去 GitHub 开 issue :)
    Neur2n
        8
    Neur2n  
    OP
       2020-02-18 22:02:41 +08:00
    @emonber 我研究一下
    Neur2n
        9
    Neur2n  
    OP
       2020-02-18 22:04:01 +08:00
    @MrUser 目的是切换 insert/normal 模式的时候自动切换输入法,不用手动切换,其实已有很多同类插件
    emonber
        10
    emonber  
       2020-02-18 22:08:22 +08:00
    @Neur2n 搞定了,参考你的代码,写了一个 C++程序来处理:

    ```c++

    int main(int argc, char** argv)
    {
    const int US_HKL = 0x0409;
    const int ZH_HKL = 0x0804;
    HWND hwnd = GetForegroundWindow();

    if (argc > 1) {
    if ((strcmp(argv[1], "en") == 0) ||
    (strcmp(argv[1], "eng") == 0) ||
    (strcmp(argv[1], "off") == 0)) {
    std::cout << "Switch to English IME\n";
    return SendMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, 0, US_HKL);
    }
    else if ((strcmp(argv[1], "cn") == 0) ||
    (strcmp(argv[1], "chn") == 0) ||
    (strcmp(argv[1], "on") == 0)) {
    std::cout << "Switch to Chinese IME\n";
    return SendMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, 0, ZH_HKL);
    }
    }
    std::cout << "Toggle IME\n";
    return SendMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, INPUTLANGCHANGE_FORWARD, 0);
    }
    ```
    kevinhwang
        11
    kevinhwang  
       2020-02-18 23:21:08 +08:00
    如果桌面是 Gnome 的话,毛遂自荐 https://github.com/kevinhwang91/vim-ibus-sw
    Neur2n
        12
    Neur2n  
    OP
       2020-02-19 18:54:09 +08:00
    @lazzyboy #6 我在虚拟机试了一下,是可以的,但是:
    1. 只用了系统内置的输入法进行测试
    2. 如果中文键盘里有两种输入法(比如说拼音和五笔),只能切换到第一个输入法

    如果有兴趣使用这个插件,可以帮忙测试下,或去开个 issue 一起讨论下,谢谢。(项目页面: https://github.com/Neur1n/neuims
    Neur2n
        13
    Neur2n  
    OP
       2020-02-19 18:56:25 +08:00
    @emonber #10 我也用 C++实现了,去掉了 Python 依赖。请问你有 GitHub 吗,我在 acknowledgement 里 @一下你。
    Neur2n
        14
    Neur2n  
    OP
       2020-02-19 18:57:21 +08:00
    @kevinhwang #11 谢谢,我学习一下
    skywind3000
        15
    skywind3000  
       2020-02-19 20:08:53 +08:00
    你这能切换微软拼音的中文 /英文模式么?
    Neur2n
        16
    Neur2n  
    OP
       2020-02-19 20:50:33 +08:00
    @skywind3000 不能。这提醒了我好像 vimim 是可以切换的。但是在 normal 模式下也容易按到 shift 把输入法切换成中文模式,除非有什么方法把 shift 给 block 了。
    skywind3000
        17
    skywind3000  
       2020-02-19 21:24:25 +08:00
    @Neur2n Windows 本来就可以设置禁用 shift 切中英状态的,我现在默认是微软拼音的英文输入,CTRL+SPACE 中英切换,这样用着舒服点,因为 Win+Space 切换语言我留给了中文 /日语 输入法的切换了,两个维度,效率高些。所以需要变成英文模式。很多人应该和我一样吧,GVim 可以正常切换输中英状态的。
    Neur2n
        18
    Neur2n  
    OP
       2020-02-19 23:45:52 +08:00
    @skywind3000 这是一个很好的免插件解决方案。用插件实现有一个目的是避免更改系统设置,可以方便部署到多台电脑,或避免和电脑的其他用户产生习惯冲突。频繁切换输入法而非切换模式,可能对于一些老机器也不友好,所以目前来说可能只能满足小部分人需求。
    emonber
        19
    emonber  
       2020-02-20 15:38:38 +08:00 via Android
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1538 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:39 · PVG 00:39 · LAX 08:39 · JFK 11:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.