2010-05-21 10 views
37

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.Copiar/Pegar en emacs shell de ansi-term

Agradecería cualquier idea o solución.

para proporcionar un contexto He configurado ANSI plazo 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"))) 

Respuesta

60

Es posible que desee simplemente cambiar entre el modo de caracteres y el modo de línea mientras usa el terminal. C-x C-j 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 C-c C-k.

+0

¡Un gran consejo, gracias! +1 – danlei

+0

Esto no funciona demasiado bien con el indicador alineado a la derecha que proporcionan cosas como zsh. – l0st3d

+14

En Emacs 24, parece que mientras está en el terminal necesita presionar 'C-c C-j' para ir al modo de línea, y luego para volver, es 'C-c C-k' como se indicó anteriormente. – djhaskin987

5

ansi-term, en char-mode, toma los enlaces ordinarios para la emulación de terminal. Necesita un nuevo enlace, además de una forma de salida 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) 

Al hacer esto, C-c C-y se moverá. 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.

+0

Apreciar su respuesta. A ")" faltaba al final. Lamentablemente, esto no parece funcionar para mí. Estoy recibiendo el error C-c C-y no está definido. – Sandeep

+0

Hm, intenté ejecutar "emacs -q" con emacs 23.2, y (después de corregir la paren faltante que me indicó), evalué, copié texto aleatorio y luego comencé a usar ansi-term. Al presionar C-c C-y, de hecho, lo pegué. Dado que esto está utilizando un gancho, asegúrese de haber reiniciado el período de espera después de evaluarlo. si eso no funciona, pruébalo en un emacs iniciado con -q. También puede intentar presionar C-c C-h, que enumera los enlaces que comienzan con C-c. C-c C-y debería estar listado con ?? (porque estamos usando un lambda sin nombre). – user347585

+0

Hola. Intenté reiniciar emacs con y sin -q. Pero todavía no está funcionando. Estoy usando emacs 23.1 en ubuntu. R C-c C-h no muestra ningún enlace cuando comienzo emacs normalmente. Con -q tengo varias ataduras, pero ninguna sobre C-c C-y.¿Hay algún resultado de registro o depuración que pueda ver para ver lo que falta? Gracias. -Sandeep – Sandeep

5

Como se describe en this lovely blog snippet, existe una función, term-paste, en term.el, que hace exactamente lo que desea. Por defecto está limitado solo a S-insert, pero el blog recomendado C-c C-y parece una buena sugerencia.

0

Estas otras soluciones no me funcionan bien, cambiar entre el modo de caracteres y el modo de línea hace que ansi-term deje de funcionar correctamente de forma aleatoria y establecer el term-paste de ansi-term en Cc Cy (basado en el enlace de Glyph). que no funcionó fue el fragmento de código de plazo, no ANSI plazo:

(eval-after-load "ansi-term" 
    '(define-key ansi-term-raw-map (kbd "C-c C-y") 'term-paste)) 
0

las soluciones anteriores funcionan bien para copiar el texto de algún buffer para ANSI-plazo, pero no son capaces de copiar el texto de la norma ANSI -termino a otro buffer (por ejemplo, copiar un comando que acaba de ejecutar a un script de shell que está editando). La adición de este a mi archivo .emacs se resolvió el 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 enlazar eliminados/tirón a una combinación de teclas que comienza con los caracteres de escape ANSI plazo (por defecto Cc y Cx), y quiere que esto funcione en el caso improbable de que esos cambios cambien, puede definir sus pulsaciones de teclas (sin el escape inicial) a term-raw-escape-map, como se hace en la respuesta del usuario347585.

Cuestiones relacionadas