emacs - varias - tabuladores




Emacs: establece la sangría de tabulación para un solo archivo sobre la marcha (4)

Trabajo en un proyecto de código abierto donde el creador establece sus tabulaciones en 2 espacios.

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

Sé que puedo usar:

(setq-default tab-width int)

dentro de mi archivo .emacs , pero prefiero llamar a un command Mx para configurarlo y olvidarlo durante mi tiempo de trabajo en este archivo. apropos Mx apropos y Google pero no pude encontrar el comando específico.

Gracias.


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

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

Crea un archivo ".dir-locals.el" en el directorio del proyecto y complétalo así:

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

Esto se ocupará de establecer el ancho de las pestañas automáticamente y no es necesario modificar el archivo real (que probablemente esté controlado por la versión).

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


Utilizo un fragmento de código en mi init.el que intenta detectar automáticamente los archivos que usan sangrías de 2 espacios, y cambiar la sangría de Emacs para ese archivo a 2 espacios cuando ve dichos 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))))

Según lo indicado por otros, un problema con el enfoque de File Local Variables 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 se apliquen a todos los archivos en un directorio dado, entonces las Variables Locales del Directorio obviamente son el camino a seguir, y puede implementar eso con un archivo .dir-locals.el , o llamando (dir-locals-set-directory-class) :

Yo prefiero el enfoque de la clase de directorio, y pensé que es una pena 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 ese dir-locals-set-directory-class llama a file-name-as-directory en su argumento, lo que impide que coincida, debido a la barra al final.

Por lo tanto, la siguiente es una forma de configurar las variables locales del directorio para un único archivo, sin modificar el archivo en sí, 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)




emacs