【问题标题】:Different results when elisp function is run different ways; why?elisp函数运行方式不同,结果不同;为什么?
【发布时间】:2012-01-10 08:54:59
【问题描述】:

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


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

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

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

  • 启用CUA模式

    1. 通过C-x C-e 评估——(call-trans-hi)(trans-hi)
      禁止:设置标记和移动点都指向 EOL,但 什么都没有 em> 突出显示。

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

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

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

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

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

    3. 通过键绑定 C-f1
      NO-GO:该行已突出显示,但它很粘! 并且需要 C-g(键盘-quit) 清除它。


 ;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)

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

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

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

    编辑:

    此更改(添加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 的 很棒的教程之一,现在我认为我刚才描述的内容被称为 transient ..(虽然不太确定),但我真正需要的是,当用户按下一个键时,突出显示的区域消失......(这就是我所说的瞬态)...... CUA可以做到它,所以它是可行的。我追求的是:我该怎么做那个
    • 附言。我基本上不想要 CUA 模式,除非它碰巧当前已启用。我主要将它包括在这里,因为我注意到它确实可以按我的意愿工作。但是我确实需要同时满足这两种情况。也许评估方法也可以工作......
    • 我想我现在可能已经明白你想要什么了。我添加到答案中的代码有帮助吗?
    • @Rörd: 哇!!!我几乎不敢相信。我一直在努力解决这个问题。。真是一种解脱!有用! ...您应该获得本周英雄奖!非常感谢...
    • — 我找到了一个链接,指向所用命令的解释:(only . oldval) .. 引用:“如果值为(仅 .oldval),则设置了transient-mark-mode在移动点的任何后续命令且未进行移位转换(请参阅移位转换)之后,或在通常会停用标记的任何其他操作之后,将值设为 oldval。" ...
    【解决方案2】:

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

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

    如果您希望可以通过激活次要删除选定区域 模式delete-selection-mode

    【讨论】:

    • 我仍然不明白transient-mark-mode 是如何影响这一点的,因为我已经将transient-mark-mode 设置为t...
    • 好吧,我不明白你的要求。所以我对cua-mode 源进行了一些研究,它在post-command-hook 上添加了一个钩子,如果按下箭头键,它会禁用transient-mark-mode。这不是transient-mark-mode 的标准行为,如果您愿意,可以启用cua-mode 或制作您自己的钩子。
    • 谢谢... :) 我!做一个钩子!如果我能!我是一个 elisp 新手太多了......但我很感激你的帮助......我很抱歉改变了我的问题的角度......(我还没有结束学习曲线的最初阶段,但是我到了……
    猜你喜欢
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2021-07-30
    相关资源
    最近更新 更多