Je me trouve faire ce qui suit presque tous les jours
find -name somefile.txt
)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
Vous pouvez utiliser la substitution de commande:
vim $(find -name somefile.txt)
ou
find -name somefile.txt -exec vim {} \;
Essaye ça:
: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
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 :)
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 `!!`
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
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")
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'`
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 {} +;