2010-11-11 14 views
10

Mi equipo usa un tipo especial de archivo para la configuración, y me gustaría auto-sangrar (bloquear sangría) el archivo usando emacs.Hendidura personalizada de Emacs

Me gustaría aumentar la sangría mediante un tamaño de tabulación para un paréntesis de apertura - {o [, y disminuir por un tamaño de tabulación para un paréntesis de cierre -} o].

Por ejemplo,

files = { 
    file1 = first_file.txt 
    file2 = second_file.txt 
    rules = { 
     skip_header = 1 
     fast_process = 1 
    } 
} 

indentación de estilo C no funciona ya que una línea no termina con semi-colon.

He estudiado la sangría de emacs durante medio día hoy, pero todavía no sé cómo hacer esto.

Respuesta

0

Me parece que javascript-mode haría lo correcto con su muestra. Puede que no sea perfecto, pero es mucho más fácil que escribir su propio modo de sangría.

+0

Es javascript en modo mismos que java-mode? No puedo encontrar el modo javascript desde los comandos M-x. – canonv

+0

java-mode funciona bien para un paréntesis, pero no funciona bien para los corchetes. ¿Puedo hacer un ajuste en el modo java para que pueda funcionar para los corchetes? – canonv

+0

'javascript-mode' (un alias para' js-mode') viene incorporado en Emacs 23.2. ¿Tal vez estás ejecutando una versión anterior de Emacs? Si no puede o no desea realizar una actualización, consulte [JavaScriptMode] (http://www.emacswiki.org/emacs/JavaScriptMode) en la wiki de Emacs. –

11

Derive un nuevo modo del modo de texto o algo así y cree su propia función de sangría. Sé que es más fácil decirlo que hacerlo, por lo que este podría ser lo suficientemente cerca:

(define-derived-mode foo-mode text-mode "Foo" 
    "Mode for editing some kind of config files." 
    (make-local-variable 'foo-indent-offset) 
    (set (make-local-variable 'indent-line-function) 'foo-indent-line)) 

(defvar foo-indent-offset 4 
    "*Indentation offset for `foo-mode'.") 

(defun foo-indent-line() 
    "Indent current line for `foo-mode'." 
    (interactive) 
    (let ((indent-col 0)) 
    (save-excursion 
     (beginning-of-line) 
     (condition-case nil 
      (while t 
      (backward-up-list 1) 
      (when (looking-at "[[{]") 
       (setq indent-col (+ indent-col foo-indent-offset)))) 
     (error nil))) 
    (save-excursion 
     (back-to-indentation) 
     (when (and (looking-at "[]}]") (>= indent-col foo-indent-offset)) 
     (setq indent-col (- indent-col foo-indent-offset)))) 
    (indent-line-to indent-col))) 

abrir su archivo y hacer M-x foo-mode

+1

Gracias Scottfrazer. Funciona casi perfecto. Sin embargo, agrega cuatro espacios para una sola sangría y agrega una sola pestaña en lugar de ocho espacios para la doble sangría. Cuando el archivo estaba abierto en my collegues vi, la sangría ya no es bonita. ¿Puede decirme cómo hacer que agregue una pestaña por cada sangría? Si eso no es posible, 4 espacios por sangría también están bien. – canonv

+1

Parece un problema básico de configuración de sangría no relacionado con mi respuesta. Intenta poner '(setq-default indent-tabs-mode nil)' en su archivo .emacs si no quiere pestañas, o '(setq foo-indent-offset tab-width)' si quiere todas las pestañas. – scottfrazer