2012-03-14 12 views
12

C'è un modo per contrassegnare il testo in emacs e spostarlo a sinistra (rimuovendo gli spazi iniziali) per spazio/granularità Tab?Diminuire il rientro su un paio di righe

Stesso modo che farei su qualche altro editor con Shift + Tab.

+0

io non sono sicuro di ottenere quello che vuoi dire. Potresti per favore elaborare la tua spiegazione? –

+0

Molte modalità emacs hanno il rientro automatico: quando si preme [tab] in qualsiasi punto della linea, si fa rientrare la riga dove dovrebbe essere. Raramente mi devo preoccupare di indentare manualmente qualsiasi cosa - ho solo lasciato che l'editore facesse il lavoro per me. –

+0

Vorrei poter fare il contrario di ciò che fa "Tab"; ho bisogno di solito quando copio il codice passato posizionato diversamente da un altro file. – sramij

risposta

3

In genere emacs posiziona le cose in base allo stile corrente quando si preme <TAB>, quindi naturalmente qui è un po 'diverso. La cosa più vicina che viene in mente è M-\ che fa crollare lo spazio bianco orizzontale attorno al punto. Se si desidera rimuovere un "rettangolo" di spazio prima delle linee, quindi delete-rectangle potrebbe essere più appropriato, che è possibile eseguire impostando il segno e il punto di spostamento per selezionare il rettangolo e quindi utilizzando C-x r d.

1

Sembra che il problema che stai cercando di risolvere sia un rientro non corretto del codice quando stai tagliando/incollando. Puoi risolverlo rindentando automaticamente il testo con qualcosa di simile al seguente.

Nota: Utilizzando un forze argomento prefisso non ri-indentazione (C-u C-y), più c'è la variabile soglia dimensionale.

;; automatically indenting yanked text if in programming-modes 
(defvar yank-indent-modes '(emacs-lisp-mode 
          c-mode c++-mode 
          tcl-mode sql-mode 
          perl-mode cperl-mode 
          java-mode jde-mode 
          lisp-interaction-mode 
          LaTeX-mode TeX-mode) 
    "Modes in which to indent regions that are yanked (or yank-popped)") 

(defvar yank-advised-indent-threshold 1000 
    "Threshold (# chars) over which indentation does not automatically occur.") 

(defun yank-advised-indent-function (beg end) 
    "Do indentation, as long as the region isn't too large." 
    (if (<= (- end beg) yank-advised-indent-threshold) 
     (indent-region beg end nil))) 

(defadvice yank (after yank-indent activate) 
    "If current mode is one of 'yank-indent-modes, indent yanked text (with prefix arg don't indent)." 
    (if (and (not (ad-get-arg 0)) 
      (member major-mode yank-indent-modes)) 
     (let ((transient-mark-mode nil)) 
     (yank-advised-indent-function (region-beginning) (region-end))))) 
+0

Sono sicuro che questo codice funzioni bene, ma [auto-indent-mode.el] (https://github.com/mlf176f2/auto-indent-mode.el/) è mantenuto attivamente e ha più funzionalità. Sebbene la soglia sia un'ottima idea. –

+0

@event_jr Non capisco il punto su qualcosa che viene mantenuto attivamente. Ho scritto il codice sopra più di 3 anni fa e non ho avuto bisogno di "mantenerlo", fa la cosa singola che dovrebbe fare abbastanza bene ... –

+0

Lo fa - e molte altre cose per assicurarsi che il codice viene rientrato automaticamente in modo corretto. Più funzionalità significano più ma più possibili interazioni negative con altre modalità. Quindi è importante che l'autore ci stia lavorando attivamente. –

14
  1. Selezionare la propria regione;
  2. Digitare C-u seguito dal numero di spazi che si desidera indentare (numero negativo se si desidera diminuire il rientro);
  3. Utilizzare C-x TAB (per impostazione predefinita associato a indent-rigidly) per applicare il rientro alla regione.

Questo è molto più complesso di quello S-TAB, ma è secondo me una sorta di ultima istanza nel caso in cui Emacs formattazione non risolve il problema.

MODIFICA: soluzione molto migliore: Shift a region or line in emacs (risposta accettata). Questo è quello che sto attualmente usando in Emacs per cambiare indentazione. ATTENZIONE: riguarda alcuni Emacs Lisp.

+0

Grazie. Cosa succede se voglio aumentare o diminuire il numero di schede (anziché spazi) in rientro di un paio di righe? – Tim

+0

Basta moltiplicare il valore dopo C-u con larghezza tab. –

+0

@Tim un modo migliore è descritto qui - http://stackoverflow.com/questions/3156450/shift-a-region-or-line-in-emacs (risposta accettata) –

2

Questo potrebbe essere più semplice e visivamente più intuitivo: prima assicurati che cua-mode sia abilitato (M-x cua-mode lo attiva). Quindi vai all'inizio della riga e premi C-return. Viene visualizzato un rettangolo rosso. Ora sposta il cursore verso il basso e verso destra per far crescere il rettangolo secondo necessità. Quindi premere C-d per eliminarlo. Questo è tutto.

Mi imbatto spesso in questo problema quando la modalità principale non determina alcuna indentazione automatica (o quando si incasina).

C'è molto di più si può fare con i rettangoli di cua-mode, vedere http://trey-jackson.blogspot.com/2008/10/emacs-tip-26-cua-mode-specifically.html

Problemi correlati