2012-07-03 7 views
6

¿Cómo hacer que Emacs reine automáticamente el código de Ruby sobre la marcha?indent código de rubí sobre la marcha en emacs

por ejemplo, con esto en Emacs,

def hello 
    puts "hello" 
    en 

después de escribir 'd', quiero que se convierta en esto,

def hello 
    puts "hello" 
end 

Esto es lo habitual en Vim, pero ¿cómo ¿Puedo lograr eso en Emacs?

Respuesta

3

ruby-electric es noticia vieja. Emacs 24 tiene un modo secundario incorporado llamado electric-indent-mode que inserta automáticamente líneas nuevas después de algunos caracteres y, por supuesto, puede reasignar la clave RETURN al newline-and-indent (se asigna solo a la sangría de manera predeterminada). En Emacs 24 puede obtener delims coincidentes con electric-pairs-mode y el modo ruby-end insertará automáticamente end cuando sea necesario. Puede echar un vistazo a prelude-ruby.el para más detalles.

+0

'electric-indent-mode' es bueno, ahora enlace' RET' con 'comment-indent-new-line'. Gracias. – fangwen

2

Si agrega ruby-electric (también parte de Rinari) se obtiene el siguiente:

  • correctamente "fin" sangría cuando se escribe "clase", "def", "módulo", etc.
  • Matching delimitadores cuando escribe el de apertura.

Si no desea agregar modos extra, el end se indentarán correctamente una vez que presiona Enter . O presione Pestaña para volver a aplicar sangría a la línea actual.

+0

Gracias por sus consejos, pero ¿es posible escribir una función elisp para que haga la sangría al vuelo? – fangwen

+0

¿Cómo es que esta respuesta no está sobre la marcha? ¿Lo intentaste? –

0

Probar Auto-indent-mode!

  1. Volver sangra automáticamente el código de forma apropiada (si está activado)
  2. pegar/Yanking sangra la forma apropiada
  3. línea de matanza va a despegar espacios que no sean necesarios (si está activado)
  4. El archivo de visita, guión adecuadamente, pero NO GUARDAR. (Simule que no pasó nada, si está habilitado)
  5. Al guardar, opcionalmente, desmarque, elimine los espacios en blanco finales y, definitivamente, aplique sangría al archivo (si está habilitado).
0

No funcionará porque Ruby no sabe si desea escribir "fin" de cualquier variable que comience con "fin". Así que escribir Tab para volver a sangrar es necesario. Y la siguiente configuración funciona bien para mí.

; auto indent                                                  
(define-key global-map (kbd "RET") 'newline-and-indent) 
(add-hook 'ruby-mode-hook (lambda() (local-set-key "\r" 'newline-and-indent))) 
Cuestiones relacionadas