2008-09-18 10 views
153

Załóżmy, że chcę otworzyć plik w istniejącej sesji Emacs przy użyciu su lub sudo, bez upuszczania do powłoki i wykonywania sudoedit lub sudo emacs. Jednym ze sposobów, aby to zrobić jestOtwórz plik z su/sudo wewnątrz Emacs

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

ale to wymaga drogiego round-trip through SSH. Czy istnieje bardziej bezpośredni sposób?

[EDYCJA] @JBB ma rację. Chcę móc wywołać su/sudo, aby zapisać i otworzyć. Byłoby OK (ale nie idealne), aby ponownie autoryzować przy zapisywaniu. Potrzebuję odmian find-file i save-buffer, które można "wyprowadzać" przez su/sudo.

+3

Chciałem tylko zwrócić uwagę, że tramp przychodzi domyślnie instalowany od emacs22, więc większość ludzi może po prostu zrobić Cc Cf/sudo ::/path-to/file bez problemu. – labyrinth

+0

Dzięki za wzmiankę o "sudoedit". Bardzo przydatne. – Tshepang

+2

C-c C-f powinno być C-x C-f? –

Odpowiedz

54

Dobrą rzeczą w Trampie jest to, że płacisz tylko za tę podróż w obie strony do SSH po otwarciu pierwszego pliku. Sudo następnie buforuje twoje dane uwierzytelniające, a Emacs zapisuje uchwyt, więc kolejne pliki otwierane przez sudo zabierają znacznie mniej czasu.

Nie znalazłem dodatkowego czasu na zmniejszenie obciążenia. Jest wystarczająco szybki, IMO.

+2

Zaczekaj chwilę ... Jak często pamięć podręczna wygasa? –

+18

Tramp robi ** nie ** w obie strony przez SSH, używa * podpowiastki *. – Teddy

+0

Chodziło mi o to, że płacisz za pierwszy otwarty plik, a nie za żadne inne. – EfForEffort

0

Ugh. Być może mógłbyś otworzyć powłokę w Emacs i wykonać sudo emacs.

Problem polega na tym, że prawdopodobnie nie chcesz tylko otwierać pliku. Chcesz móc go później zapisać. W ten sposób będziesz potrzebował swoich głównych praw, aby nie istniały tylko po to, aby otworzyć plik.

Wygląda na to, że chcesz, aby Emacs stał się Twoim menedżerem okien. Bez tego jest wystarczająco spuchnięty. :)

+11

Ha ha, który powiedziałeś wzdęcia. Emacs wydawał się ogromny. Teraz, w porównaniu ze śladami czasu pracy Java, Ruby i pewnie stertą innych rzeczy, wygląda całkiem szczuplej. Bez względu na to, myślę, że pytanie Chrisa trafia na całkowicie zgodne z prawem użycie Emacsa. – jfm3

+1

Uderzyłeś mnie w to. Używam tego modelu konsekwentnie. Podczas logowania uruchamiam jedną sesję Emacsa dla ogólnych rzeczy, jedną dla dostępu SU (jako root) i jedną lub więcej dla rozwoju oprogramowania (zazwyczaj dla projektu, ale nie zawsze). Robiłem to od lat. Po prostu działa. – pajato0

+0

możesz wyjaśnić, jak to zrobić: "otwórz powłokę w Emacs i wykonaj sudo emacs" – johnbakers

4

Twój przykład nie uruchamia ssh w ogóle, przynajmniej nie w mojej wersji TRAMP ("2.1.13-pre"). Zarówno find-file jak i save-buffer działają świetnie.

+0

Możesz mieć swoje poświadczenia zapisane w pamięci podręcznej. Kiedy TRAMP po raz pierwszy uruchamia się, przechodzi przez 10-15 sekund materiału SSH. (Mam też 2.1.13 pre). –

+0

Jesteś pewien? Mam na myśli, że powinno uruchamiać podpowłokę, ale nie sesję SSH dla localhosta. Zajmuje około 5 sekund, aby po raz pierwszy uruchomić automatyczny atak TRAMP. – jfm3

+0

Nie, nie jestem pewien. Powinienem powiedzieć, że jest 10-15 sekund TRAMP (może SSH). Nie martwię się o SSH jako taki, ale o opóźnienie w uruchomieniu. Jak długo trwają te starcia? –

13

Nie naprawdę odpowiedzią na oryginalne pytanie, ale tutaj jest to funkcja pomocnika, aby robić kundel/trasa sudo trochę łatwiej:

 
(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))) 
+0

Myślę, że [Zestaw startowy Emacs] (https://github.com/technomancy/emacs-starter-kit) ma coś podobnego w 'esk-sudo-edit'. – mrmagooey

2

polecam Ci użyć poleceń doradza. Umieścić tę funkcję w swoim ~/.emacs

(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:[email protected]:" buffer-file-name)))) 
+0

Wystarczy wskazać oczywiste, to wymaga użycia 'ido-find-file' do znalezienia plików. – tripleee

12

Jeśli używasz helm, helm-find-files obsługuje otwierania pliku jako root z C-c r.

0

(działa tylko lokalnie muszą być aktualizowane, aby działać poprawnie poprzez tramp.)

Nieco rozszerzony Burtona odpowiedź:

(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)) 
    )) 
    ) 
)