2013-04-23 14 views
6

ho questo nel mio .vimrc per rimuovere spazio bianco in coda:VIM: Range Line opzionale per comando/funzione

function! RemoveTrailingWhitespace() 
    for lineno in range(a:firstline, a:lastline) 
    let line = getline(lineno) 
    let cleanLine = substitute(line, '\(\s\| \)\+$', '', 'e') 
    call setline(lineno, cleanLine) 
    endfor 
endfunction 
command -range RemoveTrailingWhitespace <line1>,<line2>call RemoveTrailingWhitespace() 
command -range RT      <line1>,<line2>call RemoveTrailingWhitespace() 

Questo mi permette di chiamare :'<,'>RT per rimuovere spazio bianco in coda per una gamma selezionata di linee visivamente. Quando ho appena chiamato :RT, tuttavia, funziona solo sulla linea corrente. Quello che voglio però è applicare il comando all'intero buffer. Come può essere realizzato?

+0

proposito: Ci sono diversi plugin che lo fanno (e molto più, come attivazione automatica ed evidenziazione di spazio vuoto iniziale). Uno di questi è il mio [DeleteTrailingWhitespace plugin] (http://www.vim.org/scripts/script.php?script_id=3967); la sua pagina ha collegamenti a alternative. –

risposta

11

se non si specifica range, il comando con range verrà applicato sulla riga corrente. Se si vuole farlo su intero buffer, utilizzare :%RT o :1,$RT

cosa si potrebbe fare per rendere tutto il buffer come range di default è:

command -range=% RT <line1>,<line2>call RemoveTrailingWhitespace() 

dettaglio:

:h command-range 

poi si vede :

Possible attributes are: 

-range  Range allowed, default is current line 
-range=% Range allowed, default is whole file (1,$) 
-range=N A count (default N) which is specified in the line 
     number position (like |:split|); allows for zero line 
     number. 
-count=N A count (default N) which is specified either in the line 
     number position, or as an initial argument (like |:Next|). 
     Specifying -count (without a default) acts like -count=0 

un commento/domanda alla funzione

se si dispone di informazioni sull'intervallo, perché non chiamare semplicemente vim-build nel comando :[range]s per eseguire la sostituzione? quindi potresti salvare quelle linee getline, setline, anche il loop.

+0

Sembra impostare la posizione del cursore alla fine del file dopo aver eseguito ': RT' senza intervallo. Conosci un modo per aggirare questo? Ho provato 'getpos' /' setpos' e 'winsaveview' /' winrestview', ma nessuno di loro sembrava funzionare. Grazie ancora! –

+0

Non importa, ho seguito il tuo commento e ho riscritto tutto per usare il comando ': s'. Ottimo suggerimento! –

+0

@padde come hai chiamato getpos/setpos? prova 'let x = getpos (". ") [i tuoi elementi logici] quindi chiama setpos (". ", x)' – Kent

1

Alla fine sono andato con questa soluzione molto più semplice, che mantiene anche la posizione del cursore:

command -range=% RemoveTrailingWhitespace <line1>,<line2>s/\(\s\| \)\+$// | norm! `` 
command -range=% RT      <line1>,<line2>RemoveTrailingWhitespace 

Grazie per i suggerimenti @Kent!