J'écris un fichier elisp pour intégrer GNU Emacs avec Zeitgeist sur dbus. En raison de l'absence d'une bonne documentation sur dbus dans emacs et mon manque d'expérience avec elisp avancée, je viens avec l'erreur suivante dans ma méthode zeitgeist-send
:Erreur de type incorrect dans la méthode dbus (GNU Emacs)
Wrong type argument: D-Bus, (zeitgeist-event-timestamp)
J'ai essayé de corriger le problème en plaçant :string
avant tous les arguments, mais cela m'a donné l'erreur:
Wrong type argument: stringp, (zeitgeist-event-timestamp)
Cela n'a aucun sens, car je suis convaincu que la valeur de (Zeitgeist-événement horodatage) est une chaîne.
Si vous en avez besoin, la documentation de dbus pour zeitgeist est here. Le format est asaasay
.
Voici le code:
(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)
Merci pour toute aide! Patrick Niedzielski
Il est étrange parce que (type de (horodatage-zeitgeist-event)) est certainement une chaîne. Si je remplace (zeitgeist-event-timestamp) par "", l'appel se plaint du paramètre suivant. – stsquad
J'ai demandé sur la liste de diffusion, et on m'a dit que puisque j'utilise (quote ...), la fonction (zeitgeist-event-timestamp) n'est pas appelée. Les variables ne sont pas non plus évaluées. Je l'ai testé avec (liste ...), et maintenant il fonctionne très bien. Laissez-moi répondre à cette question. –