CatCoding

让 Emacs 提醒睡觉

2011-07-24

最近都睡的比较晚,对身体不好啊。写了几行恶趣味的 elisp,晚上 10 点 40 开始提醒提醒我准备睡觉,如果 10 点 50 还没动,我的上下移动键就不能用了,下面会有一条提示:太晚了,该睡觉了。不过这时可以用方向键盘来移动。但过十分钟后快捷键又恢复正常,因为过了 11 点表示我确实要再待晚点,下个小时 40 分钟继续提醒,50 分锁死快捷键盘。12 点过后 emacs 彻底对我无语了。真是 egg hurt…

(defun is-late-now()
  "Check if it is now late, emmm, go to sleep"
  (let ((hr (nth 2 (decode-time (current-time))))
        (minute (nth 1 (decode-time (current-time)))))
    (and (and (>= hr 22)
              (>= minute 40)
              (message "prepare sleep now...."))
         (>= minute 50))))

(defun my-next-line()
  (interactive)
  (if (is-late-now)
      (message "late now, go to sleep ... baby!")
    (next-line)))

(defun my-prev-line()
  (interactive)
  (if (is-late-now)
      (message "late now, go to sleep ... baby!")
    (previous-line)))

(global-set-key (kbd "C-n") 'my-next-line)
(global-set-key (kbd "C-p") 'my-prev-line)

这样写不好看,更好的办法是用 defadvice,那就不用重新绑定 C-n 和 C-p 了,defadvice 可以直接在运行 next-line 和 previous-line 之前检查一下。

(defadvice previous-line (before check-is-later)
  (if (is-late-now)
      (progn
        (message “late now”)
        (sleep-for 1)))) ;;just sleep 1 second

(ad-activate ‘previous-line)

这样后只要执行 previous-line 这个函数之前都会执行我这个 defadvice 定义的代码,但是这样连方向键也不能移动了,因为向上这个按钮是绑定的 previous-line 这个函数。

公号同步更新,欢迎关注👻
Tags: Emacs