2010-10-23 12 views
18

tengo que ser capaz de configurar los ajustes de la ficha para los siguientes tipos de archivos:¿Cómo puedo configurar los ajustes de la pestaña Emacs por tipo de archivo?

  • .RB: 2 plazas blandas
  • .css, .html.erb: 4 pestañas espacio

He intentado lo siguiente, pero nada de eso parece alterar mi configuración de pestañas predeterminada para cada uno de los tipos de archivos.

;; js-mode-hook has also been tried 
(add-hook 'javascript-mode-hook 
     '(lambda() 
     (setq tab-width 4))) 

(add-hook 'css-mode-hook 
     '(lambda() 
     (setq tab-width 4))) 

(add-hook 'html-mode-hook 
     '(lambda() 
     (setq tab-width 8))) 

Soy bastante nuevo en emacs por lo que mi conocimiento de la configuración es bastante bajo.

+0

usted estaba pidiendo archivos .rb que son archivos ruby. Pero tus ganchos son para javascript. ¿Qué es .erb? – VitoshKa

+0

Debería haber mencionado que mi configuración actual usa 2 pestañas espaciadas por defecto que funcionan para los archivos ruby. En cuanto a los archivos .erb, son esencialmente archivos html con código ruby ​​incorporado. Consulte http://en.wikipedia.org/wiki/ERuby#erb para obtener más información. – chris

Respuesta

25

En emacs, cada modo tiene su propio estilo de sangría. El comando principal para sangrar (vinculado a TAB) es indent-for-tab-command. Este comando llama a la función de sangría específica de modo que se encuentra en la variable indent-line-function. Entonces, cada modo tiene su propia manera de hacerlo.

para Ruby (para mis emacs 2 es un defecto):

(setq ruby-indent-level 2) 

Por CSS (de nuevo, por defecto es 4 para mí):

(setq css-indent-offset 4) 

Desafortunadamente modo de SGML (en el que el modo HTML se basa) tiene un mecanismo de sangría muy simple y aparentemente el nivel no es configurable. Consulte el código fuente de la función sgml-calculate-indent.

Personalmente, me parece extraño. No estoy escribiendo HTML, pero puede intentar modificar la función sgml-calculate-indent usted mismo :). Aprende un poco de ceceo.

Estoy usando el modo js2, y se ajusta perfectamente por defecto. Para js tienes que buscar js-indent-level o algo similar.

Saludos.

+0

Con eso obtengo los anchos de pestañas adecuados, pero sigo teniendo pestañas suaves. Intenté (setq indent-tabs-mode t), pero eso no parece hacer nada. – chris

+0

indent-tabs-mode es una variable local de buffer. Si quiere habilitarlo, use globalmente (set-default 'indent-tabs-mode t). Esto funciona para mí al menos para el modo de texto. Algunos otros modos pueden no tenerlo en cuenta. Por ejemplo, ruby ​​tiene 'ruby-indent-tabs-mode' que resolverá tu problema para ruby. En css no he visto ningún efecto hasta el momento, y no puedo encontrar la variable responsable de eso. Lo siento. Aparentemente, el diseñador de cada modo toma su propia decisión con respecto a la funcionalidad de las pestañas. – VitoshKa

+0

He jugado con todas las xxx-indent-tabs-mode que pude pensar, pero todavía son todas suaves. – chris

7

Hay una serie de aspectos sobre la forma en que Emacs hace la indentación. Establecer el ancho de la pestaña solo especifica qué tan grande es una pestaña si se inserta una pestaña literal. Si no desea utilizar pestañas literales para el sangrado, entonces usted debe primero desactivar su inserción (from the manual ):

Emacs normalmente utiliza ambas pestañas y espacios a sangrar líneas. Si lo prefiere, todas las sangrías se pueden hacer desde espacios solamente. Para solicitar esto, configure indent-tabs-mode en nil. Esta es una variable de por búfer, por lo que la modificación de la variable afecta solo al búfer actual, pero hay un valor predeterminado que también puede cambiar.que también puede cambiar.

Sin embargo, para especificar los niveles de sangría, que también tendrá que establecer la variable de c-basic-offset value así:

(add-hook 'html-mode-hook 
     '(lambda() 
     (setq c-basic-offset 4) 
     (setq indent-tabs-mode nil)) 

En su caso, puede que sólo necesite la c-basic-offset pero tratar algunas combinaciones y vea qué funciona mejor.

+0

Utilicé el c-basic-offset que probé con y sin el modo sangría-pestañas, así como con/sin ancho de pestañas y ninguno funcionó. Estoy usando el kit de inicio de emacs así que ¿es posible que algún otro archivo .el esté anulando mi configuración en chris.el? – chris

+0

Después de eliminar todos los otros archivos de configuración, excepto mi archivo personalizado con solo la configuración que tiene arriba, aún obtengo una sangría de 2 espacios en la tabulación. – chris

+0

Creo que la respuesta de VitoshKa es más relevante en este caso: lo que describo debería funcionar para cualquier modo derivado de modo cc (por ejemplo, modo java, modo csharp, etc.). Lo siento si eso ha sido engañoso, mis disculpas. – cristobalito

5

js-modo utiliza js-indent-level a fin de poner en sus (setq js-indent-level 4) ~/.emacs (no deben tener que estar en un gancho, incluso, pero si usted se está preguntando, es js-mode-hook, no javascript-MODE gancho).

Si el ajuste del ancho de tabulación no cambia su nivel de sangría para un cierto modo, a menudo es más simple abrir la fuente para ese modo. Encontré esta variable haciendo C-h f js-mode, haciendo clic en el enlace "js.el", luego buscando "sangrado", segundo golpe desde la parte superior.


Sin embargo, si usted colabora mucho con otras personas, a menudo es mejor poner una cookie en la parte superior del archivo. Me suelen hacer // -*- tab-width: 8 -*- en el archivo, y luego tengo cosas como esta en mis ~/.emacs:

(defvaralias 'c-basic-offset 'tab-width) 
(defvaralias 'cperl-indent-level 'tab-width) 
(defvaralias 'perl-indent-level 'tab-width) 
(defvaralias 'js-indent-level 'tab-width) 

de modo que tenga menos variables para hacer frente a (y no tiene que obtener advertencias sobre el archivo -la variable local no es segura o lo que sea si el escritor de modos olvidó declararla como segura)

0

Si está utilizando css-mode.EL de ELPA con emacs 23.1.1, puede parametrizar la configuración global para ancho de tabulación para CSS archivos para el ancho de la pestaña haciendo lo siguiente: 1) Escriba Mx customize-variable, 2) Luego escriba css-indent-level, 3) Luego, después de cambiar la variable a su gusto, "Guardar para futuras sesiones".

0

Para HTML y erb: si está utilizando web-mode (el modo proporcionado por Spacemacs) puede ser tan simple como:

(setq-default web-mode-code-indent-offset 2 web-mode-markup-indent-offset 2)

donde markup-indent-offset se refiere a las etiquetas reales y code-indent-offset se refiere a Ruby embebido en ERB, etc.

Cuestiones relacionadas