Ortak Uyarılar
Salt okunur dosya sorununun üstesinden gelmek için en yaygın yöntem, bir uygulama kullanarak süper kullanıcı olarak geçerli dosyaya bir boru açmaktır sudo tee
. Ancak, internette bulduğum en popüler çözümlerin hepsinin birkaç potansiyel uyarının bir kombinasyonu var:
- Tüm dosya terminale ve dosyaya yazılır. Büyük dosyalar için, özellikle yavaş ağ bağlantıları üzerinden bu yavaş olabilir.
- Dosya, modlarını ve benzer niteliklerini kaybeder.
- Alışılmadık karakterleri veya boşlukları olan dosya yolları düzgün işlenmeyebilir.
Çözümler
Tüm bu sorunların üstesinden gelmek için aşağıdaki komutu kullanabilirsiniz:
" On POSIX (Linux/Mac/BSD):
: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'
Bunlar saygıyla kısaltılabilir:
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'
açıklama
:
komutu başlatır; bir komut girmeye başlamak için bu karakteri normal modda yazmanız gerekir. Komut dosyalarında atlanmalıdır.
sil[ent]
komuttan çıktıları bastırır. Bu durumda, komutu Press any key to continue
çalıştırdıktan sonra görünen -like istemini durdurmak istiyoruz :!
.
exec[ute]
bir dizeyi komut olarak yürütür. Biz sadece koşamam :write
gerekli işlev çağrısını işlemez çünkü.
!
:!
komutu temsil eder : :write
kabul eden tek komut . Normalde, :write
yazılacak dosya yolunu kabul eder. :!
kendi başına bir kabukta bir komut çalıştırır (örneğin, kullanarak bash -c
). İle :write
, komutu kabukta çalıştırır ve ardından tüm dosyayı adresine yazar stdin
.
sudo
açık olmalısın, çünkü bu yüzden buradasın. Süper kullanıcı olarak komutu çalıştırın. Ağın etrafında bunun nasıl çalıştığı hakkında bol miktarda bilgi var.
tee
Borular stdin
verilen dosyaya. :write
yazacağına stdin
, daha sonra süper kullanıcı tee
dosya içeriğini almak ve dosyasına yazacaktır. Yeni bir dosya oluşturmaz - sadece içeriğin üzerine yaz - böylece dosya modları ve öznitelikleri korunur.
shellescape()
geçerli kabuk için uygun şekilde verilen dosya yolundaki özel karakterlerden kaçar. Sadece bir parametreyle, yolu gerektiğinde tırnak içine alır. Tam bir kabuk komut satırına gönderdiğimiz için, aksi takdirde kabuktan çıkabilen diğer özel karakterlerin ters eğik çizgiden kaçmasını sağlamak için ikinci argüman olarak sıfırdan farklı bir değer geçirmek isteyeceğiz.
@%
%
geçerli arabellek dosya adını içeren kaydın içeriğini okur . Mutlak bir yol olması gerekmez, bu nedenle geçerli dizini değiştirmediğinizden emin olun. Bazı çözümlerde, reklamdaki simgesi atlanır. Konuma bağlı olarak, %
geçerli bir ifadedir ve %
kaydı okumakla aynı etkiye sahiptir . Bununla birlikte, başka bir ifadenin içine yerleştirilmiş olan kısayol genellikle izin verilmez: bu durumda olduğu gibi.
>NUL
ve platformun boş cihazına >/dev/null
yönlendirin stdout
. Komutu susturmuş olsak da, boru ile ilişkili tüm ek yükün vim'e stdin
geri dönmesini istemiyoruz - en iyisi mümkün olduğunca erken dökmek. NUL
DOS, MS-DOS ve Windows'daki null aygıt, geçerli bir dosya değil. Windows 8'den itibaren NUL'a yeniden yönlendirme, NUL adında bir dosyanın yazılmasına neden olmaz. Masaüstünüzde NUL adında bir dosya uzantısı olsun veya olmasın bir dosya oluşturmayı deneyin: bunu yapamazsınız. (Windows'da öğrenmeye değer diğer birkaç cihaz adı vardır.)
~ / .Vimrc
Platform-Bağımlı
Tabii ki, hala bunları ezberlemek ve her seferinde yazmak istemiyorsunuz. Uygun komutu daha basit bir kullanıcı komutuyla eşleştirmek çok daha kolaydır. POSIX'te bunu yapmak için, ~/.vimrc
dosyanıza şu satırı ekleyerek mevcut satırı oluşturabilirsiniz:
command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
Bu, geçerli dosyayı süper kullanıcı izinleriyle yazmak için W (büyük / küçük harfe duyarlı) komutunu yazmanıza olanak tanır - çok daha kolay.
Platform bağımsız
~/.vimrc
Bilgisayarlar arasında eşitlenen platformdan bağımsız bir dosya kullanıyorum, bu yüzden benimkine çoklu platform işlevselliği ekledim. Aşağıda ~/.vimrc
yalnızca ilgili ayarların bulunduğu bir:
#!vim
" 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