emacs – 当elisp函数以不同方式运行时的结果不同;为什么?

编辑:也许(在原始帖子中)我错误地使用了“瞬态”一词(我对术语还不够熟悉).我真正的意思是,当用户按下导航键时,突出显示的区域将立即消失. arrow-keys …(第二编辑:我删除了“瞬态”一词)

选择一个区域以便用户获得“光标键移动将突出显示消失”的特殊问题一直是我最近存在的祸根.根据我运行以下脚本的方式,我会得到不同的结果.

为什么它会给出不同的结果,更具体地说,是否有一种方法可以使它产生“光标键使突出显示消失”,无论哪种模式正在运行,或者是否在测试时进行评估? .. CUA模式有这种行为,但我真的需要非CUA模式也这样做(和eval,如果可能的话)……

结果如下,后面是代码. (GNU Emacs 23.1.1)

>启用CUA模式

>通过C-x C-e评估 – 两者(call-trans-hi)和(trans-hi)
NO-GO:设置标记和移动指向EOL,但没有突出显示.
>执行M-x call-trans-hi
好的:工作正常;区域突出显示,然后在第一次按下键时消失.
>通过键绑定C-f1
好的:工作正常;区域突出显示,然后在第一次按下键时消失.

>没有CUA模式(几乎是标准的emacs)

>通过C-x C-e进行评估
NO-GO:当启用CUA时与1.相同.
>执行M-x call-trans-hi
NO-GO:突出显示该行,但它很粘!并需要C-g(键盘退出)来清除它.
>通过键绑定C-f1
NO-GO:突出显示该行,但它很粘!并需要C-g(键盘退出)来清除它.

 ;test (trans-hi) EOL
 (defun trans-hi ()
   "transient highlight"
     (beginning-of-line)
     (push-mark (point))
     (end-of-line)
     (activate-mark))

 ;test (call-trans-hi) EOL
 (defun call-trans-hi ()
   "call transient highlight"
     (interactive)
     (trans-hi))
 (global-set-key [C-f1] 'call-trans-hi)

最佳答案 当你查看激活标记的来源时,你会发现它只是设置了一些变量.我想这就是为什么你们两个都没有看到标记的原因,因为实际的突出显示发生在交互式执行函数而不仅仅是调用它们时所完成的一些事情中.

在没有CUA模式的其他情况下,那就是瞬态突出显示如何在CUA模式之外工作.如果您想要CUA模式行为,请使用CUA模式resp.那部分.

编辑:

这是否会改变(增加setq线)到trans-hi使突出显示按照您想要的方式工作?

(defun trans-hi ()
  "transient highlight"
  (beginning-of-line)
  (push-mark (point))
  (end-of-line)
  (setq transient-mark-mode (cons 'only transient-mark-mode))
  (activate-mark))
点赞