快速設置任務的開始時間(上)

本文是「實戰Elisp」系列的第一篇。本系列旨在講述我使用Elisp定製Emacs的經驗,拋磚引玉,還請廣大Emacs同好不吝賜教——若是真的有廣大Emacs用戶的話,哈哈哈。git

序言

用Emacs的org-mode安排業餘時間很有些時日,漸漸地開始編寫一些Elisp函數來改善本身的使用體驗。github

日程管理中一個常見的需求,即是給任務設定一個開始時間。在org-mode中,這能夠調用函數org-schedule實現:將光標移動到一個任務上,再按下C-c C-s,會出現一個日曆界面,幫助選擇日期和時間來做爲日程的開始時間。具體效果以下圖所示app

<video id="video" controls="" preload="none">
<source id="mp4" src="https://raw.githubusercontent.com/Liutos/riverbed/master/pictures/20200109/org-mode設定任務開始時間.mp4" type="video/mp4">
</video>ide

長此以往發現,設置的開始時間不外乎是中午12點、下午1點、晚上10點等。這是由於業餘時間是相對固定的,好比午餐、午休,以及晚上在家洗完澡等。有規律便有優化的空間。既然每次輸入的內容都同樣,乾脆預設幾個開始時間,直接選擇便可。函數

平凡的實現

一個樸素的想法,是爲這些固定的時間點各自編寫一個Elisp函數,並綁定到不一樣的快捷鍵上,每次設置開始時間時就按下對應的快捷鍵。循着這個思路,我定義了以下的Elisp函數:優化

(defun lt-lunch-todo ()
  "將開始時間設置爲中午12點"
  (lt-next-todo 12 0))
(defun lt-rest-todo ()
  "將開始時間設置爲下午1點"
  (lt-next-todo 13 0))
(defun lt-supper-todo ()
  "將開始時間設置爲傍晚6點35分"
  (lt-next-todo 18 40))
(defun lt-night-todo ()
  "將開始時間設置爲晚上10點"
  (lt-next-todo 21 30))

lt-next-todo的定義以下spa

(defun lt-next-todo (hour minute)
  "設置光標所在行爲一個TODO條目,並設置其SCHEDULED爲HOUR:MINUTE。

若是當前的時間已經晚於HOUR:MINUTE,那麼將會設定爲明天的目標小時。"
  (cl-assert (integerp hour))
  (cl-assert (integerp minute))
  (org-todo "TODO")
  (org-set-tags nil t)
  (let ((current-hour (string-to-number (format-time-string "%H")))
        scheduled)
    (cond ((> current-hour hour)
           (setf scheduled (format "+1d %02d:%02d" hour minute)))
          (t (setf scheduled (format "%02d:%02d" hour minute))))
    (message "scheduled: %s" scheduled)
    (org-schedule nil scheduled)))

除了綁定不一樣快捷鍵,也能夠直接調用:將光標移動到任務標題上,按下M-:,輸入lt-lunch-todo,最後按下回車。鑑於每次都按這麼多鍵實在是太麻煩,我又編寫了四個AppleScript腳本代勞鍵盤操做,再用BetterTouchTools定製了四個Touchbar按鈕,以便一鍵調用這四個AppleScript腳本。舉個例子,負責調用lt-lunch-todo的AppleScript腳本的內容爲rest

tell application "Emacs"
    activate
end tell
tell application "System Events"
    keystroke ":" using {option down}
    keystroke "(lt-lunch-todo)"
    keystroke return
end tell

BetterTouchTools中的按鈕的設置以下圖所示code

後記

這套方法用久後發現缺陷蠻多:orm

  1. 要定義不少高度雷同的Elisp函數;
  2. 要編寫不少高度雷同的AppleScript腳本;
  3. 要定製不少高度雷同的BetterTouchTools按鈕;

高度雷同、高度雷同、高度雷同,重要的事情說三遍。有規律便有優化的空間,因而我換了一種更好的方式,實現了可擴展的、優雅的快速設置任務開始時間的辦法。

欲知後事如何,且聽下回分解。

若是你但願觀看排版效果更好的版本(好比視頻能夠成功嵌入),能夠閱讀原文

相關文章
相關標籤/搜索