cuckoo是乙個我自己開發的類似待辦事項的工具,執行在我本地的電腦上。它有如下兩個介面:
傳入乙個unix epoch時間戳建立提醒
傳入乙個標題以及提醒的id來建立任務
這樣一來,便能在設定的時刻呼叫alerter
在螢幕右上角彈出提醒。
ps:讀者朋友們就不用執著於我的cuckoo究竟是怎樣的介面定義了。
為了實現所需要的功能,讓我從結果反過來推導一番。首先,需要提煉乙個todo條目的標題和時間戳(用來建立提醒獲取id),才能呼叫cuckoo的介面。標題就是org-mode中乙個todo條目的heading text,在emacs中用下面的**獲取
(nth 4 (org-heading-components))
org-headline-components
在游標位於todo條目上的時候,會返回許多資訊(參見下圖)
其中下標為4的component就是我所需要的內容。
接著便是要獲取乙個提醒的id。id當然是從cuckoo的介面中返回的,這就需要能夠解析json格式的文字。在emacs中解析json序列化後的文字可以用json這個庫,示例**如下
(let ((s "}"))
(cdr (assoc 'id (cdr (car (json-read-from-string s))))))
既然知道如何解析(同時還知道如何提取解析後的內容),那麼接下來便是要能夠獲取上述示例**中的s
。s
來自於http響應的body,為了發出http請求,可以用emacs的request庫,示例**如下
此處的:sync
引數花了我好長的時間才搗鼓出來——看了一下request
函式的docstring後才發現,原來需要傳遞:sync
為t
才可以讓request
函式阻塞地呼叫,否則一呼叫request
就立馬返回了nil
。
現在需要的就是構造:data
的值了,其中的關鍵是生成秒級的unix epoch時間戳,這個時間戳可以通過todo條目的scheduled
屬性轉換而來。比如,乙個條目的scheduled
屬性的值可能是<2019-01-11 fri 22:15>
,將這個字串傳遞給date-to-time
函式可以解析成代表著秒數的幾個數字
(date-to-time "<2019-01-11 fri 22:15>")
時間戳字串要怎麼拿到?答案是使用org-mode的org-entry-get
函式
(org-entry-get nil "scheduled")
ps:需要先將游標定位在乙個todo條目上。
至此,所有的原件都準備齊全了,最終我的elisp**如下
(defun scheduled-to-time (scheduled)
"將todo條目的scheduled屬性轉換為unix時間戳"
(let ((lst (date-to-time scheduled)))
(+ (* (car lst) (expt 2 16))
(cadr lst))))
(defun create-remind-in-cuckoo (timestamp)
"往cuckoo中建立乙個定時提醒並返回這個剛建立的提醒的id"
(message "返回內容為:%s" data)
(message "任務建立完畢"))))))
全文完。 拿Emacs對接我的cuckoo
cuckoo是乙個我自己開發的類似待辦事項的工具,執行在我本地的電腦上。它有如下兩個介面 傳入乙個unix epoch時間戳建立提醒 傳入乙個標題以及提醒的id來建立任務 這樣一來,便能在設定的時刻呼叫alerter在螢幕右上角彈出提醒。ps 讀者朋友們就不用執著於我的cuckoo究竟是怎樣的介面定...
我的Emacs配置
乙個snippet外掛程式可以自定義模板,http code.google.com p yasnippet add to list load path d lvan emacs plugin yasnippet 0.6.1c require yasnippet yas initialize yas ...
我的emacs配置
linux系統中emacs還是有它的好處的,之前我也覺得emacs是個怪胎,但發現只要對emacs進行一定的配置,還是可以用的。最最重要的就是要徹底顛覆emacs原來的熱鍵設定,直接有乙個ergoemacs包可以實現這個,上面的圖就是安裝好ergoemacs以後的熱鍵圖。除了圖裡面的ctrl s,c...