You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Overleaf(CodeMirror)编辑器实现Vim-LaTeX自定义按键绑定?

解决方案

问题原因

你的kk这类绑定失效,是因为CodeMirrorVim的插入模式映射需要用CodeMirrorVim.Vim.imap()而非通用的map()——map()默认作用于普通模式,插入模式必须明确使用imap。另外要确保脚本在CodeMirror和CodeMirrorVim完全加载后再执行,否则会因找不到对象导致绑定失败。

Tampermonkey完整脚本

// ==UserScript==
// @name         CodeMirror Vim LaTeX 快捷键绑定
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  给CodeMirror Vim模式添加LaTeX风格输入绑定和希腊字母快捷输入
// @match        *://YOUR_TARGET_DOMAIN/*  // 替换成你使用的CodeMirror所在网站域名,比如*://*.overleaf.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 轮询等待CodeMirror和CodeMirrorVim加载完成
    function waitForVimReady() {
        if (typeof CodeMirror !== 'undefined' && typeof CodeMirrorVim !== 'undefined') {
            setupAllBindings();
        } else {
            setTimeout(waitForVimReady, 100);
        }
    }

    function setupAllBindings() {
        const Vim = CodeMirrorVim.Vim;

        // 保留已生效的jj退出插入模式
        Vim.map("jj", "<Esc>", "insert");
        // 修复kk映射<C-j>(插入模式专用)
        Vim.imap("kk", "<C-j>", "insert");

        // 转换tex.vim中的IMAP绑定
        // FTX → \text{<++>}<++>
        Vim.imap("FTX", "\\text{<++>}<++>", "insert");
        // FCA → \mathcal{<++>}<++>
        Vim.imap("FCA", "\\mathcal{<++>}<++>", "insert");
        // EBM → 自动生成矩阵结构(处理换行)
        Vim.imap("EBM", "\\begin{bmatrix}\n<++>\n\\end{bmatrix}", "insert");

        // 希腊字母快捷输入:输入触发键自动替换为LaTeX命令
        const greekMap = {
            a: "\\alpha",
            b: "\\beta",
            g: "\\gamma",
            G: "\\Gamma",
            d: "\\delta",
            D: "\\Delta",
            e: "\\epsilon",
            z: "\\zeta",
            h: "\\eta",
            th: "\\theta",
            TH: "\\Theta",
            i: "\\iota",
            k: "\\kappa",
            l: "\\lambda",
            L: "\\Lambda",
            m: "\\mu",
            n: "\\nu",
            x: "\\xi",
            X: "\\Xi",
            o: "\\omicron",
            p: "\\pi",
            P: "\\Pi",
            r: "\\rho",
            s: "\\sigma",
            S: "\\Sigma",
            t: "\\tau",
            u: "\\upsilon",
            U: "\\Upsilon",
            phi: "\\phi",
            PHI: "\\Phi",
            ch: "\\chi",
            psi: "\\psi",
            PSI: "\\Psi",
            w: "\\omega",
            W: "\\Omega"
        };

        // 批量注册希腊字母映射
        Object.entries(greekMap).forEach(([trigger, cmd]) => {
            Vim.imap(trigger, cmd, "insert");
        });
    }

    waitForVimReady();
})();

关键提示

  1. 域名替换:把脚本里的@match值改成你实际使用CodeMirror的网站域名,比如Overleaf就写*://*.overleaf.com/*。
  2. 强制覆盖绑定:如果遇到原有绑定冲突,可在触发键后加!强制覆盖,比如Vim.imap("FTX!", "\\text{<++>}<++>", "insert")。
  3. 希腊字母扩展:你可以根据自己的习惯修改greekMap里的触发键和对应命令,比如添加更多特殊字符绑定。

内容的提问来源于stack exchange,提问作者Huibin Chang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:01:10