web-dev-qa-db-fra.com

Ouvrez un fichier donné par le résultat d'une commande dans Vim

Je me trouve faire ce qui suit presque tous les jours

  1. Courir une trouvaille (find -name somefile.txt)
  2. Ouvrez le résultat dans vim

Le problème est que je dois copier et coller le résultat de la commande find dans la commande vim. Y a-t-il un moyen d'éviter de devoir faire cela? J'ai expérimenté un peu (find -name somefile.txt | vim) Mais n'avez rien trouvé qui fonctionne.

Merci d'avance

38
smauel

Vous pouvez utiliser la substitution de commande:

vim $(find -name somefile.txt)

ou

find -name somefile.txt -exec vim {} \;
33
dogbane

Essaye ça:

  1. démarrer vim
  2. dans Vim, utilisez ce qui suit:

:r!find /<path> -name 'expression'

Les résultats doivent apparaître dans VIM lorsque la recherche est terminée.

Ou

Essayer:

find /<path> -name > results.txt
vim results.txt 
7
Karl

Si cela ne vous dérange pas d'exécuter la commande à nouveau: appuyez sur Up et appendez une commande xargs. Ou utiliser l'historique de substitution et exécution

!! | xargs vim          # won't work with file names containing \'" or whitespace
!! | xargs -d \\n vim   # GNU only (Linux, Cygwin)

Il y a une manière légère de sauvegarder la sortie d'une commande qui fonctionne dans KSH et ZSH mais pas en bash (elle nécessite le côté de la sortie d'un pipeline à exécuter dans la coque mère). Tuyer la commande dans la fonction K (Définition zsh ci-dessous), qui k Eeps sa sortie dans la variable $K.

function K {
    K=("${(@f)$(tee /dev/fd/3)}") 3>&1;
}
find … |K
vim $K

Enregistrer automatiquement la sortie de chaque commande n'est pas vraiment possible avec la coque seule, vous devez exécuter la commande dans un terminal émulé. Vous pouvez le faire en courant à l'intérieur script (un utilitaire BSD, mais disponible sur la plupart des unes, y compris Linux et Solaris), qui enregistre toute la sortie de votre session via un fichier (il y a encore un Un peu d'effort nécessaire pour détecter de manière fiable la dernière invite dans le type dossier).

J'ai dû manquer le point ici, parce que j'utiliserais:

:find **/somefile.txt

(Si je savais qu'il n'y avait qu'un seul dans mon :echo &path) ou, si je les voulais tous:

:args **/somefile.txt

EDIT: whoa! OK, alors je DID Miss the Point - Vous voulez la liste de recherche, pas les fichiers actuels ouverts? Essayez (à nouveau, de Vim):

!!find . -name somefile.txt

-- ma faute :)

2
Barry Arthur

J'aime utiliser les tiques de retour `(c'est sur la même clé que le ~)

> vim `find . -name somefile.txt`

Les back ticks exécutent la commande à l'intérieur des tiques et la sortie peut ensuite être utilisée par la commande. Ce qui précède trouvera tous les fichiers quelquefile.txt vous permettra ainsi d'utiliser :next Pour passer à travers tous les fichiers.

C'est très utile si vous dépensez quelques essais affinant la commande, car vous pouvez ensuite utiliser la substitution d'historique pour répéter la commande de l'éditeur.

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`
2
Martin York

Comme @davidmh a pointé dans les commentaires, vous pouvez utiliser xargs avec le drapeau -o Si vous souhaitez utiliser une application interactive.

find . -name somefile.txt | xargs -o vim

Si vous n'utilisez pas -o, vous allez probablement gâcher l'état du terminal après avoir quitté Vim. Si vous l'avez fait, vous devriez être capable de réinitialiser votre terminal avec la commande suivante:

reset
1
durum

J'ai écrit une fonction pvim qui fait ce que vous voulez. Si plusieurs lignes sont canalisées sur pvim il ignore tout sauf le premier, il pourrait être étendu à ouvrir plusieurs fichiers dans Vim.

stu@sente ~ $ function pvim() { read -r somefile; exec < /dev/fd/1; vim "$somefile"; }
stu@sente ~ $ type pvim
pvim is a function
pvim ()
{
    read -r somefile;
    exec < /dev/fd/1;
    vi "$somefile"
}

Utilisez-le comme:

stu@sente ~ $ find . -name "foo.txt" | pvim

qui chargera le premier "foo.txt" dans Vim comme si vous aviez saisi:

vim $(find . -name "foo.txt | head -n1")

0
sente

J'ai trouvé que l'ouverture d'un fichier à l'aide de locate dans Vim est extrêmement pratique et beaucoup plus rapide que find.

La commande suivante recherche un fichier appelé app.py Dans le chemin contenant le répertoire MyPythonProject.

:args `locate '*MyPythonProject*app.py'`
0
Searene

Pour ouvrir tous les fichiers trouvés dans des onglets individuels, vous pouvez:

vim -p $(find -name somefile.txt)

ou

find -name somefile.txt -exec vim -p {} +;
0
danba