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