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.