Domanda

Non sono riuscito a far passare Emacs da 8 schede spaziali a 4 schede spaziali quando si preme il pulsante TAB nei buffer con la modalità principale text-mode.Ho aggiunto quanto segue al mio .emacs:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

;;; And I have tried
(setq indent-tabs-mode nil)
(setq tab-width 4)

Non importa come cambio il mio .emacs file (o le variabili locali del mio buffer) il file TAB il pulsante fa sempre la stessa cosa.

  1. Se non c'è testo sopra, trattino 8 spazi
  2. Se nella riga precedente è presente del testo, rientra all'inizio della seconda parola

Per quanto ami Emacs, questo sta diventando fastidioso.C'è un modo per fare in modo che Emacs rientri almeno di 4 spazi quando non c'è testo nella riga precedente?

È stato utile?

Soluzione

(customize-variable (quote tab-stop-list))

o aggiungi elenco-tab-stop ingresso a variabili impostate su misura In .emacs file:

(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))))

Altri suggerimenti

Risposta breve:

Il punto chiave è dire a emacs di inserire quello che vuoi durante l'indentazione, questo viene fatto modificando la funzione indent-line.È più semplice modificarlo per inserire una scheda e quindi modificare le schede in 4 spazi piuttosto che modificarlo per inserire 4 spazi.La seguente configurazione risolverà il tuo problema:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)

Spiegazione:

Da Indentazione controllata da Major Mode @ manuale emacs:

Una funzione importante di ciascuna modalità principale è quella di personalizzare la chiave per rientrare correttamente per la modifica del linguaggio.

[...]

La variabile di funzionalità della linea di rientro è la funzione da utilizzare da (e vari comandi, come quando si chiama la regione indent) per rientrare nella riga corrente.Il comando indent-accord-to-mode non fa altro che chiamare questa funzione.

[...]

Il valore predefinito è relativo al rientro per molte modalità.

Dal manuale indent-relative @ emacs:

Spazio relativo al rientro fino al prossimo punto di rientro nella precedente linea non bianca.

[...]

Se la linea non bianca precedente non ha punti rientranti oltre il punto di colonna, viene invece eseguito "Tab-tob-stop".

Basta cambiare il valore della funzione indent-line nella funzione insert-tab e configurare l'inserimento della tabulazione come 4 spazi.

Aggiornamento: Da Emacs 24.4:

tab-stop-list è ora implicitamente esteso all’infinito.Il suo valore predefinito viene modificato in nil il che significa una tabulazione ogni tab-width colonne.

il che significa che non è più necessaria alcuna impostazione tab-stop-list nel modo mostrato di seguito, poiché puoi mantenerlo impostato su nil.

Segue la risposta originale...


Mi addolora sempre un po' vedere cose del genere (setq tab-stop-list 4 8 12 ................) quando il number-sequence la funzione è lì in attesa di essere utilizzata.

(setq tab-stop-list (number-sequence 4 200 4))

O

(defun my-generate-tab-stops (&optional width max)
  "Return a sequence suitable for `tab-stop-list'."
  (let* ((max-column (or max 200))
         (tab-width (or width tab-width))
         (count (/ max-column tab-width)))
    (number-sequence tab-width (* tab-width count) tab-width)))

(setq tab-width 4)
(setq tab-stop-list (my-generate-tab-stops))

Potrebbe risultare più semplice impostare le schede nel modo seguente:

M-x customize-group

Al Customize group: inserire rapidamente indent.

Vedrai una schermata in cui puoi impostare tutte le opzioni di rientro e impostarle per la sessione corrente o salvarle per tutte le sessioni future.

Se lo fai in questo modo, lo vorrai impostare un file di personalizzazioni.

(setq tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80))
(setq indent-tabs-mode nil)
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
(setq c-default-style "linux") 
(setq c-basic-offset 4) 
(c-set-offset 'comment-intro 0)

questo funziona anche per il codice C++ e il commento all'interno

Questo problema non è causato dalla mancanza di tabulazioni;è che emacs ha un (nuovo?) metodo tab chiamato indent-relative che sembra progettato per allineare i dati tabulari.Il tasto TAB è mappato al metodo indent-for-tab-command, che chiama qualunque metodo su cui è impostata la variabile indent-line-function, che è il metodo relativo al rientro per la modalità testo.Non ho trovato un buon modo per sovrascrivere la variabile della funzione indent-line (l'hook della modalità testo non funziona, quindi forse viene ripristinato dopo l'esecuzione degli hook della modalità?), ma un modo semplice per sbarazzarsi di questo il comportamento è semplicemente eliminare il metodo di comando intento per tabulazione impostando TAB sul metodo più semplice da tabulazione a tabulazione:

(define-key text-mode-map (kbd "TAB") 'tab-to-tab-stop)

Prova questo:

(add-hook 'text-mode-hook
  (function
   (lambda ()
     (setq tab-width 4)
     (define-key text-mode-map "\C-i" 'self-insert-command)
     )))

Ciò farà sì che TAB inserisca sempre un carattere TAB letterale con tabulazioni ogni 4 caratteri (ma solo in modalità Testo).Se non è quello che stai chiedendo, descrivi il comportamento che vorresti vedere.

Puoi aggiungere queste righe di codice al tuo file .emacs.Aggiunge un hook per la modalità testo per utilizzare insert-tab invece di indent-relative.

(custom-set-variables
 '(indent-line-function 'insert-tab)
 '(indent-tabs-mode t)
 '(tab-width 4))
(add-hook 'text-mode-hook
      (lambda() (setq indent-line-function 'insert-tab)))

Spero possa essere d'aiuto.

Per me è stato sufficiente cambiare lo stile con C-Set-Style.

Aggiungi questo al tuo file .emacs:

Ciò imposterà la larghezza di visualizzazione di una scheda su 2 caratteri (cambia il numero 2 in quello che desideri)

(setq default-tab-width 2)

Per assicurarti che emacs utilizzi effettivamente le tabulazioni anziché gli spazi:

(global-set-key (kbd "TAB") 'self-insert-command)

Per inciso, l'impostazione predefinita per emacs quando si esegue il backspace su una scheda è convertirla in spazi e quindi eliminare uno spazio.Questo può essere fastidioso.Se vuoi che elimini semplicemente la scheda, puoi farlo:

(setq c-backspace-function 'backward-delete-char)

Godere!

Le personalizzazioni possono oscurare (setq tab width 4) quindi utilizzare entrambi setq-default o fai sapere a Personalizza cosa stai facendo.Ho avuto anche problemi simili all'OP e l'ho risolto da solo, senza bisogno di aggiustamenti tab-stop-list o qualsiasi insert funzioni:

(custom-set-variables
 '(tab-width 4 't)
 )

Ho trovato utile aggiungerlo subito dopo (un suggerimento da emacsWiki):

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

Le migliori risposte non hanno funzionato finché non ho scritto questo nel file .emacs:

(global-set-key (kbd "TAB") 'self-insert-command)

Questa è l'unica soluzione che mi impedisce di inserire una scheda, senza una sequenza o una conversione di schede in spazi.Entrambi sembravano adeguati, ma dispendiosi:

(setq-default
    indent-tabs-mode nil
    tab-width 4
    tab-stop-list (quote (4 8))
)

Notare che quote ha bisogno di due numeri per funzionare (ma non di più!).

Inoltre, nella maggior parte delle modalità principali (Python per esempio), il rientro è automatico in Emacs.Se devi rientrare al di fuori del rientro automatico, usa:

M-io

Hai provato

(setq  tab-width  4)
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)

A proposito, per Modalità C, Aggiungo (setq-default c-basic-offset 4) a .emacs.Vedere http://www.emacswiki.org/emacs/IndentingC per dettagli.

Dal mio file init, diverso perché volevo spazi invece di tabulazioni:

(add-hook 'sql-mode-hook
          (lambda ()
             (progn
               (setq-default tab-width 4)
               (setq indent-tabs-mode nil)
               (setq indent-line-function 'tab-to-tab-stop) 
               (modify-syntax-entry ?_ "w")       ; now '_' is not considered a word-delimiter
               (modify-syntax-entry ?- "w")       ; now '-' is not considered a word-delimiter 
               )))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top