Écrire un fichier vim en tant que super-utilisateur?

10

C'est un problème de convivialité qui m'arrive souvent:

J'ouvre un fichier système en lecture seule avec vim, même en le modifiant, parce que je ne suis pas assez attentif ou parce que le vim sur le système est mal configuré. Une fois mes modifications effectuées, je suis obligé de les écrire dans un fichier temporaire ou de les perdre, car: w! ne fonctionnera pas.

Existe-t-il une commande vim (: W !!!) qui vous permet d'écrire le tampon actuel en tant que super-utilisateur? (Vim vous demanderait naturellement votre mot de passe sudo ou su)

zimbatm
la source
questions connexes (doublons pas tout à fait exacts): superuser.com/questions/23428/vim-sudo-vim-bad-idea .. superuser.com/questions/106865/… .. et de SO, stackoverflow.com/questions/1005 /…
Quack Quikote
1
Le SO est définitivement une dupe, mais les deux questions SU abordent un problème distinct résolu avec la sudoeditcommande. Cette question est plus axée sur l'oubli de le taper en premier lieu et l'élévation après le démarrage de l'éditeur.
lourd

Réponses:

15
:w !sudo tee % >/dev/null`

Explication: Avec !, vous pouvez exécuter des programmes. En le préfixant avec: w, le contenu du fichier (ce que vous avez dans vim, pas le fichier d'origine, plus précisément: le tampon) sera donné à la commande sur l'entrée standard. %est remplacé par le nom du fichier et >/dev/nullévite que le contenu ne soit à nouveau imprimé à l'écran (ce qui est le comportement habituel de tee).

J'ai trouvé un moyen encore plus court. ddn'imprime pas sur stdout pour que vous puissiez enregistrer la chose nulle.

:w !sudo dd of=%

C'est la même chose pour :r, qui insère la sortie de la commande donnée, vous pouvez donc par exemple insérer la date actuelle dans votre fichier en utilisant:r !date

Marian
la source
Merci beaucoup, vous avez rendu ma vie bien meilleure! (Brian aussi)
zimbatm
Je viens d'ajouter une deuxième méthode.
Marian
C'est vraiment bien!
Anthony Giorgio
ne fonctionne pas avec undofiles
Christian Brabandt
5

Essayer:

:w !sudo tee % >/dev/null
Brian
la source