Alors que j'aime bien le vipe
approche, j'ai trouvé un moyen encore plus cool :fzf.
cat people.txt | grep -v "^#" | grep "^.*Fruit.*Folk" | fzf -m | cat
... donne une belle liste dans laquelle je peux rechercher et basculer les éléments avec le clavier et disparaît complètement lorsque j'ai terminé.
moreutils a vipe
, qui exécute simplement votre éditeur de texte habituel (vi ou quelque chose) dans le cadre du pipeline. Toutes les lignes que vous ne supprimez pas seront réécrites dans stdout. (En général, cependant, vous obtenez le même résultat en redirigeant vers un fichier temporaire et en modifiant ce fichier.)
Vous pouvez également utiliser gvim
(et vim
) pour ça. Insérez gvim /dev/stdin
dans votre pipe, et écrivez en faisant :wq! /dev/stdout
lorsque vous avez terminé l'édition.
Appeler gvim comme suit vous permet d'écrire et de fermer plus naturellement avec ZZ
:
gvim +'nmap ZZ :wq!<cr> | r /dev/stdin | 1d | file /dev/stdout'
Vous pouvez en faire un alias ou une fonction :
gvimp() {
gvim +'
nmap ZZ :wq!<cr>
r /dev/stdin
1d
file /dev/stdout
'
}
Voici un exemple où j'ai supprimé les lignes 4 à 7 et terminé en faisant ZZ
en mode normal :
$ seq 1 10 | gvimp | sed -r 's/^|$/=/g'
=1=
=2=
=3=
=8=
=9=
=10=
EDIT :Vim régulier est un peu plus délicat, car il utilise stdin pour la saisie au clavier et stdout pour dessiner l'interface utilisateur. Cependant, vous pouvez toujours l'utiliser en ajoutant un processus supplémentaire. Vous redirigez le std* de vim vers le terminal et utilisez le std* du processus parent pour le canal de données.
vimp() {
bash -c '
terminal="/dev/$(ps -o tty= $$)"
tmp_out="$(mktemp)"
trap "rm \$tmp_out" EXIT
vim <(cat) < "$terminal" &> "$terminal" +"
file $tmp_out
set noreadonly
nmap ZZ :wq!<cr>
"
cat "$tmp_out"
'
}
Le fichier temporaire est nécessaire car sinon la sortie du tube sera mélangée avec l'interface utilisateur de vim et pourrait disparaître avec elle à la sortie de vim.