Yukang's Page

让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这个函数。

使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章