/* 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.addCommand({ id: 'test-im-switch-to-english', name: 'Test: Switch to English', callback: () => { this.deactivateIM(); } }); this.addCommand({ id: 'test-im-switch-to-chinese', name: 'Test: Switch to Chinese', callback: () => { this.activateIM(); } }); this.addCommand({ id: 'test-check-im-status', name: 'Test: Check IM Status', callback: () => { this.getFcitxRemoteStatus(); } }); 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; } } } } }); } setupVimModePolling() { // 防止重复设置轮询 if (this.vimModePollingInterval) { clearInterval(this.vimModePollingInterval); } let lastMode = ""; const pollInterval = setInterval(() => { var _a, _b; if (!this.cmEditor) { return; } try { const realCM = this.cmEditor.cm; const currentMode = ((_b = (_a = realCM === null || realCM === void 0 ? void 0 : realCM.state) === null || _a === void 0 ? void 0 : _a.vim) === null || _b === void 0 ? void 0 : _b.mode) || ""; if (currentMode && currentMode !== lastMode) { this.onVimModeChange({ mode: currentMode }); lastMode = currentMode; } } catch (error) { // 忽略轮询错误 } }, 100); this.vimModePollingInterval = pollInterval; } 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.vimModePollingInterval) { clearInterval(this.vimModePollingInterval); } // 清理键盘事件监听器 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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