【问题标题】:Changing cursor color based on a minor mode根据次要模式更改光标颜色
【发布时间】:2012-12-18 00:38:52
【问题描述】:

我编写了一个次要模式,它定义了一些键绑定并进行了一些初始化。该模式正确设置了 Navi-mode 和 Navi-mode-map。

如何增强此次要模式以在启用导航模式时更改光标的颜色,并在禁用该模式时将其更改回来?我可以使用 hook Navi-mode-hook 吗?

【问题讨论】:

  • @TreyJackson,我不觉得标题的编辑正在解决问题。我不仅对更改光标颜色感兴趣,而且更普遍地对进入/退出模式时如何切换事物感兴趣。
  • 很抱歉,如果您愿意,请编辑我的编辑。那是您给出的唯一具体示例,您还想切换什么?次要模式系统已经为您管理键绑定...需要详细信息,因为它(可以)确定解决方案。
  • 除了一些视觉上的变化之外,我没有想到什么。虽然我明白了你,但想出一些事情并不容易。键盘、字体锁定面、模式线以不同的方式完成。

标签: emacs mode


【解决方案1】:

试试这个:

(define-minor-mode foo-mode "doodad" :lighter ""
  (if foo-mode
      (setq cursor-type 'bar)
    (setq cursor-type (default-value 'cursor-type))))

或者,如果您预计 cursor-type 已经有一个非默认值,您可以在启用模式时保存它,并在禁用时恢复保存的值。

【讨论】:

  • 我应该把这个if 语句放在我的次要模式函数中的什么地方?
  • 我有定义、模式名称、描述、初始值 0、模式行指示符、次要模式键映射,然后是 :global t。我试图把这个if 声明放在这个:global t 下面,但是没有用。
  • 如果您的次要模式是全局的,请将setq 替换为setq-defaultdefault-value 在这种情况下也无济于事,因此在禁用时,您需要从单独的 var 中恢复值,或者如果该模式仅供您自己使用,则只需将其设置为 t
【解决方案2】:

您可以完全控制次要模式(因为您编写了它),并且您可以将此行为直接嵌入到您的次要模式函数中,如 Dmitry 的回答中所述:

(define-minor-mode navi-mode
  "Navi mode does wonderful things"
  :lighter " Navi"
  :global t
  :init-value 0

  (if navi-mode
      (progn
        (setq old-cursor-color (cdr (assoc 'cursor-color (frame-parameters))))
        (set-cursor-color "red"))
    (set-cursor-color old-cursor-color)))

或者您不控制次要模式定义,您将不得不使用挂钩:

(defun navi-change-cursor-color ()
  (if navi-mode
      (progn
        (setq old-cursor-color (cdr (assoc 'cursor-color (frame-parameters))))
        (set-cursor-color "red"))
    (set-cursor-color old-cursor-color)))

(add-hook 'navi-mode-hook 'navi-change-cursor-color)

【讨论】:

  • 除了foo-mode-hook之外,define-minor-mode还定义了单独的foo-mode-on-hookfoo-mode-off-hook
  • @Dmitry 你完全正确。实际上我错了,切换模式时总是运行钩子,所以它们也可以使用。只是为了完整起见,我编辑了我的答案以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2013-04-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多