De multe ori în timp ce editați fișiere de configurare, am'll deschide unul cu vi și atunci când mă duc să-l salveze dau seama că nu am't tip
Există vreo modalitate de a da vi sudo privilegii pentru a salva fișiere? Îmi amintesc că am văzut ceva despre asta în timp ce noi căutăm ceva despre vi un timp în urmă, dar acum nu pot't găsi.
%
este înlocuit cu actualul nume de fișier, astfel puteti folosi:
(vim
va detecta că fișierul a fost modificat și întreba dacă doriți să-l pentru a fi reîncărcate. Spune da prin alegerea [L]
, mai degrabă decât OK.)
Ca o comandă rapidă, puteți defini propriile comanda. Pune următoarele in .vimrc
:
Cu cele de mai sus aveți posibilitatea să tastați `:W
În acest fel aveți posibilitatea să tastați :w!!
și acesta va fi extins la întreaga linie de comandă, lăsând cursorul la sfârșitul anului, astfel încât să puteți înlocui %
cu un nume de fișier propriu, dacă vă place.
În general, se poate't schimba eficiente id-ul de utilizator al vi-proces, dar puteți face acest lucru:
Cea mai comună metodă de a obține în jurul valorii de fișier doar în citire problema este de a deschide o țeavă în fișierul curent ca super-utilizator, folosind o implementare de sudo tee
. Cu toate acestea, toate dintre cele mai populare soluții care am găsit-o pe Internet au o combinație de mai multe potențiale limitări:
Pentru a obține în jurul valorii de toate aceste probleme, puteți utiliza următoarea comandă:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'
Acestea pot fi scurtat, cu respect:
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'
:
începe la comanda; va trebui să introduceți acest personaj în modul normal să începeți să introduceți o comandă. Acesta ar trebui să fie omise în scripturi.
sil[ent]
suprimă producția de comanda. În acest caz, vrem să oprim Apasati orice tasta pentru a continua
-ca prompte, care apare după rularea :!
comanda.
exec[ute]
execută un șir de caractere ca o comandă. Putem't trebuie doar să rulați :scrie
pentru't procesul necesare apel de funcție.
!
reprezintă :!
comanda: singura comanda asta:scrie acceptă. În mod normal, :scrie acceptă o cale de fișier în care să scrie.
:!pe cont propriu execută o comandă într-o coajă (de exemplu, folosind
bash -c). Cu
:scrie, se va executa comanda în coajă, și apoi scrie întregul dosar să stdin
.
"sudo" ar trebui să fie evident, din moment ce's de ce ai're aici. Rulați comanda ca super-utilizator. Nu's o mulțime de informații în jurul valorii de 'net despre modul în care funcționează.
tee
conducte stdin
a dat de fișier. :scrie va scrie
stdin, apoi super-user
tee` va primi conținutul fișierului și scrie fișierul. Nu o't de a crea un fișier nou ... doar suprascrie conținutul-atât de fișier moduri și atribute vor fi conservate.
shellescape()
scapă caractere speciale în calea de fișier, după caz, pentru shell-ul curent. Cu doar un singur parametru, de obicei doar încadrați calea citate după cum este necesar. Când ne-am're trimiterea la un plin de coajă de linie de comandă, am'll doresc să treacă o valoare diferită de zero ca al doilea argument pentru a permite backslash-evadarea de alte caractere speciale, care altfel s-ar putea excursie pe coajă.
@%
citește conținutul %
registru, care conține curent tampon's nume de fișier. L's nu neapărat o cale absolută, astfel asigurați-vă că am't s-a schimbat directorul curent. În unele soluții, veți vedea comerciale-de la simbol omise. În funcție de locație, %
este o expresie validă, și are același efect ca și citirea %
registru. Imbricată într-o altă exprimare mai rapidă este în general interzisă, cu toate acestea, cum ar fi: în acest caz.
>NUL " și " >/dev/null
redirect stdout
la platforma's nul dispozitiv. Chiar dacă ne-am'am redus la tăcere comanda, nu ne't doresc toate cheltuielile asociate cu conducte stdin înapoi la vim ... cel mai bun să scape de ea cât mai curând posibil.
NUL` este nul dispozitiv pe DOS, MS-DOS și Windows, nu este un fișier valid. Ca de Windows 8 redirectionari de NUL nu't rezultatul într-un fișier numit NUL a fi scris. Încercați să creați un fișier de pe desktop, pe nume NUL, cu sau fără extensia de fișier: veți fi în măsură să facă acest lucru. (Există mai multe alte nume de dispozitive în Windows, care ar putea fi în valoare de a cunoaște.)
Desigur, încă nu't doriți să memoreze aceste și introduceți-le de fiecare dată. L's mult mai ușor să hartă comanda corespunzătoare pentru un simplu utilizator de comandă. Pentru a face acest lucru pe POSIX, ai putea să adăugați următoarea linie la ~/.vimrc
de fișiere, crearea de ea, dacă nu't există deja:
Acest lucru vă va permite să tastați :W (case-sensitive) comandă pentru a scrie fișierul curent cu super-utilizator permisiuni-mult mai ușor.
Eu folosesc o platformă independentă ~/.vimrc
fișier care se sincronizează de pe computere, așa că am adăugat multi-platforma de funcționalitate a mea. Aici's a `~/.vimrc cu doar setările relevante:
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
" ts: Actual tab character stops.
" sw: Indentation commands shift by this much.
" sr: Round existing indentation when using shift commands.
" sts: Virtual tab stops while using tab key.
" fdm: Folds are manually defined in file syntax.
" ff: Line endings should always be <NL> (line feed #09).
" fenc: Should always be UTF-8; #! must be first bytes, so no BOM.
" General Commands: User Ex commands. {{{1
command W call WriteAsSuperUser(@%) " Write file as super-user.
" Helper Functions: Used by user Ex commands. {{{1
function GetNullDevice() " Gets the path to the null device. {{{2
if filewritable('/dev/null')
return '/dev/null'
else
return 'NUL'
endif
endfunction
function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
endfunction
" }}}1
" EOF
Ryan's de consiliere este în general bună, cu toate acestea, dacă după pasul 3, don't a muta fișierul temporar; it'll au greșit proprietate și permisiuni. În schimb, sudoedit
a fișierului corectă și citiți conținutul (folosind :r
sau ca) din fișierul temporar.
Dacă după pasul 2, folosi :w!
pentru a forța fișier pentru a fi scris.
Când te duci în modul inserare pe un fișier aveți nevoie de sudo acces pentru a edita, puteți primi un mesaj de stare spun
Dacă mi-e dor că, în general, să fac
:q
..atunci..
..sau..
Nu's, probabil, mai puțin sens giratoriu mod de a face asta, dar funcționează.
Aici's un altul, care a apărut de la această întrebare s-a răspuns, un plugin numit SudoEdit care oferă SudoRead și SudoWrite funcții, care va implicit încercați să folosiți sudo primul și su cazul în care nu reușește: http://www.vim.org/scripts/script.php?script_id=2709
Un Google rapid pare a da acest sfat:
Am asta in ~/.bashrc:
Acum ori de câte ori am nevoie pentru a edita un fișier de configurare, doar am deschis-o cu vesta inot.
Un hack rapid puteți lua în considerare este de a face un chmod pe fișierul pe care're de editare, salvare cu vim, și apoi chmod înapoi la ceea ce dosarul a fost inițial.
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)
Desigur eu nu't recomandăm această abordare într-un sistem în care tu're îngrijorat de securitate, ca și pentru câteva secunde oricine poate citi/modifica fișierul fără să-ți dai seama.