Deshabilite completamente toda la sangría automática

18

¿Cómo deshabilito completamente toda la sangría automática en Emacs? Necesito deshabilitarlo al menos para el modo Fundamental, pero estoy de acuerdo con que se deshabilite globalmente para la sesión actual.

Lea el resto de esta pregunta antes de declararla como un duplicado. Todas las otras respuestas que he encontrado son para una desactivación mucho más específica de la sangría. Realmente quiero deshabilitar por completo toda la sangría automática para toda la sesión.

Establecer electric-layout-modeen nilno funciona.

Detalles

A veces me gusta componer grandes mensajes de confirmación de Git con mi editor de texto ASCII de Windows. Estos mensajes con frecuencia tienen listas de viñetas, bloques de código u otras cosas donde el formato preciso en mi documento fuente es significativo. Mi base de código está en Linux, y me conecto a la caja usando un cliente SSH de solo texto. Cuando Git ingresa a Emacs para editar el mensaje de confirmación, quiero poder copiar el mensaje de confirmación de origen en el portapapeles de Windows y luego pegarlo usando los comandos de pegar de Windows. Desde la perspectiva de Emacs, estoy escribiendo lo que se encontró en el archivo de texto de Windows. Desafortunadamente, cuando Emacs ve líneas con sangría, agrega su propia sangría automática, por lo que obtengo este enorme triángulo de espacios en blanco a lo largo del borde izquierdo del búfer.

Estoy usando GNU Emacs 24.3.1.

Solución alterna

Mi solución actual es transferir mi archivo de texto de Windows a un sistema de archivos montado por mi host Linux, cargar el archivo en Emacs, luego usar kill y yank para transferir el contenido. Esto es un poco torpe.

Ejemplo

Aquí hay un ejemplo de bloque de texto:

a

  - b
    c
    d

Así es como aparece cuando pego eso en Emacs-under-ssh a través de MSWin paste:

a

  - b
      c
          d

Si presiono C-h ldespués de pegar, esto es lo que veo. Tenga en cuenta que las nuevas líneas se ingresan utilizando C-j, no RET.

a C-j C-j SPC SPC - SPC b C-j SPC SPC SPC SPC c C-j
SPC SPC SPC SPC d C-j C-h l
Señor fooz
fuente
En la medida en que algunas de las variables relacionadas con sangría son localmente en el búfer, debería haber algo que se ejecute después del enlace del modo mayor, por ejemplo, tal vez [?] hack-local-variables-hook, Para deshacer esencialmente lo que otros modos principales establecen como parte de su Inicialización estándar. fundamental-modees sólo una pequeña función en el interior simple.el- es decir, (kill-all-local-variables) (run-mode-hooks). M-x find-function RET fundamental-mode RET- puede modificar / crear el suyo según sea necesario; sin embargo, si cambia el nombre, algunas funciones no lo usarán, por lo tanto, considere mantener el mismo nombre.
ley
¿Emacs tiene un equivalente de vim :set paste? Eso básicamente dice "no toques el texto pegado de ninguna manera". Que también incluye la sangría automática.
Omair Majid

Respuestas:

21

Emacs ≤24.3

Al presionar RET no se sangra por defecto (excepto en algunos modos de programación, para los cuales debe verificar la configuración específica del modo, por ejemplo, la configuración "eléctrica").

Los terminales Unix normalmente pegan un carácter de retorno de carro cuando el contenido del portapapeles contiene una nueva línea (representada por el carácter de avance de línea). En Emacs, un retorno de carro se parece a la RETclave (de hecho, RET es el carácter de retorno de carro), mientras que un avance de línea se ve (es) C-j.

Sin embargo, en su caso, pegar una nueva línea da como resultado un C-j, que en Emacs está vinculado al comando newline-and-indent. Como su nombre indica, este comando sangra. No sé si PuTTY tiene una configuración que puede cambiar. Si desea solucionar el problema en el extremo de Emacs, hay una solución fácil que creo que no le importará: vincular C-ja newline(igual que RET).

(global-set-key "\C-j" 'newline)

Emacs ≥24.4

En Emacs 24.4, el modo de sangría eléctrica está activado por defecto. Es un modo menor global, por lo que puede apagarlo en todas partes llamando (electric-indent-mode 0)y puede alternarlo interactivamente M-x electric-indent-mode RET.

Puede encontrar esta información en el manual o mirando la documentación del comando invocado presionando Return(presionar C-h k RET).

Puede activarlo en un búfer específico con electric-indent-local-mode. Algunos modos de programación (especialmente los de terceros) pueden tener sus propias características de sangría automática que no siguen la configuración del modo de sangría eléctrica.

Gilles 'SO- deja de ser malvado'
fuente
electric-indent-modeestá deshabilitado de forma predeterminada (esto es coherente con lo que dijo porque estoy usando Emacs 24.3.1). Activarlo y desactivarlo no ayuda. electric-indent-local-modeno está disponible para mí a través de M-x. Ayuda sobre RETmenciona tres configuraciones: use-hard-newlines, auto-fill-function, y fill-column. Alternar o modificar los vía M-x use-hard-lines, M-x auto-fill-modey M-x set-fill-column RET 0 RETno ayudan.
Sr. Fooz
@MrFooz Oh, lo siento, no había prestado atención a la versión de Emacs en su pregunta. Pero luego me pregunto por qué estás obteniendo una sangría automática. Hmmm ¿Tienes sangría automática con emacs -q? Pegue un texto breve que contenga una nueva línea (por ejemplo, foonueva línea bar) en Emacs y presione C-h l, ¿qué ve? … f o o RET b a ro … f o o C-j b a ro … f o o RET C-j baro algo más? ¿En qué terminal ejecuta el cliente SSH?
Gilles 'SO- deja de ser malvado'
He agregado un ejemplo de texto publicitario a la publicación original. Agregar -qno ayuda (por ejemplo emacs -q -nw --no-desktop). Veo en C-jlugar de RET. Estoy usando PuTTY 0.63 como mi cliente SSH. Veo el mismo comportamiento con TERMset to screenand xterm.
Sr. Fooz
@MrFooz Ok, dado que PuTTY está enviando un LF en lugar de un CR, debe indicarle a Emacs que no sangre en un LF. Eso es fácil de desactivar a nivel mundial, he editado mi respuesta.
Gilles 'SO- deja de ser malvado'
Gracias, el global-set-keytruco solucionó el problema. Encontraré una manera de configurar mis EDITORalias para invocarlos automáticamente al inicio al editar mensajes de confirmación de Git. Se están pegando nuevas líneas en lugar de retornos de carro porque he configurado mi editor de texto de Windows favorito para usar terminaciones de línea de estilo UNIX en lugar de las de Windows.
Sr. Fooz
1

También puede probar el modo de pegado entre corchetes. Esta es una característica de su emulador de terminal (PuTTY en este caso, versiones 0.63 y posteriores) que utiliza secuencias de escape para indicar que el usuario está pegando algo, y luego nuevamente cuando finaliza el pegado. Hay un paquete de Emacs llamado bracketed-pasteque puede instalar, le permite a Emacs reconocer las secuencias de escape y hacer la transición a un mapa de teclas más seguro durante la duración del pegado. Esto no solo evita que la sangría se ensucie, sino que también evita que una pasta maliciosa ejecute comandos en su sesión de emacs M-x.

db48x
fuente