2008-09-18 7 views
153

Supongamos que quiero abrir un archivo en una sesión existente de Emacs usando su o sudo, sin dejar caer a un shell y hacer sudoedit o sudo emacs. Una forma de hacerlo esAbra un archivo con su/sudo dentro de Emacs

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

pero esto requiere un costoso round-trip through SSH. ¿Hay una manera más directa?

[EDIT] @JBB tiene razón. Deseo poder invocar su/sudo para guardar y abrir. Estaría bien (pero no es lo ideal) volver a autorizar al guardar. Lo que estoy buscando son variaciones de find-file y save-buffer que se pueden "entubar" a través de su/sudo.

+3

solo quería tener en cuenta que vagabundo viene instalado por defecto, ya emacs22, entonces la mayoría de la gente puede hacer el archivo Cc Cf/sudo ::/path-to/sin ningún problema. – labyrinth

+0

Gracias por la mención 'sudoedit'. Muy útil. – Tshepang

+2

C-c C-f debe ser C-x C-f? –

Respuesta

54

Lo bueno de Tramp es que solo pagas ese viaje de ida y vuelta a SSH cuando abres el primer archivo. Sudo luego guarda sus credenciales en caché, y Emacs guarda un identificador, de modo que los archivos posteriores sudo-abiertos toman mucho menos tiempo.

No he encontrado el tiempo adicional que se necesita para ahorrar carga, tampoco. Es lo suficientemente rápido, IMO.

+2

Espera un segundo ... ¿Con qué frecuencia caduca el caché? –

+18

Tramp hace ** no ** ida y vuelta a través de SSH, utiliza una * subshell *. – Teddy

+0

Mi punto era que usted paga el costo del primer archivo abierto, y no de ninguno de los otros. – EfForEffort

0

Ugh. Tal vez podrías abrir un shell en Emacs y exec sudo emacs.

El problema es que presumiblemente no solo quiere abrir el archivo. Desea poder guardarlo más tarde. Por lo tanto, necesita sus privilegios de raíz para persistir, no solo existir para abrir el archivo.

Parece que desea que Emacs se convierta en su administrador de ventanas. Está lo suficientemente hinchado sin eso. :)

+11

Ja, ha dicho hinchado. Emacs solía parecer enorme. Ahora, en comparación con las huellas de tiempo de ejecución de Java, Ruby, y probablemente una pila de otras cosas, parece bastante delgada. En cualquier caso, creo que la pregunta de Chris tiene un uso perfectamente legítimo de Emacs. – jfm3

+1

Me ganaste. Yo uso este modelo de manera consistente. Al iniciar sesión, comienzo una sesión de Emacs para cosas generales, una para acceso de SU (como raíz) y una o más para desarrollo de software (generalmente por proyecto pero no siempre). Estado haciéndolo por años. Solo funciona. – pajato0

+0

puede aclarar cómo hacer esto: "abrir un shell en Emacs y exec sudo emacs" – johnbakers

4

Su ejemplo no arranca ssh en absoluto, al menos no con mi versión de TRAMP ("2.1.13-pre"). Tanto find-file como save-buffer funcionan de maravilla.

+0

Puede tener sus credenciales en caché. Cuando TRAMP se inicia por primera vez, pasa por 10-15 segundos de cosas SSH. (Tengo 2.1.13-pre también.) –

+0

¿Estás seguro? Quiero decir, debería comenzar una subshell, pero no una sesión SSH para localhost. Toma aproximadamente 5 segundos para ejecutar todo el auto-olfateado TRAMP la primera vez. – jfm3

+0

Bueno, no, no estoy seguro. Debo decir que hay 10-15 segundos de TRAMP (tal vez SSH) cosas. No me preocupa el SSH per se, sino el retraso en comenzar. ¿Cuánto tiempo persisten estas cosas de inicio? –

13
No

realmente una respuesta a la pregunta original, pero aquí es una función de ayuda para hacer hacer el/ruta sudo vagabundo un poco más fácil:

 
(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

Creo que el [Emacs Starter Kit] (https://github.com/technomancy/emacs-starter-kit) tiene algo similar en 'esk-sudo-edit'. – mrmagooey

2

te recomiendan usar los comandos de asesoramiento. Poner esta función en su ~/.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

Solo para señalar lo obvio, esto requiere que estés usando 'ido-find-file' para encontrar archivos. – tripleee

12

Si utiliza helm, helm-find-files soportes abrir un archivo como root con C-c r.

0

(funciona sólo a nivel local deben actualizarse para que funcione correctamente a través de vagabundo.)

Un poco extendida respuesta de Burton:

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