emacs indentation

Establecer 4 sangría espacial en Emacs en modo texto



indentation (19)

Respuesta corta:

El punto clave es decirle a emacs que inserte lo que desee al sangrar, esto se hace cambiando la función de sangría de línea. 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 el manual de sangría controlada por Major Mode @ 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 usarán (y diversos comandos, como cuando llama a indent-region) 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 indent-relative para muchos modos.

Del manual indent-relative @ emacs:

Espacio relativo a la sangría hasta debajo del punto del próximo sangría en la línea anterior que no está en blanco.

[...]

Si la línea anterior que no está en blanco no tiene puntos de sangría más allá de donde comienza el punto de la columna, en su lugar se hace ''tab-to-tab-stop''.

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

No he podido lograr que Emacs cambie de 8 pestañas espaciales a 4 pestañas espaciales al presionar la TAB en las memorias intermedias con el modo text-mode principal. He agregado lo siguiente a mis .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 botón TAB siempre hace lo mismo.

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

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


Agregue esto a su archivo .emacs:

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

(setq default-tab-width 2)

Para asegurarse de que emacs está realmente 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 a 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!


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) (modify-syntax-entry ?_ "w") ; now ''_'' is not considered a word-delimiter (modify-syntax-entry ?- "w") ; now ''-'' is not considered a word-delimiter )))


Esta es la única solución que impide que una pestaña se inserte para mí, sin una secuencia o conversión de pestañas en 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 la 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 aplicar sangría fuera de la sangría automática, use:

M - i


Este problema no es causado por la falta de tabulaciones; es que emacs tiene un método de tabulación (¿nuevo?) llamado sangrado-relativo 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 el método relativo a la sangría para el modo de texto. No he descubierto una buena manera de anular la variable de función de línea de sangría (el enganche de modo de texto no funciona, entonces tal vez se restablezca después de ejecutar los ganchos de modo?) Pero una forma simple de deshacerse de esto el comportamiento es simplemente tirar el método intent-for-tab-command al establecer TAB en el método más simple de tab-to-tab-stop:

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


Has probado

(setq tab-width 4)


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

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


Las personalizaciones pueden sombrear (setq tab width 4) modo que 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 necesité ajustar tab-stop-list o ninguna función de insert :

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



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.


Puede agregar estas líneas de código a su archivo .emacs. Agrega un gancho para el modo de texto para usar insert-tab en lugar de indent-relative.

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


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

M-x customize-group

En el Customize group: ingrese indent .

Verá una pantalla donde puede configurar todas las 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 personalizaciones .


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


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


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


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

o agregue la entrada tab-stop-list a custom-set-variables 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))))


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


(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


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