在支持模态文本编辑的编辑器,比如 vim, helix, vscode的vim模式等,在使用 esc键后会进入默认的普通模式(normal mode),这个时候的操作基本是在英文输入状态下完成操作。再使用 ime 中文输入法的情况下,我们使用esc后必须切换回英文输入,无疑对模态操作多了一次步骤。这里我们可以在使用esc时同时切换输入法来解决该问题。

大致的解决办法是:

  1. cli 切换系统输入法
  2. 在编辑器中为 esc 配置命令切换为英文

linux gnome4 ibus

IBus 是一款输入法框架。具体使用可以参考 wiki-ibus

ibus 提供了工具 ibus engine 查看当前的输入法标识,使用 ibus engine rime 切换输入法为rime。 但在 gnome 4 版本中,该命令无法和gnome-shell中的系统状态的输入法保持一致。这个时候我们使用一款 gnome-shell-ibus-switcher 插件来解决该问题。 ibus-switcher 为 gnome-shell 42 版本后 提供了利用 d-bus 切换输入法的方式,从而切换系统输入法

ibus-switcher 提供

  • 获取当前输入法 org.gnome.Shell.Extensions.IbusSwitcher.CurrentSource
  • 切换当前输入法 org.gnome.Shell.Extensions.IbusSwitcher.SwitchSource

比如获取当前输入法

dbus-send --session --type=method_call --print-reply=literal --dest=org.gnome.Shell /org/gnome/Shell/Extensions/IbusSwitcher org.gnome.Shell.Extensions.IbusSwitcher.CurrentSource

因为我使用了 ibus-rime,所以获取到的值是 1|小 (这里的数字是输入法的序号,|为分隔符,后面跟的是输入法的名称首字母), 1|A 就是 ibus-rime 的英文输入。这个具体看自己的配置情况。

切换输入法到英文

dbus-send --session --type=method_call --print-reply=literal --dest=org.gnome.Shell /org/gnome/Shell/Extensions/IbusSwitcher org.gnome.Shell.Extensions.IbusSwitcher.SwitchSource uint32:1 string:A

这里创建 Python 脚本 ibus-switch.py

#!/usr/bin/python

import subprocess
import os

cmd_read_im = "dbus-send --session --type=method_call --print-reply=literal --dest=org.gnome.Shell /org/gnome/Shell/Extensions/IbusSwitcher org.gnome.Shell.Extensions.IbusSwitcher.CurrentSource"

im = subprocess.run(cmd_read_im, shell=True, capture_output=True, text=True).stdout.strip()

# 检查是否为中文
if (im == "1|小"):
    cmd_switch_ibus_a = "dbus-send --session --type=method_call --print-reply=literal --dest=org.gnome.Shell /org/gnome/Shell/Extensions/IbusSwitcher org.gnome.Shell.Extensions.IbusSwitcher.SwitchSource uint32:1 string:A"
    subprocess.call(cmd_switch_ibus_a, shell=True)

vscode vim

vscode vim 提供了 Input Method

"vim.autoSwitchInputMethod.enable": true,
"vim.autoSwitchInputMethod.defaultIM": "xkb:us::eng",
"vim.autoSwitchInputMethod.obtainIMCmd": "/usr/bin/ibus engine",
"vim.autoSwitchInputMethod.switchIMCmd": "/usr/bin/ibus engine {im}"

vim neovim

neovim 插件 nvim-ibus-sw.

helix

helix 配置文件,打开 hx 后输入 :config-open, 或者直接编辑 ~/.config/helix/config.toml

[keys.normal]
"esc" = [":pipe-to python your-path/ibus-switch.py", "normal_mode"]
[keys.insert]
"esc" = [":pipe-to python your-path/ibus-switch.py", "normal_mode"]

Mac 平台

macism 提供了 mac 平台下输入法切换工具。

通过 brew 安装

brew tap laishulu/macism
brew install macism

helix

[keys.normal]
"esc" = [":sh macism com.apple.keylayout.ABC", "normal_mode"]
[keys.insert]
"esc" = [":sh macism com.apple.keylayout.ABC", "normal_mode"]

window 平台

im-select 提供了 window 平台的输入法切换工具。