2012-08-14 21 views
5

Mi intención es utilizar bm.elVisible Bookmarks para cada petición como presiono RET. Me las he arreglado para lograr esto hasta cierto punto. Por favor, comenten mi código, a continuación, si falta algo importante: ej. No tengo idea de si necesito manejar los argumentos más allá de simplemente pasarlos a la función predeterminada.Emacs eshell. Cómo leer el contenido de la línea de comandos al presionar RET

Cuando presiono RET en una línea de comando vacía, no quiero marcar esa línea. ¿Cómo puedo interceptar el contenido de la línea de comando antes de pasar el control a la función predeterminada eshell-send-input?

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline) 
    "eshell-send-input, customized to add bm-bookmark to prompt line" 
(interactive) 
    (bm-bookmark-add) 
    (eshell-send-input use-region queue-p no-newline)) 

(add-hook 'eshell-mode-hook 
      #'(lambda() 
       (define-key eshell-mode-map 
       [return] 
       'eshell-send-input-zAp))) 

Respuesta

4

Tu código parece decente. Si lee el código de eshell-send-input, verá cómo obtener la entrada actual.

También lea en interactive argumentos. Se requiere "P" para pasar la región de usuario al eshell-send-input.

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline) 
    "eshell-send-input, customized to add bm-bookmark to prompt line" 
    (interactive "*P") 
    (unless (string-equal (eshell-get-old-input use-region) "") 
    (bm-bookmark-add)) 
    (eshell-send-input use-region queue-p no-newline)) 
+0

Funciona muy bien. Gracias por despejar la niebla ... Con toda la ayuda, gradualmente estoy descifrando esta * elisp * tuerca :) –

1

esh-mode define una variable eshell-last-output-end que se actualiza cada vez que se imprime la salida. Por lo tanto, puede agarrar la cadena que se va a enviar al shell haciendo algo como (buffer-substring eshell-last-output-end (point-max)), creo.

EDIT: cita de la documentación sobre eshel-send-input:.

"Enviar la entrada recibida a ESHELL para el análisis y procesamiento Después eshell-pasado-de extremo de salida, envía todo el texto de ese marcador para señalar como entrada. Antes de ese marcador, las llamadas `eshell-conseguir-old-input' para recuperar de entrada de edad, lo copia en el final del búfer, y lo envía.

Si USO-región es no nula , la región actual (entre el punto y la marca) se utilizará como entrada.

Si QUEUE-P no es nulo, la entrada se pondrá en cola hasta el siguiente mensaje, , en lugar de enviarse al proceso actualmente activo. Si no hay proceso, la entrada se procesa inmediatamente.

Si NO-nueva línea es no nulo, la entrada se envía sin una implícita última nueva línea."

Accent es mío. Y si nos fijamos en la fuente de eshel-send-input, se puede obtener la idea de cómo se usa.

Para reflejar la respuesta de event_jr, no necesariamente es necesario pasar el argumento universal a esta función si su propia función no tiene esa opción ... Obviamente, hasta ahora no tiene uso para eso , eso es algo innecesario.

+0

No he podido ejecutar nada desde 'eshell-last-output-end'. Su documentación dice: * No está documentado como variable. * –

+0

Mhh .. la parte 'esh-mode' y' eshel-'fue un poco desconcertante, pero parece que * cada * segmento con guiones de un nombre tiene su propia terminación. . Parece que tengo demasiadas preconcepciones * bash * ... (leyendo todo esto ahora ... –

+0

Gracias por las buenas referencias ... He aprendido algunos puntos nuevos ... son bastantes para ir, en elisp, en general :) –

0

(Ans wering my own question) ... Me di cuenta de que eshell es en esencia su único buffer de emacs, así que, con eso en mente, he encontrado este método, que funciona, pero que quizás podría hacerse mejor. Tal vez hay algo que aún desconozco, por lo que todavía estoy abierto a sugerencias.

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline) 
    "A customized `eshell-send-input`, to add bm-bookmark to prompt line" 
    (interactive) 
    (let ((line (buffer-substring-no-properties (point-at-bol) (point-at-eol)))) 
    (if (string-match eshell-prompt-regexp line) 
     (if (> (length (substring line (match-end 0))) 0) 
      (bm-bookmark-add)))) 
    (eshell-send-input use-region queue-p no-newline)) 
Cuestiones relacionadas