执行这段代码会有异常的表现

(defun compare-strings ()
  (interactive)
  (setq bufferA (get-buffer-create "*A*"))
        (setq bufferB (get-buffer-create "*B*"))
    (with-current-buffer bufferB
      (erase-buffer)
      (insert (current-kill 0)))
    (with-current-buffer bufferA
      (erase-buffer)
      (insert (current-kill 1)))
    (ediff-buffers bufferA bufferB))

在 emacs -Q 中用 C-x C-e 执行这个后会非常奇怪, 比如 M-x 按 tab 补全会提示:

但明明我都还没执行这个 compare-strings, 我只是执行了它的定义, 为什么就会这样? 再说这个代码有什么 bug 呢?

compare-strings 是一个内置函数,你覆盖了原有函数,两者参数不一样。

2 个赞

claud给出的建议:

这段代码中的主要问题是:

  1. 没有适当的错误检查和异常处理。比如get-buffer-create和insert可能会失败,但是代码没有检查和处理这些情况。
  2. 使用current-kill获取kill ring中的内容不够可靠。current-kill依赖于kill ring的状态,如果kill ring为空,这段代码会失败。
  3. 直接擦除新创建的buffer,没有进行确认。
  4. ediff-buffers被直接调用,没有进行参数校验。
  5. 没有清理工作,创建的buffer可能会残留。
  6. 代码中的变量名bufferA和bufferB意义不明确。
  7. 代码格式问题,如比较混乱的缩进。
  8. 没有注释来说明代码的目的和用途。
  9. 函数compare-strings的名称不符合命名约定。

总体来说,这段代码比较脆弱,没有进行充分的错误处理,参数校验和清理工作,存在可靠性问题。需要重新考虑代码的结构,增加弹性,并遵循Emacs Lisp的最佳实践进行改进。