2010-07-01 2 views
4

Я пишу файл elisp для интеграции GNU Emacs с Zeitgeist через dbus. Из-за отсутствия хорошей документации по DBus в Emacs и мое отсутствие опыта работы с передовой Elisp, я подходя со следующей ошибкой в ​​моем методе zeitgeist-send:Ошибка неправильного типа в методе dbus (GNU Emacs)

Wrong type argument: D-Bus, (zeitgeist-event-timestamp)

Я попытался исправляя проблему путем размещения :string до того все аргументы, но это дало мне ошибку:

Wrong type argument: stringp, (zeitgeist-event-timestamp)

Это не имеет никакого смысла, так как я уверен, что значение (Zeitgeist-событийные метки времени) является строкой.

Если вам нужно, dbus-документация для zeitgeist - here. Формат для него: asaasay.

Вот код:

(require 'dbus) 
(defun zeitgeist-call (method &rest args) 
    "Call the zeitgeist method METHOD with ARGS over dbus" 
    (apply 'dbus-call-method 
    :session       ; use the session (not system) bus 
    "org.gnome.zeitgeist.Engine"  ; service name 
    "/org/gnome/zeitgeist/log/activity" ; path name 
    "org.gnome.zeitgeist.Log"   ; interface name 
    method args)) 

(defun zeitgeist-event-timestamp() 
    "Get the timestamp in zeitgeist format." 
    (let* ((now-time (current-time)) 
     (hi  (car now-time)) 
     (lo  (car (cdr now-time))) 
     (msecs (car (cdr (cdr now-time))))) ; This is *micro*seconds. 

    (number-to-string (+ (/ msecs 1000) 
     (* (+ lo (* hi 65536))  1000))))) ; Convert system time to milliseconds. 

(defun zeitgeist-event-interpretation (event) 
    "Get the Event Interpretation of EVENT." 
    (case event 
    ('zeitgeist-open-event 
     "http://zeitgeist-project.com/ontologies/2010/01/27/zg#AccessEvent") 
    ('zeitgeist-close-event 
     "http://zeitgeist-project.com/schema/1.0/core#CloseEvent") 
    ('zeitgeist-create-event 
     "http://zeitgeist-project.com/schema/1.0/core#CreateEvent") 
    ('zeitgeist-modify-event 
     "http://zeitgeist-project.com/schema/1.0/core#ModifyEvent") 
    (otherwise nil))) 

(defun zeitgeist-send (event fileurl filemime) 
    "Send zeitgeist an event EVENT using the list FILEINFO." 
    (let ((event-interpretation (zeitgeist-event-interpretation event))) 
    (if (eq nil event-interpretation) 
     (message "YOU FAIL") 
     (zeitgeist-call "InsertEvents" 
     '("" 
     (zeitgeist-event-timestamp) 
     event-interpretation 
     "http://zeitgeist-project.com/schema/1.0/core#UserActivity" 
     "app://emacs.desktop") 
     '((fileurl 
     "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo/#Document" 
     "http://www.semanticdesktop.org/ontologies/nfo/#FileDataObject" 
     fileurl 
     filemime 
     (file-name-sans-versions fileurl) 
     "")) ; Some black magic later 
     '(:array))))) 

(defun zeitgeist-open-file() 
    "Tell zeitgeist we openned a file!" 
    (if (eq nil (buffer-file-name)) 
    (message "You are not on a file.") 
    (zeitgeist-send 'zeitgeist-open-event buffer-file-name "text/plain"))) 

(zeitgeist-open-file) 

Спасибо за любую помощь! Patrick Niedzielski

+0

Это странно, потому что (типа-(Zeitgeist-событийные метки время)), безусловно, является строка. Если я заменил (zeitgeist-event-timestamp) на «», вызов вызывает жалобу на следующий параметр. – stsquad

+0

Я спросил в списке рассылки, и мне сказали, что, поскольку я использую (цитата ...), функция (zeitgeist-event-timestamp) не вызывается. Переменные также не вычисляются. Я тестировал его (список ...), и теперь он отлично работает. Позвольте мне ответить на этот вопрос. –

ответ

4

Я спросил в списке рассылки, и я узнал, что, поскольку я использовал (цитату ...) вместо (список ...), переменные и функции не были оценены. Глупая ошибка LISP.

Кроме того, если кому-то интересно, я пошлю этот патч в проект Zeitgeist.

Приветствие, Патрик

+0

Пожалуйста, сделайте это! Я тоже думал об интеграции Emacs-Zeitgeist. –

+0

Я отправлю в свой блог (http://freesoftwarehacker.blogspot.com/), когда я выясню точную процедуру.^_ ^ –