it-swarm-es.tech

Establecer 4 espacios de sangría en Emacs en modo texto

No he logrado que Emacs cambie de 8 pestañas de espacio a 4 pestañas de espacio al presionar el TAB en buffers con el modo mayor text-mode. He añadido 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 archivo .emacs (o las variables locales de mi búfer) el TAB El botón siempre hace lo mismo.

  1. Si no hay texto arriba, guión 8 espacios
  2. Si hay texto en la línea anterior, haga sangría al principio de la segunda palabra

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

152
Cristian
(customize-variable (quote tab-stop-list))

o añada tab-stop-list entry a custom-set-variables in .emacs file:

(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))))
28
Bert F

Respuesta corta:

El punto clave es decirle a Emacs que inserte lo que quieras 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 solucionará tu problema:

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

Explicación:

De Sangría controlada por Major Mode @ emacs manual :

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

[...]

La variable indent-line-function es la función que se utilizará (y varios comandos, como cuando se llama a indent-region) para sangrar la línea actual. El comando de indentación según el 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 Espacio hasta debajo del siguiente punto de la sangría anterior.

[...]

Si la línea anterior que no está en blanco no tiene puntos de sangría más allá de los puntos de la columna, en su lugar se realiza `tab-to-tab-stop '.

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

132
alcortes

Actualización: Desde Emacs 24.4:

tab-stop-list ahora se extiende implícitamente hasta el infinito. Su valor predeterminado se cambia a nil, lo que significa que una pestaña detiene cada tab-width columnas.

lo que significa que ya no es necesario configurar tab-stop-list de la forma que se muestra a continuación, ya que puede mantenerlo en nil.

La respuesta original sigue ...


Siempre me duele un poco ver cosas como (setq tab-stop-list 4 8 12 ................) cuando la función number-sequence está ahí esperando para 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))
65
phils

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

M-x customize-group

En el Customize group: Prompt 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 .

21
Dave Webb
(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)
11
Yan Li
(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)
9
lawlist
(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

8
user2318996

Este problema no es causado por la falta de tabulaciones; es que emacs tiene un método de tabulación (¿nuevo?) llamado sangría relativa que parece diseñado para alinear datos tabulares. La tecla TAB se asigna al método indent-for-tab-command, que invoca cualquier método con el que la variable indent-line-function esté establecida, que es un método relativo a la sangría para el modo de texto. No he descubierto una buena manera de anular la variable indent-line-function (el gancho de modo de texto no funciona, así que ¿tal vez se reinicie después de que se ejecuten los ganchos de modo?) Pero una forma sencilla de deshacerse de esto el comportamiento es simplemente rechazar el método de intención-por-tab-comando configurando TAB al método más simple tab-to-tab-stop:

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

7
Glenn

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 literal de TAB con tabulaciones cada 4 caracteres (pero solo en el modo Texto). Si eso no es lo que está pidiendo, describa el comportamiento que le gustaría ver.

6
cjm

Puedes agregar estas líneas de código a tu archivo .emacs. Agrega un gancho para que el modo de texto use insert-tab en lugar de 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.

6
gigilibala

Agregue esto a su archivo .emacs:

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

(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)

Como punto de partida, el valor predeterminado para emacs al retroceder en una pestaña es convertirlo en espacios y luego eliminar un espacio. Esto puede ser molesto. Si solo quieres eliminar la pestaña, puedes hacer esto:

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

¡Disfrutar!

4
qwerty9967

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

4
dividebyzero

Las personalizaciones pueden sombrear (setq tab width 4), por lo tanto, use setq-default o 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-list o ninguna de las funciones insert:

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

Encontró útil agregar esto inmediatamente después (una sugerencia de emacsWiki):

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

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

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

Esta es la única solución que evita que una pestaña se inserte, sin una secuencia o conversión de pestañas a espacios. Ambas parecían adecuadas, pero desperdiciadas:

(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 (Python por ejemplo), la sangría es automática en Emacs. Si necesita sangrar fuera de la sangría automática, use:

M-i

1
ryanpcmcquen

Desde mi archivo de inicio, 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-entrada de sintaxis? _ "w "); ahora '_' no se considera un delimitador de palabras 
 (modificar-sintaxis-entrada? -" w "); ahora '-' no se considera un delimitador de palabras 
)) ) 
0
forkandwait

Has probado

(setq  tab-width  4)
0
GrokCode

Por cierto, para modo C , agrego(setq-default c-basic-offset 4)a .emacs. Consulte http://www.emacswiki.org/emacs/IndentingC para más detalles.

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