windows中改造im-select插件使vscode-vim能够记住搜狗输入法的中英文状态
如题
·
最近要给别人的模型写前端,要开发小程序。
不用vim浑身难受。小程序那个微信开发者工具可以和vscode一样使用vim插件。切换模式时保存输入法也是可以的,使用im-select插件就行,但是不能记住输入法之前的状态,就要再按一次shift或Ctrl+space来切换。
这比我在linux中的体验差太多,于是想办法改进。
弄完之后结果如下
确保存在英文和中文输入法
因为要将输入法切换成另一种语言,所以只有中文是切换不了的
获取搜狗输入法的中英文状态
首先找到怎么获取输入法状态,查过资料得知,不同输入法不一样。我用搜狗,就只用了搜狗输入法的
// https://www.zhihu.com/question/529237445
#include <Windows.h>
#include <iostream>
#define IMC_GETOPENSTATUS 0x0005
using namespace std;
#pragma comment(lib, "imm32.lib")
int main() {
HWND hIME = ImmGetDefaultIMEWnd(GetForegroundWindow());
LRESULT status = SendMessage(hIME, WM_IME_CONTROL, IMC_GETOPENSTATUS, 0);
cout << "目前语言:" << (status ? "中文" : "English") << endl;
//system("pause");
return 0;
}
改造im-select
im-select这个开源软件可以切换输入法,通过传入一个代号来实现,比如1033就是英文。vscode-vim就是用了这个软件来切换的。
那么在他进入vim的normal切成英文之前保存搜狗输入法的中英文状态,进入insert时切回搜狗后加载这个状态不就行啦。
将仓库fork一下,修改im-select-win/im-select/im-select/im-select.cpp文件
// ...
#define IMC_GETOPENSTATUS 0x0005
#pragma comment(lib, "imm32.lib")
#include <fstream>
bool isNowChineseStatus() {
HWND hIME = ImmGetDefaultIMEWnd(GetForegroundWindow());
LRESULT status = SendMessage(hIME, WM_IME_CONTROL, IMC_GETOPENSTATUS, 0);
return status;
}
void saveChineseStatus() {
fstream saveFile = fstream("./ChineseState.txt", ios::out | ios::trunc);
saveFile << isNowChineseStatus();
saveFile.close();
}
void CONTROL_SPACE() {
//模拟按ctrl+space键
INPUT inputs[4] = {};
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_CONTROL;
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = VK_SPACE;
inputs[2].type = INPUT_KEYBOARD;
inputs[2].ki.wVk = VK_SPACE;
inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
inputs[3].type = INPUT_KEYBOARD;
inputs[3].ki.wVk = VK_CONTROL;
inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
UINT uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));
}
void loadChineseStatus() {
fstream saveFile = fstream("./ChineseState.txt", ios::in);
bool wasChineseStatus = 0;
saveFile >> wasChineseStatus;
saveFile.close();
if (wasChineseStatus != isNowChineseStatus()) {
Sleep(30);
CONTROL_SPACE();
Sleep(50);
//如果上面的键没用,就按下shift
if (wasChineseStatus != isNowChineseStatus()) {
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
}
}
}
int main(int argc, char** argv)
{
if (argc == 1) {
int imID = getInputMethod();
printf("%d\n", imID);
}
else {
int locale = atoi(argv[1]);
if (locale == 1033)
saveChineseStatus();
switchInputMethod(locale);
if (locale != 1033)
loadChineseStatus();
}
return 0;
}
模拟按键参考了 https://blog.csdn.net/hhy321/article/details/126075812
我的仓库 https://github.com/PDE26jjk/im-select
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)