在 Emacs 中使用 su/sudo 打开文件
-
01-07-2019 - |
题
假设我想使用以下命令在现有 Emacs 会话中打开文件 su
或者 sudo
, ,而不需要落入外壳并做 sudoedit
或者 sudo emacs
. 。一种方法是
C-x C-f /sudo::/path/to/file
但这需要昂贵的 通过 SSH 往返. 。有更直接的方法吗?
[编辑] @JBB 是对的。我希望能够调用 su
/sudo
保存以及打开。保存时重新授权就可以了(但不理想)。我正在寻找的是以下的变体 find-file
和 save-buffer
可以通过“管道”传输 su
/sudo
.
解决方案
Tramp 的好处是,您只需在打开第一个文件时支付与 SSH 的往返费用。然后,Sudo 会缓存您的凭据,Emacs 会保存一个句柄,以便后续 sudo 打开的文件花费更少的时间。
我也没有找到额外的时间来减轻负担。IMO,它足够快了。
其他提示
流浪汉确实 不是 通过 SSH 往返 sudo,它使用 子外壳. 。请参阅手册: https://www.gnu.org/software/tramp/#Inline-methods
因此,我建议您坚持使用 TRAMP。
如果你使用 helm
, helm-find-files
支持以 root 身份打开文件 C-c r
.
这并不是原始问题的真正答案,但这里有一个帮助函数,可以使 trap/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)))
至少为了节省, sudo-保存包 正是针对此类问题而编写的。
您的示例根本不会启动 ssh,至少在我的 TRAMP 版本(“2.1.13-pre”)中不会启动。查找文件和保存缓冲区都工作得很好。
我建议您使用建议命令。将此函数放入 ~/.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))))
(仅适用于本地。需要通过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))
))
)
)
啊。也许您可以在 Emacs 中打开 shell 并执行 sudo emacs。
问题是您可能不仅仅想打开该文件。您希望以后能够保存它。因此,您需要保留根权限,而不仅仅是为了打开文件而存在。
听起来您希望 Emacs 成为您的窗口管理器。没有那个就够臃肿了。:)