Copiar/Pegar en emacs shell ansi-term
(5)
Es posible que desee simplemente cambiar entre el modo de caracteres y el modo de línea mientras usa el terminal. Cx Cj activará el modo de línea de término, que trata al búfer de terminal más como un búfer de texto normal en el que puede mover el cursor y tirar el texto. Puede volver al modo de caracteres con Cc Ck.
He configurado mis emacs para ejecutar shell zsh dentro de ansi-term. Sin embargo, copiar / pegar ya no funciona, es decir, no se pega nada de kill-ring a la terminal. Cambiar el TERM a vt100 o eterm no resuelve el problema.
Agradecería cualquier idea o solución.
Para proporcionar el contexto, he configurado ansi-term de la siguiente manera:
(global-set-key "/C-x/C-a" ''(lambda ()(interactive)(ansi-term "/bin/zsh")))
(global-set-key "/C-x/ a" ''(lambda ()(interactive)(ansi-term "/bin/zsh")))
ansi-term
, en char-mode
, toma los enlaces ordinarios para la emulación de terminal. Necesita una nueva vinculación, más una forma de enviar a ansi-term
correctamente. Yo uso esto:
(defun ash-term-hooks ()
;; dabbrev-expand in term
(define-key term-raw-escape-map "/"
(lambda ()
(interactive)
(let ((beg (point)))
(dabbrev-expand nil)
(kill-region beg (point)))
(term-send-raw-string (substring-no-properties (current-kill 0)))))
;; yank in term (bound to C-c C-y)
(define-key term-raw-escape-map "/C-y"
(lambda ()
(interactive)
(term-send-raw-string (current-kill 0)))))
(add-hook ''term-mode-hook ''ash-term-hooks)
Cuando hagas esto, Cc Cy tirará. Sin embargo, solo hace un tirón, y no puedes pasar por tu amortiguador de muerte. Es posible hacer esto, pero aún no lo he implementado.
Como se describe en este encantador fragmento de blog , hay una función, term-paste
, en term.el
, que hace exactamente lo que usted desea. Por defecto está limitado solo a S-insert
pero el Cc Cy
recomendado por el blog parece una buena sugerencia.
Estas otras soluciones no funcionan bien para mí, cambiar entre el modo de caracteres y el modo de línea hace que ansi-term deje de funcionar correctamente al azar, y establecer el termino-pegar de ansi-term a Cc Cy (basado en el enlace de Glyph), no funcionó el fragmento de código era para el término, no para el término ansi:
(eval-after-load "ansi-term"
''(define-key ansi-term-raw-map (kbd "C-c C-y") ''term-paste))
Las soluciones anteriores funcionan bien para copiar texto de un buffer a un ansi-term, pero no pueden copiar texto de un ansi-term a otro buffer (por ejemplo, copiar un comando que acaba de ejecutar en un script de shell que está editando). Agregar esto a mi archivo .emacs resolvió ese problema para mí (en Emacs 24.4):
(defun my-term-mode-hook ()
(define-key term-raw-map (kbd "C-y") ''term-paste)
(define-key term-raw-map (kbd "C-k")
(lambda ()
(interactive)
(term-send-raw-string "/C-k")
(kill-line))))
(add-hook ''term-mode-hook ''my-term-mode-hook)
Tenga en cuenta que si desea vincular kill / yank a una pulsación de tecla que comience con los caracteres de escape de ansi-term (de forma predeterminada Cc y Cx), y desee que esto funcione en el improbable caso de que estos cambien, puede definir sus pulsaciones ( sin el escape principal) al term-raw-escape-map
, como se hace en la respuesta del usuario347585.