拿Emacs對接我的cuckoo

2021-09-12 16:40:30 字數 3324 閱讀 7561

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))))))

既然知道如何解析(同時還知道如何提取解析後的內容),那麼接下來便是要能夠獲取上述示例**中的ss來自於http響應的body,為了發出http請求,可以用emacs的request庫,示例**如下

此處的:sync引數花了我好長的時間才搗鼓出來——看了一下request函式的docstring後才發現,原來需要傳遞:synct才可以讓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...