interactive – registrar pulsaciones de teclas con marca de tiempo y otros metadatos?

Pregunta:

Si evalúo este formulario:

(open-dribble-file "/home/joe/keys.log")

luego escriba algo, Emacs guarda lo que keys.log archivo keys.log :

<return>hellow<backspace> keyloggi<down-mouse-5><mouse-5>ng world<down><down>
^E^X<C-down-mouse-4><C-mouse-4>^E^X^F^N^N<return>yes<return>

Dejemos esas tonterías de inmediato.

(open-dribble-file nil)

Lo que me gustaría es una función similar que guarde cada pulsación de tecla junto con una marca de tiempo y algunos otros metadatos.

Lo último

Existe el modo de registro de comandos , que se puede ajustar para registrar cada comando interactivo configurando

(setq clm/log-command-exceptions* '(nil))

Almacena la hora del comando en una propiedad de texto : time , y se le puede dar una resolución de milisegundos agregando .%3N al comando correspondiente format-time-string . Lo único que todavía no hace es guardar el texto que escribo. En cambio, registra la primera letra y el número de letras escritas:

t      self-insert-command [47 times] 

Supongo que no será demasiado difícil recopilar y guardar el texto ingresado. Supongo que informaré cuando averigüe el almacenamiento de texto, a menos que alguien se me adelante. 🙂

(No necesitaré el texto exacto para análisis básicos, para lo cual lo que tengo aquí es suficiente, pero podría ser útil guardarlo para fines de registro de vida más amplios).

relacionado

Mientras tanto, noté que hay un paquete logkeys en Ubuntu. Hace algo similar a lo que quiero, pero en realidad solo quiero rastrear las pulsaciones de teclas de Emacs, porque es poco probable que cualquier otra cosa sea un trabajo productivo. Aquí hay algunos resultados de logkeys como ejemplo:

2015-06-05 23:02:15+0100 > 3;<E-e1><E-e1>3<#+10>b3;ȁ
2015-06-05 23:02:22+0100 > 
2015-06-05 23:02:22+0100 > 
2015-06-05 23:02:22+0100 > 7'''u܂ccȁ3<#+7><CpsLk>3;q

(Está escribiendo basura porque no conoce la distribución de mi teclado y solo crea una marca de tiempo cuando RET ).

Nota

Cuando publiqué esta pregunta por primera vez, pensé que tendría sentido abordarla a través de Emacs C, con un parche para record_char desde keyboard.c , que es donde se escribe el archivo dribble. Pero dado que hay una solución casi completa en Lisp, es casi seguro que fue una intuición incorrecta. Lo he revisado principalmente, pero pensé que debería registrar la idea inicial, aunque no era tan adecuada.

Respuesta:

Agregué [en mi bifurcación] los siguientes pasos de configuración al command-log-mode para guardar el texto escrito recientemente en una variable.

(defvar clm/log-text t
  "A non-nil setting means text will be saved to the command log.")

(defvar clm/recent-history-string ""
  "This string will hold recently typed text.")

(defun clm/recent-history ()
  (setq clm/recent-history-string
    (concat clm/recent-history-string
        (buffer-substring-no-properties (- (point) 1) (point)))))

(add-hook 'post-self-insert-hook 'clm/recent-history)

(defun clm/zap-recent-history ()
  (unless (or (member this-original-command
              clm/log-command-exceptions*)
          (eq this-original-command #'self-insert-command))
    (setq clm/recent-history-string "")))

(add-hook 'post-command-hook 'clm/zap-recent-history)

Luego ejecuto el siguiente fragmento en un punto adecuado:

     (when clm/log-text
       (if (eq clm/last-keyboard-command 'self-insert-command)
           (insert "[text: " clm/recent-history-string "]\n")))

Descubrí que (setq clm/log-command-exceptions* '(nil ignore)) es una buena configuración para registrar todos los comandos, excepto aquellos que se han ignorado explícitamente (como acciones involuntarias del mouse). Y no lo olvides (setq command-log-mode-is-global t) .

Aquí hay un registro de muestra:

H      self-insert-command [35 times] 
[text: Here is an example of how it works.]
RET    newline
P      self-insert-command [12 times] 
[text: Pretty nice.]
RET    newline
I      self-insert-command [30 times] 
[text: If you make mistakes when typo]
DEL    backward-delete-char-untabify
i      self-insert-command [41 times] 
[text: ing you have to read the lines separetly.]
<C-backspace>
       (lambda nil (interactive) (kill-sexp -1))
s      self-insert-command [11 times] 
[text: separately.]
RET    newline
C-x o      other-window

Como preguntó Andrew Swann en un comentario sobre esta publicación: ¿Dónde están las marcas de tiempo solicitadas? Están ahí pero realmente esto requiere un …

actualización : el modo de registro de comandos almacena marcas de tiempo en las propiedades del texto, por lo que no las ve arriba. Agregué [commit dd497d] una función de exportación que los expone en texto plano en el archivo de registro cuando se escribe en el disco. Aquí cómo se ve esa exportación (para otro poco de interacción):

[2015-06-15T00:46:24] ;    self-insert-command [19 times] 
[text: ;; One question is ]
[2015-06-15T00:46:28] <C-backspace>
[2015-06-15T00:46:28]      (lambda nil (interactive) (kill-sexp -1))
[2015-06-15T00:46:28] t    self-insert-command [47 times] 
[text: that seems worth asking is whether this noticeb]
[2015-06-15T00:46:35] DEL      backward-delete-char-untabify
[2015-06-15T00:46:36] a    self-insert-command [4 times] 
[text: ably]
[2015-06-15T00:46:36] H-s      ispell-word
[2015-06-15T00:46:37] SPC      self-insert-command [59 times] 
[text:  slows down the experience of typing.  If it does, I wonder]
[2015-06-15T00:46:48] RET      newline
[2015-06-15T00:46:48] ;    self-insert-command [25 times] 
[text: ;; if there are things ta]
[2015-06-15T00:46:52] <C-backspace>
[2015-06-15T00:46:52]      (lambda nil (interactive) (kill-sexp -1))
[2015-06-15T00:46:52] t    self-insert-command [32 times] 
[text: that could be done that would se]
[2015-06-15T00:46:56] DEL      backward-delete-char-untabify
[2015-06-15T00:46:56] p    self-insert-command [18 times] 
[text: peed it up.  It's ]

(Algunos otros metadatos naturales para incluir serían el nombre del búfer y el modo actual, lo que ayudaría con análisis posteriores … próximamente).

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım