在Emacs里面用su / sudo打开一个文件

假设我想使用susudo在现有的Emacs会话中打开一个文件,而不必下降到shell并执行sudoeditsudo emacs 。 一个办法是做到这一点

 Cx Cf /sudo::/path/to/file 

但是这需要通过SSH进行昂贵的往返 。 有更直接的方法吗?

[编辑] @JBB是正确的。 我希望能够调用su / sudo来保存以及打开。 保存时重新授权是可以的(但不是理想的)。 我正在寻找的是可以通过su / sudo “pipe道”的find-filesave-buffer变体。

关于Tramp的好处是,当您打开第一个文件时,您只需支付SSH的往返费用。 Sudo然后caching您的凭据,Emacs保存一个句柄,以便后续的sudo打开的文件占用更less的时间。

我还没有find额外的时间来节省负担。 IMO足够快。

Tramp不通过SSH往返sudo,它使用一个子shell 。 请参阅手册: https : //www.gnu.org/software/tramp/#Inline-methods

所以我build议你坚持TRAMP。

不是真正的原始问题的答案,但是这里有一个辅助函数使得tramp / sudo路线更容易一些:

 (defun sudo-find-file(文件名)
   “像查找文件,但以root身份打开文件”。
   (交互式“FSudo查找文件:”)
   (((tramp-file-name(concat“/ sudo ::”(展开文件名文件名))))
     (find-file tramp-file-name)))

如果你使用helmhelm-find-files支持以Cc r作为根目录打开一个文件。

至less为了保存,一个sudo-save软件包正是为这样的问题编写的。

你的例子根本不启动SSH,至less不是我的版本TRAMP(“2.1.13-pre”)。 find-file和save-buffer都很好用。

我build议你使用build议命令。 把这个函数放在〜/ .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)))) 

啊。 也许你可以在Emacs和exec sudo emacs中打开一个shell。

问题是,你大概不只是想打开文件。 您希望能够稍后保存它。 因此你需要你的root privs来坚持,而不是仅仅为了打开文件而存在。

听起来像你想Emacs成为你的窗口pipe理器。 没有这个就够了。 🙂

(只在本地工作,需要更新才能通过tramp正确工作)

伯顿的答案略有扩展:

 (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 "Cx <MS-return>") (lambda() (interactive) (message "!!! SUDO opening %s" (dired-file-name-at-point)) (sudo-find-file (dired-file-name-at-point)) )) ) )