Imposta 4 rientri spaziali in Emacs in modalità testo
-
09-06-2019 - |
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.
- Se non c'è testo sopra, trattino 8 spazi
- 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?
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 innil
il che significa una tabulazione ognitab-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
(defun my-custom-settings-fn ()
(setq indent-tabs-mode t)
(setq tab-stop-list (number-sequence 2 200 2))
(setq tab-width 2)
(setq indent-line-function 'insert-tab))
(add-hook 'text-mode-hook 'my-custom-settings-fn)
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 )))