2012-01-20 11 views
5

Quando si scrive codice Scala in Emacs, ho notato il seguente problema rientro:Scala modalità di rientro in Emacs

List(1,2,3).foreach{ x => 

quindi premere Invio.

Poi chiudere la staffa, e questo è ciò che finisce accadendo:

List(1,2,3).foreach{ x => 
        } 

Anche se questo è un esempio particolare, la questione appare in una varietà di modi in cui l'auto-rientro in Emacs.

Una risposta a una di queste due domande sarebbe apprezzato:

  1. Come può questo problema essere fissato in modo che la coppia viene messo nel posto giusto e qualsiasi cosa all'interno delle parentesi graffe è rientrato un livello al destra?

  2. È possibile disabilitare questo tipo di indentazione automatica (ad esempio "set noautoindent" in vi). Ho provato soluzioni come quelle suggerite qui: Disable auto indent globally in Emacs senza successo.

Grazie in anticipo!

risposta

2

I ha provato per risolvere questo problema modificando il file scala-mode-indent.el. Rompe il rientro in alcune delle altre situazioni, ma almeno non avrete tutti quei trattini a metà schermo in avanti.

Commenta questa riga:

;; (scala-indentation-from-following) 

e modificare scala-indentazione-da-precedente:

(defun scala-indentation-from-preceding() 
    ;; Return suggested indentation based on the preceding part of the 
    ;; current expression. Return nil if indentation cannot be guessed. 
    (save-excursion 
    (scala-backward-spaces) 
    (and 
    (not (bobp)) 
    (if (eq (char-syntax (char-before)) ?\() 
     (scala-block-indentation) 
     (progn 
     (when (eq (char-before) ?\)) 
     (backward-sexp) 
     (scala-backward-spaces)) 
     t 
     ;;(scala-looking-at-backward scala-expr-start-re) 

    )) 
    (if (scala-looking-at-backward scala-expr-start-re) 
     (+ (current-indentation) scala-mode-indent:step) 
     (current-indentation) 
    )))) 

Come ho detto, rimane ancora rotto dopo che. Ho in programma di scrivere un supporto migliore a breve, forse tra una settimana o due.

EDIT:

Se si desidera disabilitare Scala indentazione completamente, commentare la riga in scala-mode.el

;; indent-line-function   'scala-indent-line 
+0

Grazie tanto Rogach! Per favore fatemi sapere se aggiungete altro supporto. – nequitans

+0

@nequitans - prego! Aggiungerò un'altra risposta a questa domanda, quando ho finito. – Rogach

4

ho codificato un semplice pezzo di codice - Rende emacs mantieni il rientro di livello per la maggior parte del tempo e indi due spazi a destra quando la riga precedente non vuota termina con "{", "(", ">", "=".

Aggiungi file besi.el al tuo percorso di carico

(provide 'besi) 

(defun besi-indent-line() 
    "Indent current line" 
    (interactive) 
    (scala-indent-line-to (besi-indent))) 

(defun besi-indent() 
    (save-excursion 
    (forward-comment -100000) 
    (backward-char 1) 
    (if (or (looking-at "{") (looking-at "=") (looking-at ">") (looking-at "(")) 
     (+ (current-indentation) 2) 
     (current-indentation)))) 

(defun besi-newline() 
    (interactive) 
    (newline-and-indent)) 

Riga di modifica in scala-mode.el

indent-line-function   'besi-indent-line 

e la linea in scala-mode-ui.el

("\r"      'besi-newline) 

aggiungere anche una linea (require 'besi) l'inizio della scala-mode.el .

caricato su GitHub per una facile consultazione - besi

+0

Se avete suggerimenti/commenti, fatemelo sapere! – Rogach