Establecer 4 sangría espacial en Emacs en modo texto

159

No he logrado que Emacs cambie de 8 pestañas espaciales a 4 pestañas espaciales al presionar las TABmemorias intermedias en el modo principal text-mode. He agregado lo siguiente a mi .emacs:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

;;; And I have tried
(setq indent-tabs-mode nil)
(setq tab-width 4)

No importa cómo cambie mi .emacsarchivo (o las variables locales de mi búfer), el TABbotón siempre hace lo mismo.

  1. Si no hay texto arriba, sangra 8 espacios
  2. Si hay texto en la línea anterior, sangra al principio de la segunda palabra

Por mucho que ame a Emacs, esto se está volviendo molesto. ¿Hay alguna manera de hacer que Emacs al menos sangra 4 espacios cuando no hay texto en la línea anterior?

Cristian
fuente
Para una línea de modo C ++ o csharp-mode agregué (setq tab-width 4) (setq c-basic-offset 4) al final de (defun csharp-mode () ...) e hice el truco para hacer ( 1) las pestañas se muestran como 4 en lugar de 8 caracteres y (2) cuando presiono la pestaña, obtengo 4 espacios en una nueva línea.
Jared Updike
Muy tarde, pero me acabo de dar cuenta de que usar (setq tab-width 4) no funciona, pero si usas (setq-default tab-width 4) no necesitas hacer nada más.
Sambatyon
Vea mi respuesta si desea usar espacios pero vaya a tabulaciones.
Forkandwait
Nota para otros que han encontrado esta pregunta: ¡ (setq-default tab-width 4)NO es lo mismo que (setq tab-width 4)asegurarse de no perderse el "-default"!
zachaysan
10
No puedo creer que esto sea tan difícil de hacer.
gwg

Respuestas:

30
(customize-variable (quote tab-stop-list))

o agregue la entrada tab-stop-list a las variables de conjunto personalizado en el archivo .emacs :

(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))))
Bert F
fuente
9
Se necesitan tab-width y tab-stop-list. el ancho de tabulación se usa al VISUALIZAR pestañas, mientras que tab-stop-list es necesario para determinar tabulaciones cuando AGREGA pestañas.
Michael Ratanapintha
3
Tenga en cuenta stackoverflow.com/questions/69934/…
phils
55
¿Realmente no hay nada más corto que '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120)))? Bueno, mientras funcione, supongo ...: P
HelloGoodbye
55
Según la documentación, no necesita todas esas posiciones. Simplemente haz 4 8 12 y se extenderá a todos los demás (sigue sumando 4). Aparentemente, si solo usa 1 o 2 elementos en lugar de 3, solo usará el ancho de tabulación como último paso. Entonces, teóricamente, si quisiera tabular por cuatro espacios, y mi ancho de tabulación se estableció en 4. Podría escribir '(tab-stop-list (quote (4))).
Nicholas Peterson
1
@NicholasPeterson gracias por notar eso! Sin embargo, parece que en la práctica se quotenecesitan dos números para continuar la secuencia hasta el infinito. Ver: stackoverflow.com/a/42148697/2662028
ryanpcmcquen
138

Respuesta corta:

El punto clave es decirle a emacs que inserte lo que quiera al sangrar, esto se hace cambiando la función de línea de sangría. Es más fácil cambiarlo para insertar una pestaña y luego cambiar las pestañas en 4 espacios que cambiarlo para insertar 4 espacios. La siguiente configuración resolverá su problema:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)

Explicación:

Desde la sangría controlada por el modo principal @ manual de emacs :

Una función importante de cada modo principal es personalizar la clave para sangrar correctamente para el idioma que se está editando.

[...]

La variable de función de línea de sangría es la función que deben usar (y varios comandos, como cuando se llama a la región de sangría) para sangrar la línea actual. El comando sangría según modo no hace más que llamar a esta función.

[...]

El valor predeterminado es relativo a la sangría para muchos modos.

Del manual indent-relative @ emacs:

Espacio relativo a la sangría hacia afuera hasta el siguiente punto de sangría en la línea anterior sin espacios en blanco.

[...]

Si la línea anterior que no está en blanco no tiene puntos de sangría más allá del punto de la columna, comienza en `tab-to-tab-stop '.

Simplemente cambie el valor de indent-line-function a la función insert-tab y configure la inserción de tabulación como 4 espacios.

alcortes
fuente
10
Tengo el mismo problema que el OP, su solución no funciona para mí.
Gauthier
Por favor, explique más. ¿Quiere decir que usar las líneas anteriores como el único contenido de sus .emacs y llamar "Mx sangría según el modo" no insertará 4 espacios?
alcortes
3
Su configuración inserta 8 espacios para mí.
Vladimir Mihailenco
44
Estoy usando emacs versión 23.3.1 y la respuesta corta no lo cambia a espacios. Esta respuesta es engañosa.
VNarasimhaM
2
@BruceBarnett Estoy en modo texto y estas instrucciones aún no funcionan.
soleado
66

Actualización: desde Emacs 24.4:

tab-stop-listahora se extiende implícitamente al infinito. Su valor predeterminado cambia a lo nilque significa que una tabulación detiene todas las tab-widthcolumnas.

lo que significa que ya no es necesario configurarlo tab-stop-listde la manera que se muestra a continuación, ya que puede mantenerlo configurado en nil.

La respuesta original sigue ...


Siempre me duele un poco ver cosas como (setq tab-stop-list 4 8 12 ................)cuando la number-sequencefunción está allí esperando a ser utilizada.

(setq tab-stop-list (number-sequence 4 200 4))

o

(defun my-generate-tab-stops (&optional width max)
  "Return a sequence suitable for `tab-stop-list'."
  (let* ((max-column (or max 200))
         (tab-width (or width tab-width))
         (count (/ max-column tab-width)))
    (number-sequence tab-width (* tab-width count) tab-width)))

(setq tab-width 4)
(setq tab-stop-list (my-generate-tab-stops))
phils
fuente
Esta es la única respuesta que podría obtener para trabajar en mi sistema.
Karpov
emacs página Personalizar guión dice lista de pestañas "se extiende hasta el infinito implícitamente mediante la repetición del último paso" - lo que significa una lista (4 de 8) debe ser lo suficientemente bueno, sin número de secuencia explícita
James Waldby - jwpat7
@ JamesWaldby-jwpat7 De hecho, eso sucedió en 24.4 (2014). NEWS dice: " tab-stop-listahora se extiende implícitamente al infinito. Su valor predeterminado se cambia a cero, lo que significa que una tabulación detiene todas las tab-widthcolumnas". - De hecho, puede usar el valor predeterminado de nil.
phils
21

Puede que le resulte más fácil configurar sus pestañas de la siguiente manera:

M-x customize-group

En el Customize group:indicador ingrese indent.

Verá una pantalla donde puede configurar todas sus opciones de sangría y configurarlas para la sesión actual o guardarlas para todas las sesiones futuras.

Si lo hace de esta manera, querrá configurar un archivo de personalización .

Dave Webb
fuente
Necesito recordar Mx personalizar-grupo - ¡atajo muy útil!
Nick Bolton
11
(setq tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80))
(setq indent-tabs-mode nil)

fuente
10
(defun my-custom-settings-fn ()
  (setq indent-tabs-mode t)
  (setq tab-stop-list (number-sequence 2 200 2))
  (setq tab-width 2)
  (setq indent-line-function 'insert-tab))

(add-hook 'text-mode-hook 'my-custom-settings-fn)
lista de leyes
fuente
Esto funcionó para mí cuando otros en esta página no.
Michael Terry
Funciona en emacs26.3
Saurabh
9
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
(setq c-default-style "linux") 
(setq c-basic-offset 4) 
(c-set-offset 'comment-intro 0)

esto funciona para el código C ++ y el comentario dentro también

usuario2318996
fuente
Tarde a la fiesta, pero gracias. No puedo entender por qué emacs necesitaría instrucciones específicas para aplicar sus reglas de sangría al código C / C ++ también. Estaré mirando a Vim en el futuro ...
MegaWidget
Quiero hacer esta pregunta yo mismo SOLO PARA ACEPTAR ESTA RESPUESTA. Le daría una recompensa si pudiera. Estaba muy, muy molesto porque un cambio hizo que emacs no quisiera tabular a las 4, estaba analizando todas las soluciones en esta página, ¡y me ha ahorrado una enorme cantidad de trabajo!
Clasificación topológica
7

Este problema no se debe a la falta de tabulaciones; es que emacs tiene un método de tabulación (¿nuevo?) llamado relativo a sangría que parece diseñado para alinear datos tabulares. La tecla TAB se asigna al método indent-for-tab-command, que llama a cualquier método en el que se establezca la variable indent-line-function, que es un método relativo a la sangría para el modo de texto. No he descubierto una buena forma de anular la variable de función de línea de sangría (el enlace de modo de texto no funciona, por lo que tal vez se está restableciendo después de la ejecución de los ganchos de modo), pero una forma simple de deshacerse de esto el comportamiento es simplemente arrojar el método de intento de comando de tabulación configurando TAB al método más simple tab-to-tab-stop:

(define-key text-mode-map (kbd "TAB") 'tab-to-tab-stop)


fuente
6

Prueba esto:

(add-hook 'text-mode-hook
  (function
   (lambda ()
     (setq tab-width 4)
     (define-key text-mode-map "\C-i" 'self-insert-command)
     )))

Eso hará que TAB siempre inserte un carácter TAB literal con tabulaciones cada 4 caracteres (pero solo en modo Texto). Si eso no es lo que está pidiendo, describa el comportamiento que le gustaría ver.

cjm
fuente
44
Creo que el OP quiere espacios en lugar de pestañas (por lo que presionar Tab inserta 4 espacios).
mipadi
En conjunción con Aquamacs 2.4, esta respuesta particular me da caracteres en otro idioma en lugar de una pestaña: 렔. Si se presiona la tecla de tabulación más de una vez, el resultado es: 렔렔 (sin separación). Y lo mismo es cierto para cada pulsación de pestaña sucesiva.
leyes
6

Puede agregar estas líneas de código a su archivo .emacs. Agrega un gancho para el modo de texto para usar la pestaña de inserción en lugar de la sangría relativa.

(custom-set-variables
 '(indent-line-function 'insert-tab)
 '(indent-tabs-mode t)
 '(tab-width 4))
(add-hook 'text-mode-hook
      (lambda() (setq indent-line-function 'insert-tab)))

Espero que ayude.

gigilibala
fuente
4

Solo cambiar el estilo con c-set-style fue suficiente para mí.

dividir entre cero
fuente
4

Agregue esto a su archivo .emacs:

Esto establecerá el ancho que se muestra una pestaña a 2 caracteres (cambie el número 2 a lo que desee)

(setq default-tab-width 2)

Para asegurarse de que emacs esté usando pestañas en lugar de espacios:

(global-set-key (kbd "TAB") 'self-insert-command)

Por otro lado, el valor predeterminado para emacs cuando retrocede sobre una pestaña es convertirlo en espacios y luego eliminar un espacio. Esto puede ser molesto. Si desea que simplemente elimine la pestaña, puede hacer esto:

(setq c-backspace-function 'backward-delete-char)

¡Disfrutar!

qwerty9967
fuente
No cumple con los al menos 4 espacios preguntar en la pregunta.
kmarsh
2

Esta es la única solución que evita que una pestaña se inserte para mí, sin una secuencia o conversión de pestañas a espacios. Ambos parecían adecuados, pero derrochadores:

(setq-default
    indent-tabs-mode nil
    tab-width 4
    tab-stop-list (quote (4 8))
)

Tenga en cuenta que quote necesita dos números para funcionar (¡pero no más!).

Además, en la mayoría de los modos principales ( Pythonpor ejemplo), la sangría es automática en Emacs. Si necesita sangrar fuera de la sangría automática, use:

M-i

ryanpcmcquen
fuente
2

Las personalizaciones pueden sombrearse, (setq tab width 4)así que use setq-defaulto deje que Customize sepa lo que está haciendo. También tuve problemas similares al OP y lo solucioné solo con esto, no necesitaba ajustar tab-stop-listni ninguna insertfunción:

(custom-set-variables
 '(tab-width 4 't)
 )

Me pareció útil agregar esto inmediatamente después (un consejo de emacsWiki):

(defvaralias 'c-basic-offset 'tab-width)
(defvaralias 'cperl-indent-level 'tab-width)
Yary
fuente
1

Las mejores respuestas no funcionaron hasta que escribí esto en el archivo .emacs:

(global-set-key (kbd "TAB") 'self-insert-command)
usuario1009285
fuente
0

Has probado

(setq  tab-width  4)

fuente
2
Tienen esto en su pregunta, así que sí, es seguro asumir que lo intentaron.
ryanpcmcquen
0
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
Razón
fuente
0

Desde mi archivo init, diferente porque quería espacios en lugar de pestañas:

(add-hook 'sql-mode-hook
          (lambda ()
             (progn
               (setq-default tab-width 4)
               (setq indent-tabs-mode nil)
               (setq indent-line-function 'tab-to-tab-stop) 
               (modificar-sintaxis-entrada? _ "w"); ahora '_' no se considera un delimitador de palabras
               (modificar-sintaxis-entrada? - "w"); ahora '-' no se considera un delimitador de palabras
               )))
Forkandwait
fuente
0

Modificó esta respuesta sin ningún gancho:

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
Saurabh
fuente