Я пишу файл 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
Это странно, потому что (типа-(Zeitgeist-событийные метки время)), безусловно, является строка. Если я заменил (zeitgeist-event-timestamp) на «», вызов вызывает жалобу на следующий параметр. – stsquad
Я спросил в списке рассылки, и мне сказали, что, поскольку я использую (цитата ...), функция (zeitgeist-event-timestamp) не вызывается. Переменные также не вычисляются. Я тестировал его (список ...), и теперь он отлично работает. Позвольте мне ответить на этот вопрос. –