当elisp函数运行方式不同时,结果不同;为什么?

时间:2011-12-01 06:45:56

标签: emacs elisp

编辑:也许(在原帖中)我错误地使用了“瞬态”一词(我还不熟悉行话)。我的真正含义是,当用户按下导航键时,突出显示的区域会立即消失。 arrow-keys ...(第二次编辑:我删除了“瞬态”一词)


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

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

以下是结果,然后是代码。 (GNU Emacs 23.1.1)

  • 启用CUA模式

    1. 通过C-x C-e评估 - (call-trans-hi)(trans-hi) NO-GO :设置标记和移动指向EOL,但 nothing 突出显示。

    2. 执行M-x call-trans-hi
      好的:工作正常;区域突出显示,然后在第一次按下键时消失

    3. 通过键绑定C-f1
      好的:工作正常;区域突出显示,然后在第一次按下键时消失

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

    1. 通过C-x C-e进行评估 NO-GO :当启用CUA时与1.相同。

    2. 执行M-x call-trans-hi
      NO-GO :该行突出显示,但它是粘性的!并需要C-g(键盘退出)才能清除它。

    3. 通过键绑定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)

2 个答案:

答案 0 :(得分:2)

当您查看activate-mark的来源时,您会发现它只是设置了一些变量。我想这就是为什么你没有在 1 中看到标记的原因,因为实际的突出显示发生在交互执行函数而不是仅仅调用它们时完成的一些事情中。

在没有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))

答案 1 :(得分:0)

如果您想在标记时突出显示该区域,则需要 激活次要模式transient-mark-mode

当突出显示某个区域并且插入一个字符时,默认值为 禁用突出显示并在光标处插入字符。

如果您希望通过激活辅助功能删除所选区域 模式delete-selection-mode