2011-06-04 5 views
23

Trabajo en un proyecto de código abierto donde el creador establece sus tabulaciones en 2 espacios.Emacs: Establezca sangría de tabulación para un solo archivo sobre la marcha

Me gustaría simplemente habilitarlo sobre la marcha para el archivo en el que trabajo y no para otros archivos del mismo tipo. Debe haber algo como M-xset-tab-indent. Es un archivo JavaScript que termina en .js.

Sé que puedo utilizar:

(setq-default tab-width int) 

dentro de mi archivo .emacs, pero más bien sólo llamar a un M-xcommand para establecer y olvidarse de él durante mi duración de trabajar en este archivo. Intenté M-xapropos y Google pero no pude encontrar el comando específico.

Gracias.

Respuesta

5

Crear un archivo ".dir-locals.el" en el directorio del proyecto y llenar así:

((nil . ((tab-width . 2)))) 

Esto se encargará de fijar pestaña de ancho de forma automática y no tener que modificar el archivo real (que probablemente es controlado por la versión).

Consulte the manual para obtener más información sobre el formato. Creo que esto requiere Emacs 23.

23

Puede hacer que la variable js-indent-level local al buffer usando:

M-x make-variable-buffer-local <RET> js-indent-level <RET>

entonces se puede establecer esa variable en el buffer usando:

M-x set-variable <RET> js-indent-level <RET> 2

+0

Esta debería ser la respuesta correcta ... puntos de bonificación si puede haber una función que podemos agregar a nuestros .emacs que hace estos 2 pasos en 1! –

+0

@AsfandYarQazi Siempre puede personalizar js-indent-level (abra un archivo .js, luego M-x customize-variable js-indent-level ). Esto le permitirá establecer un valor predeterminado y guardarlo para sesiones futuras. La pregunta era sobre cambiar la sangría sobre la marcha de un buffer específico. –

+0

Lo que quiero decir es que sería increíble tener una única función que pueda invocar con M-x que haga una variable buffer-local, y cambie su valor a algo. Así como 'M-x set-variable-locally' –

11

También puede utilizar el archivo variables locales para automatizar la solución de omrib para ese archivo, agregándole esto:

// Local Variables: 
// js-indent-level: 2 
// indent-tabs-mode: nil 
// End: 
+0

Las variables establecidas a través de la sección de Variables Locales se hacen automáticamente buffer-local, por lo que su' eval' era innecesario, y lo eliminé. – cjm

+0

Aún mejor (y tan obvio en retrospectiva). Gracias por ese cjm. – phils

+0

La única cosa sobre esto es que tendría que asegurarme de no comprometer esta línea en el repositorio público. –

1

Como han indicado otros, un problema con el File Local Variables approach es que necesita modificar el archivo, y eso no es ideal si necesita mantener esas declaraciones fuera del control de la versión.

Si desea que las variables que se aplican a todos archivos en un directorio dado, entonces Directorio variables locales es obviamente el camino a seguir, y se puede poner en práctica que, ya sea con un archivo .dir-locals.el, o llamando (dir-locals-set-directory-class):

prefiero la clase directorio de acercarse a mí, y yo era delgada Que es una lástima que no haya un enfoque análogo para las variables locales de archivos, pero encontré que el código de clase de directorio funciona perfectamente con los archivos, y el único problema es que dir-locals-set-directory-class llama al file-name-as-directory en su argumento, lo que impide que sea emparejado, debido a la barra final.

Por lo tanto, la siguiente es una forma de configurar las variables locales del directorio para un único archivo, sin modificar el archivo ni afectar a otros archivos en el mismo directorio principal.

(defun my-file-locals-set-directory-class (file class &optional mtime) 
    "Enable 'directory local' classes for individual files, 
by allowing non-directories in `dir-locals-directory-cache'. 
Adapted from `dir-locals-set-directory-class'." 
    (setq file (expand-file-name file)) 
    (unless (assq class dir-locals-class-alist) 
    (error "No such class `%s'" (symbol-name class))) 
    (push (list file class mtime) dir-locals-directory-cache)) 

(dir-locals-set-class-variables 
'my-javascript-class 
'((nil . ((js-indent-level . 2) 
      (indent-tabs-mode . nil))))) 

(my-file-locals-set-directory-class 
"path/to/the/file.js" 'my-javascript-class) 
0

Puedo usar un fragmento de código en mi init.el que trata de detectar automáticamente los archivos que utilizan guiones 2-espaciales, y cambiar la sangría de Emacs para ese archivo a 2 espacios cuando se ve este tipo de archivos:

(add-hook 'js-mode-hook 
      (lambda() 
      (when (string-match-p "^ [A-Za-z]" (buffer-string)) 
       (make-variable-buffer-local 'js-indent-level) 
       (set-variable 'js-indent-level 2)))) 
2

La manera más fácil de hacer esto para un solo buffer es usar M-x set-variable.

  1. Tipo M-x set-variable y pulse enter
  2. Cuando se le solicite para la variable a, fije tab-width continuación, presione ENTRAR
  3. se le pedirá a la línea Set tab-width (buffer-local) to value:. Ponga el valor que desea, luego presione enter

El buffer debe actualizarse instantáneamente con el nuevo valor.

Cuestiones relacionadas