假设我想使用su
或sudo
在现有Emacs会话中打开文件,而不是直接转到shell并执行sudoedit
或sudo emacs
。一种方法是
C-x C-f /sudo::/path/to/file
但这需要昂贵的round-trip through SSH。有更直接的方式吗?
[编辑] @JBB是对的。我希望能够调用su
/ sudo
来保存和打开。保存时重新授权会好(但不理想)。我正在寻找的是find-file
和save-buffer
的变体,可以通过su
/ sudo
“管道”。
答案 0 :(得分:62)
Tramp的优点在于,当您打开第一个文件时,您只需为SSH的往返付费。然后Sudo缓存您的凭据,Emacs保存一个句柄,以便随后打开sudo文件花费的时间更少。
我还没有找到节省负担所需的额外时间。它足够快,IMO。
答案 1 :(得分:62)
Tramp通过SSH执行不往返sudo,它使用子shell 。请参阅手册:https://www.gnu.org/software/tramp/#Inline-methods
因此,我建议您坚持使用TRAMP。
答案 2 :(得分:16)
如果您使用helm
,则helm-find-files
支持以C-c r
为根打开文件。
答案 3 :(得分:13)
不是原来问题的答案,但是这里有一个辅助函数可以让tramp / sudo路径更容易:
(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)))
答案 4 :(得分:5)
至少在保存时,sudo-save package完全针对这类问题编写。
答案 5 :(得分:4)
你的例子根本没有启动ssh,至少不是我的TRAMP版本(“2.1.13-pre”)。 find-file和save-buffer都很好用。
答案 6 :(得分:2)
我建议你使用建议命令。将此功能放在〜/ .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))))
答案 7 :(得分:1)
(仅在本地工作。需要通过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 "C-x <M-S-return>") (lambda()
(interactive)
(message "!!! SUDO opening %s" (dired-file-name-at-point))
(sudo-find-file (dired-file-name-at-point))
))
)
)
答案 8 :(得分:0)
唉。也许你可以在Emacs中打开一个shell并执行sudo emacs。
问题是你可能不只是想打开文件。您希望以后能够保存它。因此,您需要保留root权限,而不仅仅是存在打开文件。
听起来您希望Emacs成为您的窗口管理员。没有那个,它就足够了。 :)