it-swarm.it

Imposta 4 rientri spaziali in Emacs in modalità testo

Non sono riuscito a far passare Emacs da 8 schede spazio a 4 schede spazio premendo il tasto 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 variabili locali del mio buffer) il file TAB il pulsante fa sempre la stessa cosa.

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

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

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

oppure aggiungi tab-stop-list voce in custom-set-variabili 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))))
28
Bert F

Risposta breve:

Il punto chiave è dire a emacs di inserire tutto ciò che vuoi durante il rientro, questo è fatto cambiando la funzione di rientro. È più facile cambiarlo per inserire una scheda e quindi cambiare le schede in 4 spazi piuttosto che cambiarlo 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 rientro controllato da Major Mode @ emacs manual :

Una funzione importante di ciascuna modalità principale è quella di personalizzare la chiave per rientrare correttamente nella lingua che si sta modificando.

[...]

La variabile funzione indent-line è la funzione utilizzata da (e vari comandi, come quando si chiama indent-region) per indentare la riga corrente. Il comando indent-secondo-to-mode non fa altro che chiamare questa funzione.

[...]

Il valore predefinito è indent-relative per molte modalità.

Dal manuale di indent-relative @ emacs:

Spazio relativo al rientro fino al punto di rientro successivo nella riga precedente non vuota.

[...]

Se la precedente riga non vuota non ha punti di rientro oltre il punto di colonna inizia da "tab-to-tab-stop", invece.

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

133
alcortes

Aggiornamento: Da Emacs 24.4:

tab-stop-list è ora implicitamente esteso all'infinito. Il suo valore predefinito è cambiato in nil che significa un tab stop ogni tab-width colonne.

ciò significa che non è più necessario impostare tab-stop-list nel modo mostrato di seguito, poiché puoi tenerlo impostato su nil.

La risposta originale segue ...


Mi fa sempre male vedere cose come (setq tab-stop-list 4 8 12 ................) quando il number-sequence La funzione è seduta 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))
64
phils

Potresti trovare più facile impostare le tue schede come segue:

M-x customize-group

Al Customize group: Richiedi immettere 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, ti consigliamo di impostare un file di personalizzazioni .

21
Dave Webb
(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)
11
Yan Li
(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 per il codice C++ e anche il commento all'interno

9
user2318996
(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)
9
lawlist

Questo problema non è causato da interruzioni di tabulazione mancanti; è che emacs ha un metodo di tab (nuovo?) chiamato indent-relative che sembra progettato per allineare i dati tabulari. Il tasto TAB è associato al metodo indent-for-tab-command, che chiama il 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 funzione indent-line (hook in modalità testo non funziona, quindi forse viene ripristinato dopo l'esecuzione degli hook in modalità?) Ma un modo semplice per sbarazzarsi di questo il comportamento consiste nel bloccare il metodo intent-for-tab-command impostando TAB sul metodo tab-to-tab-stop più semplice:

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

7
Glenn

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.

6
cjm

Puoi aggiungere queste righe di codice al tuo file .emacs. Aggiunge un hook per la modalità testo per usare 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.

6
gigilibala

Aggiungi questo al tuo file .emacs:

Questo imposterà la larghezza in cui una scheda viene visualizzata su 2 caratteri (cambia il numero 2 come preferisci)

(setq default-tab-width 2)

Per assicurarti che emacs stia effettivamente usando le tab invece degli spazi:

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

Per inciso, il valore predefinito per emacs quando si esegue il backspacing su una scheda è convertirlo in spazi e quindi eliminare uno spazio. Questo può essere fastidioso. Se vuoi che elimini solo la scheda, puoi farlo:

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

Godere!

4
qwerty9967

Basta cambiare lo stile con lo stile c-set per me è stato abbastanza.

4
dividebyzero

Le personalizzazioni possono ombreggiare (setq tab width 4) quindi usa setq-default o fai sapere a Personalizza cosa stai facendo. Ho anche avuto problemi simili al PO e l'ho risolto solo con questo, non avevo bisogno di aggiustare tab-stop-list o qualsiasi funzione insert:

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

È stato utile aggiungere questo subito dopo (un suggerimento di emacsWiki):

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

Le migliori risposte non hanno funzionato fino a quando non ho scritto questo nel file .emacs:

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

Questa è l'unica soluzione che impedisce a una scheda di essere mai inserita per me, senza una sequenza o 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))
)

Nota 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 è necessario rientrare al di fuori del rientro automatico, utilizzare:

M-i

1
ryanpcmcquen

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

 
 (aggiungi hook 'sql-mode-hook 
 (lambda () 
 (progn 
 (setq-default tab-width 4) 
 (setq indent-tabs-mode nil) 
 (setq indent-line-function 'tab-to-tab-stop) 
 (modifica-sintassi-entry? _ "w "); ora '_' non è considerato un delimitatore di parole 
 (modifica-sintassi-entry? -" w "); ora '-' non è considerato un delimitatore di parole 
)) ) 
0
forkandwait

Hai provato

(setq  tab-width  4)
0
GrokCode

A proposito, per C-mode , aggiungo (setq-default c-basic-offset 4) a .emacs. Vedi http://www.emacswiki.org/emacs/IndentingC per i dettagli.

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