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

Emacs elisp函数以不同方式运行时的结果不同;为什么?,emacs,elisp,Emacs,Elisp,编辑:也许(在最初的帖子中)我用错了“暂时的”这个词(我还不太熟悉这个术语)。我真正的意思是,当用户按下导航键(如箭头键)时,突出显示的区域将立即消失。。。(第二次编辑:我删除了“暂时”一词) 选择一个区域以使用户获得“光标键移动将使突出显示消失”这一特殊问题最近一直是我存在的祸根。根据运行以下脚本的方式,我会得到不同的结果 为什么它会给出不同的结果,更具体地说,是否有一种方法可以使它产生“光标键使高亮显示消失”,而不管运行的是哪种模式,或者测试时是否对其进行评估。。CUA模式有这种行为,但我

编辑:也许(在最初的帖子中)我用错了“暂时的”这个词(我还不太熟悉这个术语)。我真正的意思是,当用户按下导航键(如箭头键)时,突出显示的区域将立即消失。。。(第二次编辑:我删除了“暂时”一词)


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

为什么它会给出不同的结果,更具体地说,是否有一种方法可以使它产生“光标键使高亮显示消失”,而不管运行的是哪种模式,或者测试时是否对其进行评估。。CUA模式有这种行为,但我真的需要非CUA模式也有这种行为(如果可能的话,还有eval)

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

  • CUA模式已启用

  • 通过
    C-x C-e
    -既可以
    (呼叫trans hi)
    也可以
    (trans hi)

    禁止:设置标记并将点移动到下线,但没有突出显示任何内容

  • 执行
    M-x呼叫传输hi

    ok:很好;该区域高亮显示,然后在第一次按键时消失

  • 通过键绑定
    C-f1

    ok:很好;该区域高亮显示,然后在第一次按键时消失

  • 无CUA模式(相当于标准emacs)

  • 通过C-x C-e进行评估 禁止:与1相同。当CUA启用时

  • 执行
    M-x呼叫传输hi

    禁止:该行高亮显示,但它是粘性的!并需要
    C-g
    (键盘退出)来清除它

  • 通过键绑定
    C-f1

    禁止:该行高亮显示,但它是粘性的!并需要
    C-g
    (键盘退出)来清除它



当您查看
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))

如果要在标记区域时看到该区域高亮显示,则需要 要激活次要模式
瞬态标记模式

高亮显示区域并插入字符时,默认为 禁用高亮显示并在光标处插入字符

如果您愿意,您可以通过激活次区域来删除所选区域
模式
删除选择模式

我是否误用了术语瞬态?我一直在读更多的书,也许“暂时”是错的。。所以,让我们暂时忽略这个词。我希望选择在脚本完成后可见(即突出显示)。我刚刚读了Xah Lee的一本很棒的教程,我现在认为我刚才描述的叫做瞬态…(虽然不太确定),但我真正需要的是,当用户按下一个键时,高亮显示的区域将消失。。。(这就是我所说的暂时性)。。。CUA可以做到,所以它是可以做到的。我追求的是:我该怎么做?PS。我基本上不想要CUA模式,除非它恰好是当前启用的。。我主要是把它放在这里,因为我注意到它确实能按我的要求工作。。但是,我确实需要考虑这两种情况。。从这一点来看,也许评估方法也能起作用……我想我现在可能已经明白你想要什么了。我添加到答案中的代码有帮助吗?@Rörd:Wow!!!我简直不敢相信。我一直在努力解决这个问题很久了。。真是松了一口气!它起作用了。。。你应该获得本周英雄奖!非常感谢…-我找到了一个链接,指向对所用命令的解释:。。引用:“如果值为(仅.oldval),则在任何后续命令移动点且未进行移位转换(请参见移位转换)后,或在任何其他通常会停用标记的操作后,瞬态标记模式将设置为值oldval。”…我仍然不清楚
瞬态标记模式
是如何影响这一点的,因为我已经将
瞬态标记模式
设置为
t
…好吧,我的错,我还没有理解你的请求。因此,我对
cua模式
源代码进行了深入研究,它在
post-command钩子
上添加了一个钩子,如果按下箭头键,该钩子将禁用
瞬态标记模式
。这不是
瞬态标记模式的标准行为
如果需要,您可以启用
cua模式
或创建自己的挂钩。谢谢……)我做一个钩子!但愿我能!我太像一个elisp新手了。。。但我感谢你的帮助。。。我很抱歉改变了我问题的角度。。。(我还没有越过学习曲线的最初高峰,但我正在到达那里。。。
(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))