emacs - password - terminales mac
Los colores de emacs terminales solo funcionan con TERM=xterm-256color (6)
Agregue esto a su ~/.emacs
:
(add-to-list ''term-file-aliases
''("st-256color" . "xterm-256color"))
Le dice a emacs que si ve TERM=st-256color
entonces debe inicializar el terminal como si hubiera visto TERM=xterm-256color
.
Respuesta más larga:
Emacs muestra colores extraños porque cree que su terminal solo admite 8 colores. En Emacs, ejecute Mx list-colors-display
para ver los colores que cree que están disponibles. La cantidad correcta de colores se detecta durante la inicialización específica del terminal . Dice, en parte:
Cada tipo de terminal puede tener su propia biblioteca Lisp que Emacs carga cuando se ejecuta en ese tipo de terminal.
En mi máquina, los archivos de inicialización específicos del terminal se encuentran en /usr/local/share/emacs/25.*/lisp/term
. Tiene archivos para xterm, rxvt, pantalla, etc. pero nada para st. Necesitamos ayudar a Emacs a encontrar el archivo de inicialización correcto. La documentación dice además:
Si hay una entrada que coincida con TERM en la lista de asociación term-file-aliases, Emacs usa el valor asociado en lugar de TERM
Entonces esa lista de asociación es una forma recomendada de manejar terminales desconocidos. Funciona sin tener que anular manualmente la variable de entorno TERM.
He descubierto que emacs terminal no representa los colores correctos a menos que establezca explícitamente TERM = xterm-256color. Yo uso gnome-terminal, y por lo que entiendo, term debe establecerse en gnome-256color. Del mismo modo, tiendo a usar tmux mucho, lo que aconseja contra cualquier configuración TERM que no sea screen-256color. Desafortunadamente, ambas configuraciones (dentro de su contexto respectivo - gnome-terminal
o tmux
) resultan en emacs que tienen colores incorrectos, mientras que vim muestra los colores correctamente. Sin embargo, si export TERM=xterm-256color
, los colores funcionan bien en emacs.
¿Alguien puede explicar lo que está pasando u ofrecer una solución?
Actualizar
Esto es lo que estoy tratando:
Puedo conseguir que los colores se vean correctos en el terminal agregando lo siguiente a mi init.el
:
(defun terminal-init-gnome ()
"Terminal initialization function for gnome-terminal."
;; This is a dirty hack that I accidentally stumbled across:
;; initializing "rxvt" first and _then_ "xterm" seems
;; to make the colors work... although I have no idea why.
(tty-run-terminal-initialization (selected-frame) "rxvt")
(tty-run-terminal-initialization (selected-frame) "xterm"))
Sin embargo, esto se siente muy, muy mal. Tiene que haber una explicación lógica para esto ...
PD
Tengo muy poco conocimiento de terminfo y el papel preciso que desempeña $TERM
en el proceso de comportamiento del terminal de color. Si es seguro usar siempre xterm-256color
(incluso cuando $TERM
"debería" ser gnome-256color
o screen-256color
), voy a ir con eso.
En ubuntu 10.04 también noté que ejecutar emacs -nw
dentro de byobu/tmux/screen
usaba colores diferentes de emacs -nw
en el gnome-terminal normal.
Descubrí que esto se debe a que byobu
estaba estableciendo TERM
en screen-bce
. Luego, estableciendo TERM
a xterm
(para mí, en el gnome-terminal
normal TERM=xterm
) me dio el mismo resaltado de sintaxis cuando no se ejecutaba byobu/screen
.
Entonces todavía no estoy seguro de cuál es la solución adecuada.
Véase también esta publicación: resaltado de sintaxis Emacs en modo Python
Este comportamiento tiene que ver con la lógica que utiliza EMACS para determinar si el fondo del terminal es oscuro o claro. Ejecute Mx list-colors-display
con TERM
establecido en xterm-256color
o screen-256color
y verá que se muestran exactamente los mismos colores. Como señaló en los comentarios, la diferencia en los esquemas de color que ha observado se debe al modo de fondo del marco. Para ver esto, con su TERM
establecido en screen-256color
, compare los colores en
emacs -Q -nw --eval "(setq frame-background-mode ''light)"
y
emacs -Q -nw --eval "(setq frame-background-mode ''dark)"
La función frame-set-background-mode
(en frame.el
) comprueba si el tipo de terminal coincide con "^//(xterm//|//rxvt//|dtterm//|eterm//)"
si puede deducir el color de fondo de lo contrario.
Dentro de una sesión en ejecución, puede cambiar la combinación de colores a ''light
evaluando
(let ((frame-background-mode ''light)) (frame-set-background-mode nil))
Los terminales son un tipo especial de dispositivo. Cuando un proceso envía secuencias de bytes especiales (llamadas secuencias de control) al terminal, realiza alguna acción (como posicionamiento del cursor, cambio de colores, etc.).
Puede leer los códigos de terminal ANSI para obtener más detalles sobre las secuencias de control.
Pero los terminales vienen de los 70, cuando el hardware tenía capacidades limitadas, y un terminal no puede proporcionar información sobre sus capacidades (es decir, qué secuencias admite).
$ TERM se utilizó para resolver este problema: permite que los programas sepan qué enviar a la terminal para realizar el trabajo. termcap y terminfo son bases de datos que almacenan información sobre capacidades de terminal para muchos nombres de $ TERM . Si su $ TERM no está en la base de datos, debe solicitarle a un administrador que lo agregue.
Todos los emuladores de terminal heredan estas limitaciones de los terminales de hardware antiguos. Por lo tanto, necesitan un $ TERM adecuadamente establecido, y el DB terminfo / termcap DEBE tener datos para este terminal. Cuando se inicia un terminal virtual, establece la variable $ TERM para ti (y dentro de programas como bash). Si $ TERM no está en terminfo / termcap puede definir rápidamente un alias de $ TERM a xterm-256color (puede encontrar ejemplos en el archivo termcap sobre cómo hacerlo).
No estoy tan familiarizado con cómo emacs maneja diferentes terminales exactamente. Pero mirando el directorio lisp/term
en las fuentes de emacs, descubrí que la existencia de una función terminal-init-xxx
permite agregar soporte para diferentes terminales. Por ejemplo, tengo:
(defun terminal-init-screen ()
"Terminal initialization function for screen."
;; Use the xterm color initialization code.
(xterm-register-default-colors)
(tty-set-up-initial-frame-faces))
en mi .emacs
, que agrega soporte para screen-256color
. Puede intentar definir una función similar para gnome cambiando el nombre de la función anterior a terminal-init-gnome
.
NOTA: Si está interesado, puede intentar rastrear las llamadas desde el código de tty-run-terminal-initialization
. Primero obtiene el tipo de terminal usando la función tty-type
, luego mira ciertas ubicaciones para cargar un archivo de terminal relevante, luego trata de localizar la función terminal-init-xxx
, y finalmente la llama. Puede ayudarte a encontrar el nombre correcto para gnome-terminal
.
Parece que a menos que su TERM indica que su terminal tiene 256 colores, emacs solo usará 8. Cambiar TERM
a gnome-256color
permitió que funcionen las funciones de registro de color.
Hay una forma de hacer trampa, después de todo. Cuando ejecuto gnome-terminal
, mi terminal está configurado en xterm
de manera predeterminada. En lugar de cambiar la variable TERM
, es posible redirigir xterm
a otra terminal, por ejemplo, gnome-256color
. Simplemente cree el directorio $(HOME)/.terminfo/x
, luego ejecute ln -s /usr/share/terminfo/g/gnome-256color ~/.terminfo/x/xterm
. Creo que esto es mejor que establecer TERM
manualmente en .bashrc
, porque solo redirige un terminal en particular a otra cosa. Un inicio de sesión de la consola aún dejaría TERM
como linux
, y no como xterm-256color
.
Tal vez no estoy entendiendo algo, compre por qué no ejecutas emacs como este:
TERM=xterm-256color emacs -nw
De esta forma, Emacs tiene su propia configuración TERM que usted sabe que funciona. También puede hacer un alias o ajustarlo en shell-script.