最近都睡的比较晚,对身体不好啊。写了几行恶趣味的 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 这个函数。