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.

Foi útil?

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. :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top