emacs 的括号匹配有问题, 咋回事/怎么办?

function showOptions() {
// {{{3 获得选项列表, 结果存到mc.list和a中(两者存的一样), 已置. 这一部分的重点是item有什么
  // document.getElementById("answer").parentNode.innerHTML += "<div  style='color:#ff233f;font-size:9px;font-weight:bolder;margin:15px;text-align:right;'></div>"; // 觉得没用, 试了试也没用
  mc.answer = document.getElementById("answer").innerHTML; // 答案字符串
  var b = document.getElementById("optionList"), // b 是指向 optionList
    list = [], // 我感觉这个变量声明在a要用的地方也可以
    a = (mc.list.length ? mc.list : ((list = document.getElementById("options").innerHTML.split("|").map(function (v) { // example: A.证明社会主义革命可能在一国或数国首先取得胜利|B.适应无产阶级实际斗争的要求
      var item = {
        content: v.slice(2), // example: 证明社会主义革命可能在一国或数国首先取得胜利
        id: v.slice(0, 1) // example: A
      };
      if (mc.answer.indexOf(item.id) != -1) item.is_right = 1; // item.is_right, 是否是正确答案, mc.answer 查找看 id 是否能查找到
      return item
    })), list.sort(function () { // , 之前是 a 定义结束, a 和 list 和 mc.list 是一回事
      return Math.random() > 0.5 ? 1 : -1
    }))), // a 和 list存的是置乱的列表. a 和 list 是同一个
    c;
  mc.list = a;
  // {{{3 optionList的innerHTML的设置
  for (c in a) b.innerHTML += "<li onclick='toggle(this)'><input type='$t' name='options' id='$id' onclick='toggle(this.parentNode)' /><label>$label</label></li>".replace("$id", a[c].id).replace("$label", a[c].content).replace("$t", 1 === mc.answer.length ? "radio" : "checkbox"); // 插入 li 节点, li 内部是 input 和 label. 单选 type 是 radio, 多选是 checkbox. label 是显示内容, id 替换为本来的 id ((ref:cnasa))
    // {{{3 替换jiexi字符串, 设置answer2
  var right = '', // 正确选项字符串, 用于显示在答案栏, 存的是不是正确的ABCD, 而是置乱后, 其实就是正确选项在置乱后的列表的index转为字母
    wrong = '', // 错误选项字符串, 这个似乎没用上
    zimu = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'], // 其实会用上的, 也就是答案数目, 应该不超过 D
    jiexi = document.getElementById("jiexi").innerHTML;
  for (var i in mc.list) { // 这里 i 是 indexx
    if (mc.list[i].is_right) {
      right += zimu[i]; // right 和 answer 并不一样, 比如原答案是 A, B, 置乱后, 放在了 C, D 的位置上, 那么 right 存的是 zimu[2] 和 zimu[3], 是 CD
    } else {
      wrong += zimu[i]; // 和 right 相同的意义, 不过存的是错误的, 用上面例子来说, 存的就是 AB
    }
    mc.list[i].new_index = zimu[i]; // 置乱后的 answer
    mc.list[i].sign = Math.random(); // 随机数作 token, 几乎不会重复
    var re = new RegExp(mc.list[i].id, 'g');
    jiexi = jiexi.replace(re, mc.list[i].sign); // 保完全替换, 如果不用 regex, 只会被日环第一处
  }

  for (var i in mc.list) {
    var re = new RegExp(mc.list[i].sign, 'g');
    jiexi = jiexi.replace(re, mc.list[i].new_index);
  }
  document.getElementById("answer2").innerHTML = "【答案】:" + right;
  document.getElementById("jiexi").innerHTML = "" + jiexi
}
// }}}

这里例子中, 16行的)括号应该匹配到第6行一开始的(括号, 但 emacs 匹配到第一行的 { 括号了. 不知道你们有没有这个问题. 如图所示:

有几个问题:

  1. ) 匹配 {, 但明明 ) 就应该只匹配( 的, vim 没有这个问题
  2. ) 会匹配到注释中的 (, vim 也有类似的问题 这个代码块是 org mode 中的一个代码块. 用的是 spacemacs.

更新: 在安装了 javascript layer(spacemacs)后问题就解决了, 所以猜测, 下次 babel 遇到类似的问题, 在 spacemacs 中装上对应语言的 layer 就好了.

你用emacs -Q 启动,开启 show-paren-mode, 看看有没有问题。

在安装了 javascript layer 以后, 这2个问题莫名其妙解决了.

截图能不能标一下 16 行在哪里?

我遇到过一些不匹配的提示是因为注释里面的括号不匹配,我看你这边注释里面有好多 {{{ ,也许和这个有关