应该将`copy-region-as-kill`修改为包含`(setq transient-mark-mode nil)`?

时间:2014-06-05 00:59:09

标签: emacs elisp

使用post-command-hook之后的copy-region-as-killpost-command-hook包含region-active-p的测试时,该测试返回正数,因为transient-mark-mode尚未返回nil

post-command-hook是否设计为在执行 this-command之前对存在的内容采取行动,或post-command-hook是否应将this-command看作世界{ {1}}已经开始了吗?


编辑:我很抱歉没有说明我使用的是最新版本的Emacs Trunk。以下是执行测试的当前函数:

(defun region-active-p ()
  (and transient-mark-mode mark-active (mark)))

以下是来自M-x emacs-version的消息:

GNU Emacs 24.4.50.1 (x86_64-apple-darwin10.8.0,
  NS appkit-1038.36 Version 10.6.8 (Build 10K549)) of 2014-06-01 on MP.local 

以下是假设可能需要使用copy-region-as-kill复制的活动区域的示例,并在post-command-hook运行时进行了测试。 [这样,假设没有活动区域,可以使用计算放置新的叠加层。]在此示例的上下文中,当nil等于this-command时,我需要测试返回copy-region-as-kill实现该目标的一种方法是修改copy-region-as-kill以在函数的尾端包含(setq transient-mark-mode nil)。但是,我在修改像copy-region-as-kill这样的主要功能时犹豫不决。 [在我看来,如果region-active-pthis-command等于copy-region-as-kill,则包含说明该区域未激活的条件,这没有多大意义。]

Example http://www.lawlist.com/images/region_active_p_example.png

3 个答案:

答案 0 :(得分:2)

transient-mark-mode与此无关。请改为deactivate-mark

也就是说,您无法在命令后挂钩中使用region-active-p,而是检查deactivate-mark变量的值,请参阅docs

答案 1 :(得分:1)

为了确保在运行

后没有活动区域
(deactivate-mark t)

应该做的伎俩。为什么不用它来完成有问题的命令,而是使用post-command-hook

答案 2 :(得分:0)

初始草案(2014年6月4日):在查看本主题中的文档和有用的评论和答案之后,我非常倾向于专门设计用于使用的新测试在post-command-hook内。这将避免修改kill-regioncopy-region-as-killyank的核心/主要功能。由于新函数将包含在我自己的小模式库中,因此没有理由不能对所述函数进行一些基本计算。 deactivate-mark中标题为simple.el功能使用(setq mark-active nil)(setq transient-mark-mode nil),所以我没有理由不能在我自己中使用它们自定义功能。

  • 特别感谢@AndreasRöhler,@ event_jr和@Stefan - 非常感谢!

编辑(2014年6月5日):修改初稿只是为了测试条件,而不是将变量(mark-activetransient-mark-mode)设置为{{1 }}

  
nil