在Emacs中如何让光标像心跳一样闪烁

5

如何让Emacs中的光标像心跳一样闪烁。就像笔记本电脑前面板上的LED在计算机挂起时一样。

有一个名为blink-cursor-alist的变量控制光标的闪烁,但我不知道如何使用它来满足我的要求。

这是否可能?

2个回答

8
这个简单的小模式实现了一个心跳式闪烁光标。您可以调整heartbeat-cursor-colors以获得不同的色调或其变化。
代码已在Emacs 24.2.1中测试,但很容易移植到旧版Emacs中。
(require 'cl)
(require 'color)

(defvar heartbeat-fps 16)
(defvar heartbeat-period 5)

(defun heartbeat-range (from to cnt)
  (let ((step (/ (- to from) (float cnt))))
    (loop for i below cnt collect (+ from (* step i)))))

(defun heartbeat-cursor-colors ()
  (let ((cnt (* heartbeat-period heartbeat-fps)))
    (mapcar (lambda (r)
              (color-rgb-to-hex r 0 0))
            (nconc (heartbeat-range .2 1 (/ cnt 2))
                   (heartbeat-range 1 .2 (/ cnt 2))))))

(defvar heartbeat-cursor-timer nil)
(defvar heartbeat-cursor-old-color)

(define-minor-mode heartbeat-cursor-mode
  "Change cursor color with the heartbeat effect."
  nil "" nil
  :global t
  (when heartbeat-cursor-timer
    (cancel-timer heartbeat-cursor-timer)
    (setq heartbeat-cursor-timer nil)
    (set-face-background 'cursor heartbeat-cursor-old-color))
  (when heartbeat-cursor-mode
    (setq heartbeat-cursor-old-color (face-background 'cursor)
          heartbeat-cursor-timer
          (run-with-timer
           0 (/ 1 (float heartbeat-fps))
           (lexical-let ((colors (heartbeat-cursor-colors)) tail)
             (lambda ()
               (setq tail (or (cdr tail) colors))
               (set-face-background 'cursor (car tail))))))))

1
不可思议 - 向你和emacs致敬。现在让我们看看你能否在Eclipse中做到这一点;) - Omri Barel
1
惊人!为了在emacs 24.3.1中运行它,我不得不将heartbeat-cursor-timer设置为nil -(defvar heartbeat-cursor-timer nil) - ajeje
感谢测试,我已经更新答案来初始化heartbeat-cursor-timer - user4815162342

4
你猜测这个选项与“blink”一词有关。 所以你按下 C-h a(用于搜索)并键入“blink”。 在我的emacs上,我得到了两个选项:blink-cursor-modeblink-matching-open。 第一个看起来正确。描述说:“切换闪烁光标模式”。
我的emacs快捷方式为:<menu-bar> <options> <blink-cursor-mode>。 因此,我猜想该选项位于菜单中的某个位置,也许在“选项”下面。 我打开“选项”菜单,它就在那里:“闪烁光标”,带有复选框。
这似乎也是一种可以自定义的选项。 因此,我键入M-x customize-option,然后blink-cursor-mode。这使我可以切换值,并将其保存供将来使用。
编辑:要设置光标开和关之间的间隔,有一个名为blink-cursor-interval的变量。您可以使用M-x customize-variable,然后blink-cursor-interval来设置间隔。变量blink-cursor-alist将关闭状态光标类型匹配到打开状态光标类型,与闪烁速度无关。
编辑2:据我所知,没有办法使光标逐渐关闭和打开,因为开启状态下的光标形状可能与关闭状态下的不同(因此需要逐渐变化的形状)。

1
是的,我知道光标可以闪烁,但它能以缓慢的速度闪烁吗?不只是简单的开关,开关。就像笔记本电脑前面板上的LED在计算机挂起时一样。 - louxiu
谢谢 :-) 希望 Emacs 未来能够拥有这个功能。 - louxiu
1
@louxiu 未来已经到来。 :) 请查看我的答案,了解一个简单的心跳式闪烁光标。 - user4815162342

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接