IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    让Emacs提醒睡觉

    Yukang (moorekang@gmail.com)发表于 2011-07-24 00:00:00
    love 0
    最近都睡的比较晚,对身体不好啊。写了几行恶趣味的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这个函数。


沪ICP备19023445号-2号
友情链接