Emacs içinde su / sudo içeren bir dosya açma


174

Ben kullanarak mevcut Emacs oturumda bir dosyayı açmak istediğinizi varsayalım suya sudobir kabuk aşağı bırakarak ve yapmadan, sudoeditya da sudo emacs. Bunu yapmanın bir yolu

C-x C-f /sudo::/path/to/file

ancak bu SSH üzerinden pahalı bir gidiş-dönüş gerektirir . Daha doğrudan bir yol var mı?

[EDIT] @JBB haklı. Açmak kadar çağırmak su/ sudokurtarmak da istiyorum . Kaydederken yeniden yetkilendirmenin TAMAM (ideal değil) olması gerekir. Ne arıyorum varyasyonları find-fileve save-bufferbu "piped" aracılığıyla su/ sudo.


5
Ben sadece tramp emacs22 beri varsayılan olarak yüklü geliyor, bu yüzden çoğu insan sadece Cc Cf / sudo :: / path-to / file sorunsuz yapabilirsiniz.
labirent

1
Bahsettiğin için teşekkürler sudoedit. Çok kullanışlı.
tshepang

6
Cc Cf Cx Cf olmalı?
James.Xu

Yanıtlar:


64

Tramp ile ilgili güzel bir şey, sadece ilk dosyayı açtığınızda SSH'ye gidiş-dönüş için ödeme yapmanızdır. Sudo daha sonra kimlik bilgilerinizi önbelleğe alır ve Emacs bir tanıtıcı kaydeder, böylece sonraki sudo-açılmış dosyalar çok daha az zaman alır.

Yükü kurtarmak için gereken fazla zamanı da bulamadım. Yeterince hızlı, IMO.


3
Bir saniye ... Önbellek ne sıklıkta dolar?
Chris Conway

20
Tramp yapar değil bir kullanır, SSH üzerinden gidiş-dönüş altkabuk .
Teddy

Demek istediğim, ilk açılan dosya için maliyeti ödemenizdi, diğerleri için değil.
EfForEffort


18

Kullanırsanız helm, helm-find-filesbir dosyayı root olarak açmayı destekler C-c r.


Bu çalışır, ancak bir oturumda kalıcı gibi görünüyor, daha sonra her dosya açılır ve kök olarak kaydedilir. Belgelerde M-x helm-find-files C-c ?, kullanıcı olarak normal açma moduna nasıl dönüleceğini söyleyen hiçbir şey yoktur . C-c rTekrar yapmak bunu durdurmaz.
Liam

@Liam Bu özelliği kullandığımda dosyayı normal kullanıcı olarak açabiliyorum.
Kudüs

Çok tuhaf - bazı dosyalar iyi, bazıları kök olarak açmaya çalışıyor. Kök parolasını emacs komutlarıyla öldürdüm sudo -kve sonra parolayı ister. Emacs'ı yeniden başlattım ve bu sorunu çözmedi. Ben kazdık .emacs.dve serseri bazı referanslar bulundu, bu yüzden onları sildim. Şimdi daha iyi görünüyor ama ondan özgür olup olmadığımdan emin değilim.
Liam

15

Orijinal soruya gerçekten bir cevap değil, ama burada tramp / sudo rotasını biraz daha kolay hale getirmek için yardımcı bir işlev var:

(defun sudo-find-file (dosya adı)
  "Dosyayı bulmak gibi, ancak dosyayı kök olarak açar."
  (etkileşimli "FSudo Dosya Bul:")
  (let ((tramp-dosya-adı (concat "/ sudo ::" (genişletme-dosya-adı dosya-adı)))))
    (find-file tramp-dosya-adı)))

Bence Emacs Başlangıç ​​Kiti'nde benzer bir şey var esk-sudo-edit.
mrmagooey


4

Örneğiniz hiç ssh ile başlamıyor, en azından TRAMP ("2.1.13-pre") sürümümle başlamıyor. Hem find-file hem de save-buffer harika çalışıyor.


Kimlik bilgileriniz önbelleğe alınmış olabilir. TRAMP ilk başladığında, 10-15 saniye SSH maddesinden geçer. (Ben de 2.1.13 öncesi var.)
Chris Conway

Emin misiniz? Yani, bir subshell başlatmalı, ancak localhost'a bir SSH oturumu başlatmamalı. Tüm TRAMP otomatik sniffajını ilk kez çalıştırmak yaklaşık 5 saniye sürer.
jfm3

Hayır, emin değilim. Söylemeliyim ki 10-15 saniye TRAMP (belki SSH) şeyler. SSH'nin kendisiyle değil, başlangıçtaki gecikmeden endişe duyuyorum. Bu başlangıç ​​işleri ne kadar sürüyor?
Chris Conway

İlk yaptığınızda yalnızca bir saniyeden fazla sürmelidir. Yani, / sudo :: dosyasını kaydetseniz, arabelleği silseniz ve / sudo :: file2 dosyasını açsanız bile, dosya2 hızlı bir şekilde açılmalıdır. ve kabuğu açık tutar ve tüm koklama sonuçlarını önbelleğe alır.
jfm3

Ancak kimlik bilgileri önbelleğe alınmış mı: (1) bu Emacs işlemi için mi, yoksa (2) tüm Emacs işlemleri için mi? Ve süreleri doluyor mu?
Chris Conway

3

Tavsiye komutlarını kullanmanızı tavsiye ederim. Bu işlevi ~ / .emacs öğenize koyun

(defadvice ido-find-file (after find-file-sudo activate)
  "Find file as root if necessary."
  (unless (and buffer-file-name
               (file-writable-p buffer-file-name))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

Açıkça belirtmek için, ido-find-filedosyaları bulmak için kullandığınız gerekir.
Üçlü

1

(yalnızca yerel olarak çalışır. Serseri ile düzgün çalışması için güncellenmesi gerekir)

Burton'ın cevabını biraz uzattı:

(defun sudo-find-file (file-name)
"Like find file, but opens the file as root."
(interactive "FSudo Find File: ")
(let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name))))
(find-file tramp-file-name)))


(add-hook 'dired-mode-hook
    (lambda ()
      ;; open current file as sudo 
      (local-set-key (kbd "C-x <M-S-return>") (lambda()
        (interactive)
        (message "!!! SUDO opening %s" (dired-file-name-at-point))
        (sudo-find-file (dired-file-name-at-point))
      ))
    )
)

0

Ugh. Belki de Emacs'ta bir kabuk açabilir ve sudo emacs uygulayabilirsiniz.

Sorun şu ki, sadece dosyayı açmak istemiyorsunuzdur. Daha sonra kaydedebilmek istiyorsunuz. Bu nedenle, sadece dosyayı açmak için var olmakla kalmayıp kök özelleştirmenizin devam etmesi gerekir.

Emacs'in pencere yöneticiniz olmasını istediğiniz gibi görünüyor. Bu olmadan yeterince şişirilmiş. :)


11
Ha ha şişkin dedin. Emacs eskiden kocaman görünüyordu. Şimdi, Java, Ruby ve muhtemelen başka bir yığın çalışma zamanı ayak izine kıyasla, oldukça yalın görünüyor. Ne olursa olsun, Chris'in sorusunun Emacs'ı meşru bir şekilde kullandığını düşünüyorum.
jfm3

1
Beni dövüyorsun. Bu modeli tutarlı bir şekilde kullanıyorum. Oturum açarken genel içerikler için bir Emacs oturumu, biri SU erişimi (kök olarak) ve bir veya daha fazla yazılım geliştirme (genellikle proje başına, ancak her zaman değil) için başlıyorum. Yıllardır yapıyoruz. Sadece çalışıyor.
pajato0

Bunu nasıl yapacağınızı açıklığa kavuşturabilirsiniz: "
Emacs'ta

1
@OpenLearner Cidden, bunu gerçekten yapmak istemiyorsun.
üçlü
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.