Yazma iznim olmayan bir dosya nasıl kaydedilir?


26

Bazen bir dosyayı açar [read-only]ve durum satırındaki uyarıyı fark etmeden (yani, bazı rasgele /etcyapılandırma dosyaları gibi /etc/resolv.conf) farketmeden veya "unutmadan" kendi kullanıcım olarak bazı değişiklikler yaparım .

:w!Açıkçası bu durumda benim kullanıcı zaten zaten yazma izni olmadığı için başarısız. Bu yüzden :w /home/filenameçıkmalı ve sudo mv ...çok rahatsız edici olmalıyım .

Açık olan dosyayı kaydedebilmek için geçici olarak kökten çıkmamın bir yolu var mı? (içinde bulunduğumda sudoersveya / ve sudoğrudan yapabilirsem )

Yanıtlar:


24

İşin püf noktası harici bir çağrı yapmaktır sudo:

:w !sudo tee %

Bu nasıl çalışır:

  • :w !<command><command>tamponun içeriği ile stdin olarak çalıştırılır .
  • teestdin dosyasını bir dosyaya kopyalar & stdout; %geçerli dosya adına genişler ..
  • sudoKök izinleri için önek eklersiniz.

Dosyayı gerçekten Vim ile kaydetmiyorsunuz, bunun yerine, düzenlemekte olduğunuz dosyanın içeriğinin üzerine yazmak için harici bir program çağırıyorsunuz. Bu yüzden Vim'den bir uyarı alacaksınız:

W12: Warning: File "xxx" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

Bunu bir işleve dönüştürebilirsiniz:

fun! SuperWrite()
        write !sudo tee %
        " Or with :silent (but that doesn't seem to work for everyone)
        "silent write !sudo tee %
        edit!
endfun

Ve keybind:

nnoremap <Leader>w! :call SuperWrite()<CR>

İle su, yalnızca kök kullanıcı -chemen bir komutu çalıştırmak için kullanabilir . Bunu yapmak için kullanabileceğini sanmıyorum su, ama belki de bilmediğim bir numara var.


SuperWriteçalışır, ancak dosyayı size geri yansıtır. :silentLy çalıştırdığınızda , şifrenizi görünmez olarak girdiniz.
TankorSmash

@TankorSmash Teşekkürler; cevap güncellendi. Yine de "parolanızı görünmez olarak girin" ile ne kastettiğinizden emin değil misiniz? Ekleme silentiyi iş gibi görünüyor?
Martin Tournoij

Sudo ile vim'i çalıştırmıyorum, bu yüzden burada çalıyor olabilir, fakat dosyaya sudo girdiğimde sudo şifresini ister. Sessizse, komut istemini göremiyorum, ancak yine de bir şifre girmeniz gerekiyor.
TankorSmash

1
Gördüğünüz şey, tee'nin verilen dosya kadar stdout'a yankılanmasının standart işlevselliğidir. Bir çözüm stdout komutunu / dev / null, a la dizinine yönlendirmektir: w ! tee % > /dev/null Bu hala komutun sonucunu (tek bir satır) yansıtır, ancak tüm tampon içeriğini değil.
Jon Carter

Kullanmak yerine teeçıktılarını atmak yerine cat, dosyanın yazdırılmasını istemiyorsanız da işe yaramaz mı?
Yalan Ryan

12

Kullanacağım .vimrc dosyamda aşağıdaki haritalamayı kullanıyorum:

cnoremap w!! w !sudo tee %

Hatırlamak kolaydır, çünkü w"yazmak" w!, "zorla yazma " dır ve w!!"süper duper-force yazma" dır. : P


1
Uzun zamandır haritalandırdım W, ama w!!çok daha mantıklı geliyor. Thanks
jalanb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.