2009-09-20 9 views
6

Ultimamente sto cercando di entrare in emacs e una delle cose che devo correggere è la rientranza.Come si emula il "softtabstop" di Vim in Emacs?

Esempio 1:

sub foo { 
    my $bar = 'quux'; 
    | 

Esempio 2:

sub foo { 
    my $bar = 'quux';  |# foo 

immaginare che il carattere pipe negli esempi sopra indica la posizione del cursore. Ora, io uso (4) spazi per ogni livello di rientro (senza tabulazioni), e ho l'installazione di emacs per indentare il mio codice automaticamente con questo in mente. Nessun problema lì. Ma negli esempi sopra, se dovessi colpire backspace nelle posizioni indicate del cursore, voglio che emacs torni indietro fino al prossimo livello di rientro (colonna/4). Cioè, voglio che tratti gli spazi bianchi precedenti come se fosse costituito da schede. Invece, cancella sempre un singolo spazio.

In vim, accendo 'expandtab' per fare in modo che inserisca spazi anziché tabulazioni e 'softtabstop', che lo renda (tra le altre cose) backspace al successivo "soft tabstop" come descritto sopra.

in Emacs, Suppongo che avrei potuto (se sapevo emacs/elisp meglio) backspace si legano ad una funzione che fa qualcosa di simile al seguente:

if indent-tabs-mode is nil 
    if the cursor position is preceded by whitespace 
     calculate the position of the previous "soft tabstop" 
     if there's enough whitespace 
      backspace all the way to that point 
     else 
      backspace by one character 

Quello che voglio sapere è, c'è un semplice modo per fare questo, e/o qualcuno sa di una soluzione esistente?

+0

Questo è complicato dal fatto che sembra che si scrive in Perl, e cperl-mode (la modalità migliore Perl per Emacs) si lega già backspace per 'cperl ELETTRICO-backspace'. (Anche se quella funzione non fa nulla di critico, quindi si può cavarsela senza il comportamento che fornisce.) – cjm

+0

Un piccolo aggiornamento: ho sbagliato una cosa. Quando vim non può tornare al prossimo soft tab stop, elimina quanto più spazio bianco possibile (cioè da 1 a 3), non solo 1. – Hinrik

+0

Soluzione aggiornata per eliminare quanti più spazi possibili (fino al punto di tabulazione) –

risposta

7

Questo funziona per me, dove 'tab-width viene utilizzato come larghezza delle colonne. Impostare la chiave nelle mappature appropriate ...

(local-set-key (kbd "DEL") 'backward-delete-whitespace-to-column) 
(defun backward-delete-whitespace-to-column() 
    "delete back to the previous column of whitespace, or as much whitespace as possible, 
or just one char if that's not possible" 
    (interactive) 
    (if indent-tabs-mode 
     (call-interactively 'backward-delete-char-untabify) 
    (let ((movement (% (current-column) tab-width)) 
      (p (point))) 
     (when (= movement 0) (setq movement tab-width)) 
     (save-match-data 
     (if (string-match "\\w*\\(\\s-+\\)$" (buffer-substring-no-properties (- p movement) p)) 
      (backward-delete-char-untabify (- (match-end 1) (match-beginning 1))) 
     (call-interactively 'backward-delete-char-untabify)))))) 
+0

Vedi: https://www.emacswiki.org/emacs/BackspaceWhitespaceToTabStop (ha una versione * enhanced *). – ideasman42

+0

Bello, ma trovato 'backward-delete-char-untabify' piuttosto fastidioso, alcuni utenti potrebbero voler sostituirlo con' backward-delete-char'. – ideasman42

Problemi correlati