假设我想使用su或sudo在现有的Emacs会话中打开文件,而无需下拉至shell并执行sudoedit或sudo emacs。 一种方法是
1
| C-x C-f /sudo::/path/to/file |
但这需要通过SSH进行昂贵的往返。 有没有更直接的方法?
[编辑] @JBB是正确的。 我希望能够调用su / sudo保存并打开。 保存时重新授权是可以的(但不理想)。 我正在寻找的是find-file和save-buffer的变体,可以通过su / sudo进行"管道传输"。
Tramp的好处是,您打开第一个文件时只需为往返SSH付费。然后,Sudo会缓存您的凭据,而Emacs将保存一个句柄,以便随后的sudo打开的文件花费的时间要少得多。
我也没有发现节省负担的额外时间。 IMO,速度足够快。
Tramp不会通过SSH来回传递sudo,它使用了一个subshel??l。请参阅手册:https://www.gnu.org/software/tramp/#Inline-methods
因此,我建议您坚持使用TRAMP。
如果使用helm,则helm-find-files支持使用C-c r作为根文件打开文件。
这并不是对原始问题的真正答案,但是这里有一个帮助函数,可以使流浪汉/苏多路线的工作变得更加轻松:
1 2 3 4 5
| (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))) |
至少为了节省,为这种问题编写了一个sudo-save软件包。
您的示例根本不会启动ssh,至少不会以我的TRAMP版本(" 2.1.13-pre")启动。查找文件和保存缓冲区都很好。
我建议您使用建议命令。将此功能放在?/ .emacs中
1 2 3 4 5
| (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)))) |
(仅在本地工作。需要更新以通过流浪汉正确工作)
伯顿的回答有点扩展:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| (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))
))
)
) |
啊。也许您可以在Emacs和exec sudo emacs中打开一个shell。
问题是您大概不只是想要打开文件。您希望以后可以保存它。因此,您需要您的root privs持久存在,而不仅仅是存在于打开文件的过程中。
听起来您想让Emacs成为您的窗口管理器。没有它,它已经肿了。 :)