2013-11-28 14 views
5

Come tutti sanno, siamo in grado di buffer corrente :source da :so %.Vim: come: sorgente di una parte del buffer

Ma a volte voglio :source solo una parte del buffer, non l'intero buffer. Dite, ho appena aggiunto qualcosa al mio .vimrc, e voglio provenire da quella parte, ma non voglio ri-sorgente tutto il resto.

Ho provato a selezionare il testo e :so (in realtà :'<,'>so), ma ha riportato che l'intervallo non è consentito. Quindi, come si potrebbe fare?

Ovviamente è possibile salvare la parte necessaria nel file temp e trovarla, ma è chiaramente fastidiosa.

risposta

2

Grazie a Ingo Karkat, ho preso la sua idea principale e migliorato. Quello che volevo per migliorare:

  • Dobbiamo usare il comando specificato dall'utente ulteriore :Execute invece dello standard :so (ok, possiamo citare il comando specificato dall'utente :So, comunque è fastidioso per utilizzare la nuova versione in maiuscolo del comando)
  • C'è un piccolo effetto collaterale: il registro @z è danneggiato dopo l'esecuzione del comando.

Con il mio script di seguito, possiamo usare :so {file} comando come prima, e siamo anche in grado di usarlo con la gamma: :'<,'>so (che si espande in realtà per :'<,'>Source)


Qui:

" This script provides :Source command, a drop-in replacement for 
" built-in :source command, but this one also can take range and execute just 
" a part of the buffer. 
" 


" Sources given range of the buffer 
function! <SID>SourcePart(line1, line2) 
    let tmp = @z 
    silent exec a:line1.",".a:line2."yank z" 
    let @z = substitute(@z, '\n\s*\\', '', 'g') 
    @z 
    let @z = tmp 
endfunction 



" if some argument is given, this command calls built-in command :source with 
" given arguments; otherwise calls function <SID>SourcePart() which sources 
" visually selected lines of the buffer. 
command! -nargs=? -bar -range Source if empty("<args>") | call <SID>SourcePart(<line1>, <line2>) | else | exec "so <args>" | endif 



" in order to achieve _real_ drop-in replacement, I like to abbreviate 
" existing :so[urce] command to the new one. 
" 
" So, we can call :so % just as before, and we are also call '<,'>so 

cnoreabbr so  Source 
cnoreabbr sou Source 
cnoreabbr sour Source 
cnoreabbr sourc Source 
cnoreabbr source Source 
+1

Devi stare attento quando usi 'cnoreabbr'. Si espandono in luoghi imprevisti, ad es. ricerca. Vedi questo post per ulteriori http://stackoverflow.com/questions/7513380/vim-change-x-function-to-delete-buffer-instead-of-save-quit –

+0

@PeterRincker, grazie per la nota, esaminerà . –

3

È possibile definire il seguente comando, che opera sulla linea di corrente o un intervallo passato:

":[range]Execute Execute text lines as ex commands. 
"   Handles |line-continuation|. 
command! -bar -range Execute silent <line1>,<line2>yank z | let @z = substitute(@z, '\n\s*\\', '', 'g') | @z 
+0

Grazie mille, ho preso la tua idea principale e l'ho migliorata, vedi la mia risposta se sei interessato. –

1

le seguenti opere, se è stata selezionata una sola riga:

yq:p<enter> 

Ciò funzionerà anche:

y:<control-r>"<enter> 
4

perché non hanno i seguenti mappature per l'approvvigionamento di un file (o un intervallo):

" source the current file 
nmap <leader>vs :source %<CR> 
" source a visual range 
vmap <leader>vs y:@"<CR> 

Ora, è possibile premere ,vs (se il vostro mapleader è ,), e l'intervallo selezionato verrà fornito o in altro modo, in modalità normale, verrà generato il file corrente.