Files
vim-im-switch/main.js
2025-11-11 18:14:34 +08:00

419 lines
38 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
if you want to view the source visit the plugins github repository
*/
'use strict';
var obsidian = require('obsidian');
var child_process = require('child_process');
var util = require('util');
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
var e = new Error(message);
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
};
const DEFAULT_SETTINGS = {
fcitxRemotePath_macOS: '/usr/local/bin/fcitx-remote',
fcitxRemotePath_windows: 'C:\\Program Files\\bin\\fcitx-remote',
fcitxRemotePath_linux: '/usr/bin/fcitx-remote',
englishInputMethod: 'com.apple.keylayout.ABC',
chineseInputMethod: 'auto-detect', // 将自动检测当前中文输入法
};
const pexec = util.promisify(child_process.exec);
var IMStatus;
(function (IMStatus) {
IMStatus[IMStatus["None"] = 0] = "None";
IMStatus[IMStatus["Activate"] = 1] = "Activate";
IMStatus[IMStatus["Deactivate"] = 2] = "Deactivate";
})(IMStatus || (IMStatus = {}));
class VimIMSwitchPlugin extends obsidian.Plugin {
constructor() {
super(...arguments);
this.imStatus = IMStatus.None;
this.fcitxRemotePath = "";
this.editorMode = null;
this.initialized = false;
this.cmEditor = null;
this.lastInsertModeIMStatus = IMStatus.None; // 记住上一次insert模式的输入法状态
this.keyboardListenerSetup = false; // 防止重复设置键盘监听器
this.lastKeyTime = 0; // 防抖:记录上次按键时间
this.currentVimMode = 'normal'; // 跟踪当前vim模式
this.onVimModeChange = (cm) => __awaiter(this, void 0, void 0, function* () {
// 防止短时间内重复处理相同的模式切换
const currentTime = Date.now();
if (cm.mode === this.currentVimMode && currentTime - this.lastKeyTime < 100) {
return;
}
// 更新当前vim模式状态
this.currentVimMode = cm.mode;
if (cm.mode == "normal" || cm.mode == "visual") {
// 进入normal/visual模式前先保存当前输入法状态
yield this.getFcitxRemoteStatus();
if (this.imStatus == IMStatus.Activate) {
this.lastInsertModeIMStatus = IMStatus.Activate;
}
console.log("→ English");
yield this.deactivateIM();
}
else if (cm.mode == "insert" || cm.mode == "replace") {
// 进入insert模式时恢复上次的输入法状态
if (this.lastInsertModeIMStatus == IMStatus.Activate) {
console.log("→ Chinese");
yield this.activateIM();
}
else {
console.log("→ English");
yield this.deactivateIM();
}
}
});
}
onload() {
return __awaiter(this, void 0, void 0, function* () {
console.log('🚀 Loading plugin...');
yield this.loadSettings();
// 尽早设置全局键盘监听器
this.setupObsidianEditorEvents();
this.addSettingTab(new IMSwitchSettingTab(this.app, this));
this.app.workspace.on('file-open', (file) => __awaiter(this, void 0, void 0, function* () {
if (!this.initialized) {
yield this.initialize();
}
if (this.cmEditor) {
yield this.getFcitxRemoteStatus();
this.lastInsertModeIMStatus = this.imStatus;
yield this.deactivateIM();
if (typeof this.cmEditor.off === 'function') {
this.cmEditor.off("vim-mode-change", this.onVimModeChange);
}
if (typeof this.cmEditor.on === 'function') {
this.cmEditor.on("vim-mode-change", this.onVimModeChange);
}
}
}));
this.app.workspace.on('active-leaf-change', (leaf) => __awaiter(this, void 0, void 0, function* () {
if (this.app.workspace.activeLeaf.view.getViewType() == "markdown") {
if (!this.initialized) {
yield this.initialize();
}
if (this.cmEditor) {
yield this.getFcitxRemoteStatus();
this.lastInsertModeIMStatus = this.imStatus;
yield this.deactivateIM();
this.setupObsidianEditorEvents();
}
}
}));
});
}
initialize() {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
return __awaiter(this, void 0, void 0, function* () {
if (this.initialized) {
return;
}
if ('editor:toggle-source' in this.app.commands.editorCommands) {
this.editorMode = 'cm6';
}
else {
this.editorMode = 'cm5';
}
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
if (view) {
if (this.editorMode == 'cm6') {
const possiblePaths = [
(_c = (_b = (_a = view.sourceMode) === null || _a === void 0 ? void 0 : _a.cmEditor) === null || _b === void 0 ? void 0 : _b.cm) === null || _c === void 0 ? void 0 : _c.cm,
(_e = (_d = view.sourceMode) === null || _d === void 0 ? void 0 : _d.cmEditor) === null || _e === void 0 ? void 0 : _e.cm,
(_f = view.sourceMode) === null || _f === void 0 ? void 0 : _f.cmEditor,
(_g = view.editor) === null || _g === void 0 ? void 0 : _g.cm,
(_h = view.editor) === null || _h === void 0 ? void 0 : _h.cm
];
for (let i = 0; i < possiblePaths.length; i++) {
const path = possiblePaths[i];
if (path && !this.cmEditor) {
this.cmEditor = path;
break;
}
}
}
else {
const possiblePaths = [
(_j = view.sourceMode) === null || _j === void 0 ? void 0 : _j.cmEditor,
(_k = view.editor) === null || _k === void 0 ? void 0 : _k.cm,
(_l = view.editor) === null || _l === void 0 ? void 0 : _l.cm
];
for (let i = 0; i < possiblePaths.length; i++) {
const path = possiblePaths[i];
if (path && !this.cmEditor) {
this.cmEditor = path;
break;
}
}
}
}
});
}
setupObsidianEditorEvents() {
if (this.keyboardListenerSetup) {
return;
}
const handleKeyDown = (event) => __awaiter(this, void 0, void 0, function* () {
const currentTime = Date.now();
// 防抖100ms内只处理一次
if (currentTime - this.lastKeyTime < 100) {
return;
}
this.lastKeyTime = currentTime;
// 处理ESC键只在insert/replace模式下才切换输入法
if (event.key === 'Escape') {
// 只有在insert或replace模式下按ESC才需要处理输入法
if (this.currentVimMode === 'insert' || this.currentVimMode === 'replace') {
// 退出insert模式前先保存当前输入法状态
const beforeIM = yield this.runCmd(this.fcitxRemotePath, ["-n"]);
const currentIMName = beforeIM.trim();
// 检查当前输入法是中文还是英文
if (currentIMName === this.settings.chineseInputMethod) {
this.lastInsertModeIMStatus = IMStatus.Activate;
console.log('ESC → English (saved Chinese)');
}
else {
this.lastInsertModeIMStatus = IMStatus.Deactivate;
console.log('ESC → English (saved English)');
} // 切换到英文输入法
this.currentVimMode = 'normal';
yield this.deactivateIM();
}
// 如果已经在normal模式ESC键不做任何输入法切换
}
// 处理进入insert模式的按键只在normal模式下
else if (this.currentVimMode === 'normal' &&
['i', 'I', 'a', 'A', 'o', 'O', 's', 'S', 'c', 'C'].includes(event.key) &&
!event.ctrlKey && !event.metaKey && !event.altKey) {
// 延迟一下让Vim先切换模式
setTimeout(() => __awaiter(this, void 0, void 0, function* () {
this.currentVimMode = 'insert';
// 恢复上次的输入法状态
if (this.lastInsertModeIMStatus == IMStatus.Activate) {
console.log("→ Chinese");
yield this.activateIM();
}
else {
console.log("→ English");
yield this.deactivateIM();
}
}), 10);
}
});
// 移除旧的监听器
if (this.obsidianKeyDownListener) {
document.removeEventListener('keydown', this.obsidianKeyDownListener, { capture: true });
}
// 使用capture模式确保更早接收事件
this.obsidianKeyDownListener = handleKeyDown;
document.addEventListener('keydown', handleKeyDown, { capture: true });
this.keyboardListenerSetup = true;
}
runCmd(cmd, args = []) {
return __awaiter(this, void 0, void 0, function* () {
const output = yield pexec(`${cmd} ${args.join(" ")}`);
return output.stdout;
});
}
getFcitxRemoteStatus() {
return __awaiter(this, void 0, void 0, function* () {
if (this.fcitxRemotePath == "") {
console.log("❌ Cannot get fcitx-remote path, please set it correctly.");
return;
}
try {
let fcitxRemoteOutput = yield this.runCmd(this.fcitxRemotePath);
fcitxRemoteOutput = fcitxRemoteOutput.trimRight();
if (fcitxRemoteOutput == "1") {
this.imStatus = IMStatus.Deactivate;
}
else if (fcitxRemoteOutput == "2") {
this.imStatus = IMStatus.Activate;
}
else {
this.imStatus = IMStatus.None;
}
}
catch (error) {
console.log(`❌ Error getting IM status:`, error);
}
});
}
activateIM() {
return __awaiter(this, void 0, void 0, function* () {
if (this.fcitxRemotePath == "") {
console.log("❌ Cannot get fcitx-remote path, please set it correctly.");
return;
}
try {
yield this.runCmd(this.fcitxRemotePath, ["-s", this.settings.chineseInputMethod]);
yield new Promise(resolve => setTimeout(resolve, 100));
}
catch (error) {
console.log("❌ Error activating IM:", error);
}
});
}
deactivateIM() {
return __awaiter(this, void 0, void 0, function* () {
if (this.fcitxRemotePath == "") {
console.log("❌ Cannot get fcitx-remote path, please set it correctly.");
return;
}
try {
yield this.runCmd(this.fcitxRemotePath, ["-s", this.settings.englishInputMethod]);
yield new Promise(resolve => setTimeout(resolve, 100));
}
catch (error) {
console.log("❌ Error deactivating IM:", error);
}
});
}
onunload() {
// 清理 CodeMirror 事件监听器
if (this.cmEditor && typeof this.cmEditor.off === 'function') {
this.cmEditor.off("vim-mode-change", this.onVimModeChange);
}
// 清理键盘事件监听器
if (this.obsidianKeyDownListener) {
document.removeEventListener('keydown', this.obsidianKeyDownListener, { capture: true });
this.keyboardListenerSetup = false;
}
}
loadSettings() {
return __awaiter(this, void 0, void 0, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
yield this.updateCurrentPath();
yield this.detectInputMethods();
});
}
detectInputMethods() {
return __awaiter(this, void 0, void 0, function* () {
if (this.settings.chineseInputMethod === 'auto-detect') {
try {
const currentIM = yield this.runCmd(this.fcitxRemotePath, ["-n"]);
const currentName = currentIM.trim();
if (currentName.includes('pinyin') ||
currentName.includes('chinese') ||
currentName.includes('tencent') ||
currentName.includes('sogou') ||
currentName.includes('baidu')) {
this.settings.chineseInputMethod = currentName;
}
else {
this.settings.chineseInputMethod = 'com.tencent.inputmethod.wetype.pinyin';
}
}
catch (error) {
this.settings.chineseInputMethod = 'com.tencent.inputmethod.wetype.pinyin';
}
}
});
}
updateCurrentPath() {
return __awaiter(this, void 0, void 0, function* () {
console.log(`🖥️ Platform detected: ${process.platform}`);
switch (process.platform) {
case 'darwin':
this.fcitxRemotePath = this.settings.fcitxRemotePath_macOS;
console.log(`🍎 Using macOS path: ${this.fcitxRemotePath}`);
break;
case 'linux':
this.fcitxRemotePath = this.settings.fcitxRemotePath_linux;
console.log(`🐧 Using Linux path: ${this.fcitxRemotePath}`);
break;
case 'win32':
this.fcitxRemotePath = this.settings.fcitxRemotePath_windows;
console.log(`🪟 Using Windows path: ${this.fcitxRemotePath}`);
break;
default:
console.log(`❌ Platform ${process.platform} is not supported currently.`);
break;
}
});
}
saveSettings() {
return __awaiter(this, void 0, void 0, function* () {
yield this.saveData(this.settings);
});
}
}
class IMSwitchSettingTab extends obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
let { containerEl } = this;
containerEl.empty();
containerEl.createEl('h2', { text: 'Settings for Vim IM Switch plugin.' });
new obsidian.Setting(containerEl)
.setName('Fcitx Remote Path for macOS')
.setDesc('The absolute path to fcitx-remote bin file on macOS.')
.addText(text => text
.setPlaceholder(DEFAULT_SETTINGS.fcitxRemotePath_macOS)
.setValue(this.plugin.settings.fcitxRemotePath_macOS)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.fcitxRemotePath_macOS = value;
this.plugin.updateCurrentPath();
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Fcitx Remote Path for Linux')
.setDesc('The absolute path to fcitx-remote bin file on Linux.')
.addText(text => text
.setPlaceholder(DEFAULT_SETTINGS.fcitxRemotePath_linux)
.setValue(this.plugin.settings.fcitxRemotePath_linux)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.fcitxRemotePath_linux = value;
this.plugin.updateCurrentPath();
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Fcitx Remote Path for Windows')
.setDesc('The absolute path to fcitx-remote bin file on Windows.')
.addText(text => text
.setPlaceholder(DEFAULT_SETTINGS.fcitxRemotePath_windows)
.setValue(this.plugin.settings.fcitxRemotePath_windows)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.fcitxRemotePath_windows = value;
this.plugin.updateCurrentPath();
yield this.plugin.saveSettings();
})));
}
}
module.exports = VimIMSwitchPlugin;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbInByb21pc2lmeSIsImV4ZWMiLCJQbHVnaW4iLCJNYXJrZG93blZpZXciLCJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBb0dBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENB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