如何在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(); })();
关键提示
- 域名替换:把脚本里的
@match值改成你实际使用CodeMirror的网站域名,比如Overleaf就写*://*.overleaf.com/*。 - 强制覆盖绑定:如果遇到原有绑定冲突,可在触发键后加
!强制覆盖,比如Vim.imap("FTX!", "\\text{<++>}<++>", "insert")。 - 希腊字母扩展:你可以根据自己的习惯修改
greekMap里的触发键和对应命令,比如添加更多特殊字符绑定。
内容的提问来源于stack exchange,提问作者Huibin Chang
相关产品推荐
相关产品推荐

