最近要给别人的模型写前端,要开发小程序。

不用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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐