2009-12-23 6 views
7

Je veux utiliser vim pour écrire une partie de mon fichier dans un autre fichier. Par exemple, je le fichier suivant:In vim, comment écrire une ligne partielle dans un fichier?

This is line 1

and this is the next line

Je veux que mon fichier de sortie à lire:

line 1

and this is

Je sais comment utiliser vi pour écrire une série de lignes dans un fichier:

:20,22 w partial.txt

Une alternative est de choisir visuellement le texte souhaité et puis écrire:

:'<'> w partial.txt

Cependant, lors de l'utilisation de cette méthode, vim insiste pour écrire la ligne complète dans la sortie, et je n'ai trouvé aucun moyen d'écrire une ligne partielle. Des pensées?

Répondre

5

J'ai deux approches (très similaires) à cela. Il n'y a aucun moyen de le faire avec la commande d'écriture intégrée, mais il est assez facile de générer votre propre fonction qui devrait faire ce que vous voulez (et vous pouvez l'appeler comme vous voulez - même W si vous voulez).

Une approche très simple qui ne va gérer une seule ligne est d'avoir une fonction comme ceci:

command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call WriteLinePart(<f-args>) 

function! WriteLinePart(filename) range 
    " Get the start and end of the ranges 
    let RangeStart = getpos("'<") 
    let RangeEnd = getpos("'>") 

    " Result is [bufnum, lnum, col, off] 

    " Check both the start and end are on the same line 
    if RangeStart[1] == RangeEnd[1] 
     " Get the whole line 
     let WholeLine = getline(RangeStart[1]) 

     " Extract the relevant part and put it in a list 
     let PartLine = [WholeLine[RangeStart[2]-1:RangeEnd[2]-1]] 

     " Write to the requested file 
     call writefile(PartLine, a:filename) 
    endif 
endfunction 

Ceci est appelé avec :'<,'>WriteLinePart test.txt.

Si vous souhaitez prendre en charge plusieurs plages de lignes, vous pouvez étendre ce champ pour inclure des conditions variables, ou vous pouvez pincer le code de ma réponse à this question. Débarrassez-vous de la substitution des barres obliques inverses et vous pourriez avoir une fonction très simple qui fait quelque chose comme (non testé ...):

command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call writelines([GetVisualRange()], a:filename) 
+0

Excellent, cela fait exactement ce dont j'ai besoin. Je n'avais besoin que d'une seule gamme, mais il est bon de connaître la solution multi-gamme si j'en ai besoin à l'avenir. Merci, et Joyeux Noël (ou Super Solstice, si Noël n'est pas votre truc)! – Magnus

Questions connexes