Comment fonctionne `: w! Sudo tee%`


27

Si vous ouvrez un fichier sur lequel vous n'êtes pas autorisé à écrire dans vim, puis décidez que vous devez le modifier, vous pouvez écrire vos modifications sans quitter vim en faisant :w !sudo tee %
Je ne comprends pas comment cela peut fonctionner. Pouvez-vous disséquer cela?
Je comprends la :wpartie, il écrit le tampon actuel sur le disque, en supposant qu'il y a déjà un nom de fichier qui lui est associé, non?
Je comprends également !qui exécute la sudo teecommande et %représente le contenu du tampon actuel, n'est-ce pas?
Mais je ne comprends toujours pas comment cela fonctionne.

Réponses:


30

La structure des :w !cmdmoyens « écrire le tampon courant acheminé par la commande ». Ainsi, vous pouvez le faire, par exemple, :w !catet il dirigera le tampon cat.

Le nom de fichier% est maintenant associé au tampon

Il en :w !sudo tee %sera de même pour le contenu du tampon sudo tee FILENAME. Cela écrit efficacement le contenu du tampon dans le fichier.


Et c'est quoi tee?
CodyBugstein Il y a


2

Pas tout à fait juste!

!commandexécute la commande en tant que commande de filtrage , qui obtient le texte de stdin, fait quelque chose et le produit stdout.

En utilisant w, vous avez poussé le contenu du fichier vers stdinof sudo tee %. %est un registre spécial dans vim, qui contient le nom du fichier actuel.

Vous avez donc obtenu sudo tee FILENAME, ce qui poussera tee stdin- le contenu du fichier - vers le fichier actuel.


2
:!commandest un filtre (cf. :h !), alors qu'il :w !commandne l'est pas, il s'exécute simplement commandavec le fichier courant comme stdin(cf. :h :w_c). À savoir: :w !sed /./dne change pas le contenu du tampon actuel. Mais la recette est en effet pas tout à fait raison pour une autre raison, %doit être échappé: :exec 'w !sudo tee ' . shellescape(expand('%', 1)). La commande d'origine ne fonctionne pas avec, par exemple, les noms de fichiers avec des espaces.
Satō Katsura
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.