Henry Henry
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)

Henry

小学生中的前端大佬
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)
  • 说明
  • Vim

    • 环境准备
    • vim normal 模式中文输入法切换问题
      • im-select 实现
      • win autohotkey 实现
      • mac-BetterAndBetter
      • mac-Rime
    • vim-01-存活下来
    • vim-02-掌握行相关的命令
    • vim-03-掌握 vim 的语法
    • vim-04-更有效率的处理单字符&undo&redo
    • vim-复习 -1
    • vim-05-掌握可视化模式
    • vim-06-文本对象
    • vim-07-在单文件中移动的更快
    • vim-08-掌握搜索命令
    • vim-复习 -2
    • vim-09-更高效的移动 - 想去哪里就去哪里
    • vim-10-认识数字&点的威力
    • vim-11-掌握多文件之间的跳转
    • vim-12-处理包裹字符的符号
    • vim-复习 -3
    • vim-13-替换字符
    • vim-14-掌握悬浮显示&大小写&注释
    • vim-15-掌握窗口的管理
    • vim-16-删除函数
    • vim-复习 -4
    • vim-17-掌握宏
    • vim-18-调用 vscode 的命令
    • vim-复习 -5
  • VSCode

  • Chrome

  • iTerm

  • mac

  • Obsidian

  • lazygit

  • 学习双拼
  • Vim 技巧

  • 键盘侠
  • Vim
Henry
2022-06-01
目录

vim normal 模式中文输入法切换问题

# im-select 实现

使用 vim 过程会频繁切换状态,在 insert 模式下,主力使用的中文输入法,比如搜狗输入法、微软拼音输入法等,而在 normal 模式下敲命令都是需要英文状态的,为了切换到 normal 模式时输入法能自动切换为英文状态,vscodevim (opens new window) 插件推荐使用 im-select (opens new window)。

这里是 windows 的操作步骤:如何解决 VSCode Vim 中文输入法切换问题-im-select (opens new window)

mac 也是类似操作,必须有两个输入源,一个中文输入,比如系统自带的或搜狗之类的三方输入法,一个是英文输入,一般选系统自带的就可以了

首先先安装 im-select (opens new window)

将以下部分插入到 vscode 的 settings.json 里面

// 开启自动切换输入法
"vim.autoSwitchInputMethod.enable": true,
// 设置默认输入法,值获取方法:切换到系统的英文输入法,在命令行输入 im-select 就可以获取当前输入法的值了
"vim.autoSwitchInputMethod.defaultIM": "com.apple.keylayout.ABC",
// im-select 安装路径,在命令行输入 which im-select 获取
"vim.autoSwitchInputMethod.obtainIMCmd": "/usr/local/bin/im-select",
"vim.autoSwitchInputMethod.switchIMCmd": "/usr/local/bin/im-select {im}"
1
2
3
4
5
6
7

测试了一下,insert 模式是自带中文,ctrl + [ 后就切换到自带英文了,再切到 insert 模式,还是中文

这样其实已经实现了 normal 模式下中文输入法切换的问题,但切回 insert 模式后,还保留原输入模式,很多时间我们都不知道在 insert 模式到底是啥了

我们的终极需求是 normal 模式是英文,切回 insert 模式还是英文,这样我们就不需要考虑输入源的问题了,否则我切到 insert 模式 还得看一下到底是中文还是英文

当然如果你能接受现在这种效果,按照上面的配置一下就可以了

# win autohotkey 实现

先来说一下 windows 如何借助 autohotkey 实现

还是需要两个输入源

先参考一下这个文章,不需要跟着操作,就熟悉一下流程即可:如何解决 VSCode Vim 中文输入法切换问题-autohotkey (opens new window)

这篇文章是直接把切换输入法的值写死了

PostMessage, 0x50, 0, 0x4090409, , A ;切换为英文 0x4090409=67699721

万一以后变了呢?或者我想切换别的英文输入法呢?

最好的办法是给切换英文输入绑定一个快捷键,切换 normal 模式后模拟按键,这样就比较灵活一点

可以看到我配置的切换到英文是 ctrl + 0,切换输入法是 ctrl + shift

接下来我们就需要在 autohotkey 中改键了:按下 CapsLock + [, 模拟按键 Esc, 模拟按键 ctrl + 0

; CapsLock + [ 进入 normal 模式,并切换到英文输入法
CapsLock & [::
Send {Esc}
Send ^0
return
1
2
3
4
5

这样当我们按下 CapsLock + [ 后,就会先触发 Esc 按键,切换到 normal 模式,再触发 ctrl + 0,切换到英文输入法。

而当我们再切回 insert 模式时,仍然是英文输入法

这只是一个简单了例子,在上一篇中实现了 CapsLock 短按切换输入法,先按其他功能键再按 CapsLock 为切换大小写;CapsLock 与其他某个键同按时,CapsLock 映射为 ctrl,如 CapsLock + w => ctrl + w

当然,CapsLock + [ 进入 normal 模式,并切换到英文输入法这个功能肯定还是有的

# mac-BetterAndBetter

先参考一下这个文章,不需要跟着操作,就熟悉一下流程即可:在 Mac 上使用多输入法?尝试用 AppleScript+自动操作实现快捷切换到指定输入法。 (opens new window)

文章中提到的 Inputsource 目前已经不维护了,我们使用 im-select 代替;而且使用 Inputsource + 输入法名称 即可切换到该输入法,同样,使用 im-select + 输入法名称 也可以切换到该输入法

所以我们只需要修改一下 AppleScript 代码即可:

set nowInput to (do shell script "/usr/local/bin/im-select")
if nowInput is not "com.apple.keylayout.ABC" then
  do shell script "/usr/local/bin/im-select com.apple.keylayout.ABC"
end if
tell application "System Events"
	key code 53
end tell
1
2
3
4
5
6
7

实际测试发现在别的软件可以正常执行(如果不生效,看看是不是没有给权限),在 vscode 中只是切换到 normal 模式,并没有切换输入法,猜测是快捷键冲突,vscode 优先于系统,所以不生效

所以就引出了今天的主角:BetterAndBetter (opens new window)

在 脚本库 中增加上面的代码:

然后在 键盘 中给 vscode 绑定快捷键 ctrl + [ 及刚才的脚本

这样我们就可以实现 ctrl + [ 进入 normal 模式并切换为英文输入法了

上图我们是给 vscode 绑定的这个快捷键,只在 vscode 中生效,如果想要在全局生效,可以在 所有应用程序 中绑定

当然 BetterAndBetter 的功能远不止于此,触摸板增强,鼠标增强,快捷键增强,这里应有尽有,强烈推荐下载

更新:

使用 im-select 虽然可以解决我们的问题,但使用 ctrl + [ 进入 normal 模式总是比较慢,也可以理解,毕竟要先判断当前输入源,中文的话还需要切换输入法,肯定会慢的,而 Windows 就没有这个问题

当我们正键指如飞的时候,一点卡顿就很影响编码,故我一直在寻找像 Windows 一样,可以给输入法绑定快捷键的软件

终于发现一个软件:hatashiro/kawa: A macOS input source switcher with user-defined shortcuts. (opens new window),可以给输入法绑定快捷键,与 Windows 一样

那这就简单了,下载安装,先给英文输入法绑定一个快捷键:

这里和 Windows 保持统一,使用 cmd + 0

然后改一下我们的 AppleScript 吧:

tell application "System Events"
  key code 53
  key code 29 using {command down}
end tell
1
2
3
4

大功告成,使用 ctrl + [ 进入 normal 模式明显快了很多

# mac-Rime

具体设置看这里:解决 Vim 中英文切换的问题 | Vim 党狂喜_哔哩哔哩_bilibili (opens new window)

但该方式不支持两个输入法,只是在 Rime 内部切换中英文,类似搜狗

而我有两个输入法的需求,使用 ShowyEdge (opens new window) 切换输入法时可以知道当前是中文还是英文,使用一个输入法无法识别中英文,故放弃此方案了,仍使用上面的方案

更新 1:

用 rime 的同学可以换下配置

https://github.com/fkxxyz/rime-cloverpinyin

这个配置要好用很多 非常贴近搜狗了

双拼方案:https://github.com/fkxxyz/rime-cloverpinyin/issues/7#issuecomment-701865083

更新 2:

rime 有设置绑定英文输入法的快捷键,快捷键绑定 esc 可实现 normal 模式自动转英文了,这应该是 windows 党的解决 vim 中英切换的问题了

key_binder/bindings:
 - { when: always, accept: Release+Escape, toggle: ascii_mode }
1
2

ctrl+[ 就把 Release+Escape 换成 Release+Control+bracketleft

编辑 (opens new window)
#Vim
上次更新: 5/27/2023, 1:02:05 PM
环境准备
vim-01-存活下来

← 环境准备 vim-01-存活下来→

最近更新
01
version 1.15
07-01
02
version 1.14
06-27
03
version 1.13
06-27
更多文章>
Theme by Vdoing | Copyright © 2017-2023 HenryTSZ | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式