Abra um arquivo com su / sudo dentro do Emacs
-
01-07-2019 - |
Pergunta
Suponha que eu queira abrir um arquivo em uma sessão Emacs existente usando su
ou sudo
, sem deixar cair para baixo para uma concha e fazendo sudoedit
ou sudo emacs
. Uma maneira de fazer isso é
C-x C-f /sudo::/path/to/file
mas isso requer um caro de ida e volta através de SSH . Existe uma maneira mais direta?
[EDIT] @JBB é certo. Eu quero ser capaz de invocar su
/ sudo
para salvar, bem como aberto. Seria OK (mas não ideal) para re-autorizar ao salvar. O que eu estou procurando é variações de find-file
e save-buffer
que podem ser "canalizados" através su
/ sudo
.
Solução
A coisa agradável sobre Tramp é que você só paga pelo que ida e volta para SSH quando você abre o primeiro arquivo. Sudo, em seguida, guarda suas credenciais, e Emacs salva uma alça, para que os arquivos abriu-sudo subseqüentes demorar muito menos tempo.
Eu não encontrei o tempo extra que leva para salvar sobrecarregar, tampouco. É rápido o suficiente, IMO.
Outras dicas
Tramp faz não round-trip sudo via SSH, ele usa um subshell . Veja o manual: https://www.gnu.org/software/tramp/#Inline -Métodos
Portanto, eu recomendo que você fique com TRAMP.
Se você usar helm
, helm-find-files
suportes abrir um arquivo como root com C-c r
.
Não é realmente uma resposta para a pergunta original, mas aqui é uma função auxiliar para fazer fazendo o vagabundo / sudo rota um pouco mais 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)))
Pelo menos para poupar, a sudo-save pacote foi escrito exatamente para esse tipo de problema .
Seu exemplo não começar ssh em tudo, pelo menos não com a minha versão do TRAMP ( "2.1.13-pré"). Ambos encontram-arquivo e salvar-buffer grande trabalho.
Eu recomendo que você use aconselhando comandos. Coloque esta função em seu ~ / .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:root@localhost:" buffer-file-name))))
(funciona apenas localmente. Precisam ser atualizados para funcionar corretamente via tramp)
Um pouco estendido a resposta 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))
))
)
)
Ugh. Talvez você poderia abrir um shell no Emacs e emacs sudo exec.
O problema é que você provavelmente não quer apenas abrir o arquivo. Você quer ser capaz de salvá-lo mais tarde. Assim você precisa de seus privs raiz de persistir, não apenas existem para abrir o arquivo.
Parece que você quer Emacs para se tornar seu gerenciador de janelas. É o suficiente inchado sem isso. :)