2010-10-23 13 views
18

Ho bisogno di essere in grado di impostare le impostazioni della scheda per i seguenti tipi di file:Come posso impostare le impostazioni della scheda Emacs per tipo di file?

  • .RB: 2 posti morbide
  • css, .html.erb: 4 schede di spazio

Ho provato quanto segue, ma nessuno di questi sembra alterare le mie impostazioni di tabulazione predefinite per ciascuno dei tipi di file.

;; js-mode-hook has also been tried 
(add-hook 'javascript-mode-hook 
     '(lambda() 
     (setq tab-width 4))) 

(add-hook 'css-mode-hook 
     '(lambda() 
     (setq tab-width 4))) 

(add-hook 'html-mode-hook 
     '(lambda() 
     (setq tab-width 8))) 

Sono abbastanza nuovo per emacs quindi la mia conoscenza della configurazione è piuttosto bassa.

+0

stavi chiedendo file .rb che sono file ruby. Ma i tuoi ami sono per javascript. Inoltre, cos'è ?erb? – VitoshKa

+0

Avrei dovuto accennare alle mie impostazioni correnti usando 2 schede distanziate per impostazione predefinita, che funziona per i file ruby. Per quanto riguarda i file .erb si tratta essenzialmente di file html con codice ruby ​​incorporato. Leggi http://en.wikipedia.org/wiki/ERuby#erb per maggiori informazioni. – chris

risposta

25

In emacs ogni modalità ha il proprio stile di indentazione. Il comando principale di indent (associato a TAB) è indent-for-tab-command. Questo comando chiama la funzione di indentazione specifica della modalità trovata nella variabile indent-line-function. Quindi ogni modo ha il suo modo di farlo.

per Ruby (per i miei emacs 2 è un difetto):

(setq ruby-indent-level 2) 

per i CSS (ancora una volta, di default è 4 per me):

(setq css-indent-offset 4) 

Purtroppo modalità SGML (su cui modalità HTML è basato) ha un meccanismo di indentazione molto semplice e apparentemente il livello non è configurabile. Vedere il codice sorgente della funzione sgml-calculate-indent.

Personalmente trovo strano. Non sto scrivendo HTML, ma puoi provare a modificare da solo la funzione sgml-calculate-indent :). Impara un po 'di chiarezza.

Sto utilizzando la modalità js2 e rientra perfettamente per impostazione predefinita. Per js devi cercare js-indent-level o qualcosa di simile.

Cheers.

+0

Con ciò ottengo le larghezze di tabulazione corrette, ma ottengo ancora le schede morbide. Ho provato (setq indent-tabs-mode t), ma questo non sembra fare nulla. – chris

+0

indent-tabs-mode è una variabile locale del buffer. Se vuoi abilitarlo globalmente usa (imposta-default 'indent-tabs-mode t). Questo funziona per me almeno per la modalità testo. Alcune altre modalità potrebbero non tenerne conto. Ad esempio, ruby ​​ha 'ruby-indent-tabs-mode' che risolverà il tuo problema con il ruby. In css non ho visto alcun effetto fino ad ora, e non riesco a trovare la variabile responsabile di ciò. Scusate. Apparentemente, il progettista di ciascuna modalità prende la sua decisione di fronte alle funzionalità delle schede. – VitoshKa

+0

Ho giocato con tutte le xxx-indent-tabs-mode a cui potevo pensare, ma sono ancora tutte morbide. – chris

7

C'è un certo numero di aspetti su come Emacs esegue l'indentazione. L'impostazione della larghezza della scheda specifica solo quanto è grande una scheda se viene inserita una scheda letterale. Se non si desidera utilizzare le schede letterali per l'indentazione, allora si dovrebbe prima disattivare il loro inserimento (from the manual ):

Emacs normalmente utilizza entrambe le linguette e spazi a rientrare le righe. Se preferisci, tutti i rientri possono essere creati solo dagli spazi . Per richiederlo, imposta indent-tabs-mode su zero. Questa è una variabile per buffer da , pertanto la modifica della variabile influisce solo sul buffer corrente, ma esiste un valore predefinito che è possibile modificare anche. È possibile modificare anche questo.

Tuttavia, per specificare i livelli di rientro, avrete anche bisogno di impostare la variabile c-basic-offset value così:

(add-hook 'html-mode-hook 
     '(lambda() 
     (setq c-basic-offset 4) 
     (setq indent-tabs-mode nil)) 

Nel tuo caso, si può solo bisogno il c-base-offset ma provate alcune combinazioni e vedere cosa funziona meglio.

+0

Ho usato il c-basic-offset che ho provato con e senza la modalità indent-tabs così come con/senza tab-width e nessuno di loro ha funzionato. Sto usando il kit di avvio emacs, quindi è possibile che qualche altro file .el stia sovrascrivendo le mie impostazioni in chris.el? – chris

+0

Dopo aver rimosso tutti gli altri file di configurazione tranne il mio file personalizzato con solo l'impostazione che hai sopra, ho ancora un rientro di 2 spazi sul tabbing. – chris

+0

Credo che la risposta di VitoshKa sia più rilevante in questo caso - quello che descrivo dovrebbe funzionare per qualsiasi modalità derivata in cc-mode (ad esempio java-mode, csharp-mode, ecc.). Scusa se è stato fuorviante - le mie scuse. – cristobalito

5

js-mode utilizza js-indent-level così messo (setq js-indent-level 4) nel vostro ~/.emacs (non avrebbe dovuto essere in un gancio, anche, ma se vi state chiedendo, è js-mode-hook, non javascript-Mode- gancio).

Se l'impostazione della larghezza della tabulazione non modifica il livello di indentazione per un determinato modo, è spesso più semplice aprire la sorgente per quella modalità. Ho trovato questa variabile facendo C-h f js-mode, facendo clic sul link "js.el", quindi cercando "indent", secondo colpo dall'alto.


Tuttavia, se si collabora molto con altre persone, è spesso preferibile inserire un cookie nella parte superiore del file. Io di solito fare // -*- tab-width: 8 -*- nel file, e poi ho cose come questa nel mio ~/.emacs:

(defvaralias 'c-basic-offset 'tab-width) 
(defvaralias 'cperl-indent-level 'tab-width) 
(defvaralias 'perl-indent-level 'tab-width) 
(defvaralias 'js-indent-level 'tab-width) 

modo che ho meno variabili da affrontare (e non c'è bisogno di ottenere gli avvertimenti circa il file -la variabile locale non è sicura o qualsiasi altra cosa se lo scrittore della modalità ha dimenticato di dichiararlo sicuro)

0

Se si utilizza css-mode.el di ELPA con emacs 23.1.1, è possibile parametrizzare l'impostazione globale per la larghezza della tabulazione per i CSS file per la larghezza della scheda attenendosi alla seguente procedura: 1) Tipo Mx personalizzabile, 2) Quindi digitare css-indent-level, 3) Quindi, dopo aver modificato la variabile a proprio piacimento, si fai "Salva per sessioni future".

0

Per HTML e Erb: se si utilizza web-mode (la modalità fornita da Spacemacs) può essere semplice come:

(setq-default web-mode-code-indent-offset 2 web-mode-markup-indent-offset 2)

dove markup-indent-offset si riferisce ai tag attuali e code-indent-offset si riferisce a incorporato Rubino in ERB, ecc.

Problemi correlati