Imposta 4 rientri spaziali in Emacs in modalità testo


159

Non sono riuscito a far passare Emacs da 8 schede spazio a 4 schede spazio premendo i TABbuffer in 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 .emacsfile (o le variabili locali del mio buffer), il TABpulsante fa sempre la stessa cosa.

  1. Se non è presente alcun testo sopra, indentare 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 far rientrare Emacs almeno 4 nello spazio quando non c'è testo nella riga precedente?


Per una riga di modalità C ++ o csharp-mode ho aggiunto (setq tab-width 4) (setq c-basic-offset 4) alla fine di (defun csharp-mode () ...) e ha fatto il trucco per fare ( 1) le schede mostrano 4 anziché 8 caratteri e (2) quando premo tab ottengo 4 spazi su una nuova riga.
Jared Updike,

Molto tardi, ma mi sono appena reso conto che l'utilizzo (setq tab-width 4) non funziona, ma se si utilizza (setq-default tab-width 4) non è necessario fare altro.
Sambatyon,

Vedi la mia risposta se vuoi usare gli spazi ma vai alle tabulazioni.
Forkandwait

Nota ad altri che hanno trovato questa domanda: (setq-default tab-width 4)NON è la stessa cosa per (setq tab-width 4)essere sicuro di non aver perso il "-default"!
Zachaysan,

10
Non posso credere che sia così difficile da fare.
Gwg

Risposte:


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

o aggiungi la voce tab-stop-list alle variabili set-personalizzate nel file .emacs :

(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))))

9
Sono necessari sia la larghezza di tabulazione sia l'elenco di tabulazione. tab-width viene usato quando VISUALIZZA le schede, mentre è necessario l'elenco tab-stop per determinare le tabulazioni quando aggiungi le schede.
Michael Ratanapintha,


5
Non c'è davvero niente di più breve di '(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)))? Bene, finché funziona immagino ...: P
Ciao Arrivederci

5
Secondo la documentazione, non hai bisogno di tutte quelle posizioni. Fai semplicemente 4 8 12 e si estenderà a tutti gli altri (continua ad aggiungere 4). Apparentemente se usi solo 1 o 2 elementi invece di 3, userà solo la larghezza della scheda come ultimo passo. Quindi, in teoria, se volessi fare una tab di quattro spazi e la mia larghezza della tab era impostata su 4. Potrei scrivere '(tab-stop-list (quote (4))).
Nicholas Peterson,

1
@ NicholasPeterson grazie per averlo notato! Sembrerebbe però che in pratica quoteoccorrano due numeri per continuare la sequenza all'infinito. Vedi: stackoverflow.com/a/42148697/2662028
ryanpcmcquen

138

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:

Dal rientro controllato dal manuale Major Mode @ emacs :

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.


10
Ho lo stesso problema dell'OP, la tua soluzione non funziona per me.
Gauthier,

Per favore, approfondisci ulteriormente. Vuoi dire che usando le righe sopra come unico contenuto del tuo .emacs e chiamando "Mx indent-secondo-to-mode" non inserirai 4 spazi?
alcortes,

3
la tua confugurazione inserisce 8 spazi per me.
Vladimir Mihailenco,

4
Sto usando la versione 23.3.1 di emacs e la risposta breve non la cambia in spazi. questa risposta è fuorviante.
VNarasimhaM,

2
@BruceBarnett Sono in modalità testo e queste istruzioni continuano a non funzionare.
soleggiato

66

Aggiornamento: da Emacs 24.4:

tab-stop-listè ora implicitamente esteso all'infinito. Il suo valore predefinito viene modificato, il nilche significa che una tabulazione ferma ogni tab-widthcolonna.

il che significa che non è più necessario impostare tab-stop-listcome indicato di seguito, poiché è possibile mantenerlo impostato su nil.

La risposta originale segue ...


Mi fa sempre male vedere cose come (setq tab-stop-list 4 8 12 ................)quando la number-sequencefunzione è 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))

Questa è l'unica risposta che potrei riuscire a lavorare sul mio sistema.
Karpov,

emacs pagina Personalizza trattino dice elenco scheda "si estende implicitamente all'infinito attraverso la ripetizione del l'ultimo passo" - il che significa un elenco (4 8) dovrebbe essere abbastanza buono, senza esplicito numero di sequenza
James Waldby - jwpat7

@ JamesWaldby-jwpat7 In effetti, è successo nel 24.4 (2014). NEWS dice: " tab-stop-listora è implicitamente esteso all'infinito. Il suo valore predefinito è cambiato in zero, il che significa che una tabulazione ferma ogni tab-widthcolonna". - quindi in effetti puoi semplicemente usare il valore predefinito di nil.
phils,

21

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

M-x customize-group

Al Customize group:prompt inserire 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 .


Devo ricordare Mx custom-group - scorciatoia molto utile!
Nick Bolton,

11
(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)

10
(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 ha funzionato per me quando gli altri in questa pagina no.
Michael Terry,

Funziona in emacs26.3
Saurabh

9
(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


In ritardo alla festa, ma grazie. Non riesco a capire perché Emacs avrebbe bisogno di istruzioni specifiche per applicare le sue regole di rientro anche al codice C / C ++.
Guarderò

Voglio porre questa domanda da solo SOLO COSÌ POSSO ACCETTARE QUESTA RISPOSTA. Darei una taglia se potessi. Ero molto, molto turbato dal fatto che una modifica rendesse emacs riluttante a fare la linguetta a 4, stava esaminando tutte le soluzioni in questa pagina e mi hai risparmiato una quantità enorme di lavoro!
Ordinamento topologico

7

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 qualunque metodo sia impostato sulla 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 ridurre 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)


6

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.


4
Penso che l'OP voglia spazi invece di tab (quindi colpire Tab inserisce 4 spazi).
mipadi,

Insieme ad Aquamacs 2.4, questa risposta particolare mi dà caratteri in un'altra lingua anziché una scheda: 렔. Se il tasto Tab viene premuto più di una volta, il risultato è: 렔렔 (senza alcuna separazione). E lo stesso vale per ogni successiva tabulazione.
elenco delle leggi

6

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.


4

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


4

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!


Non soddisfa gli almeno 4 spazi porre nella domanda.
kmarsh

2

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 quoteper funzionare (ma non di più!) Sono necessari due numeri.

Inoltre, nella maggior parte delle modalità principali ( Pythonad esempio), il rientro è automatico in Emacs. Se è necessario rientrare al di fuori del rientro automatico, utilizzare:

M-i


2

Le personalizzazioni possono oscurare, (setq tab width 4)quindi usa setq-defaulto fai sapere a Personalizza cosa stai facendo. Ho anche avuto problemi simili al PO e l'ho risolto solo con questo, non ho avuto bisogno di aggiustamenti tab-stop-listo insertfunzioni:

(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)

1

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

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

0

Hai provato

(setq  tab-width  4)

2
Hanno questo nella loro domanda, quindi sì, è sicuro supporre che ci abbiano provato.
ryanpcmcquen,

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


0

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

Modificata questa risposta senza alcun hook:

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.