假设我想使用
su
或 sudo
在现有 Emacs 会话中打开文件,而不需要进入 shell 并执行 sudoedit
或 sudo emacs
。一种方法是
C-x C-f /sudo::/path/to/file
但这需要通过 SSH 进行昂贵的往返。有没有更直接的方法?
[编辑] @JBB 是对的。我希望能够调用su
/
sudo
来保存和打开。保存时重新授权就可以了(但不理想)。我正在寻找的是
find-file
和
save-buffer
的变体,可以通过
su
/
sudo
“管道”。
我也没有找到额外的时间来减轻负担。 IMO,它足够快了。
helm
,
helm-find-files
支持使用
C-c r
以 root 身份打开文件。
(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)))
(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))))
稍微扩展一下伯顿的答案:
(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 成为您的窗口管理器。没有那个就够臃肿了。 :)
sudo edit
功能对此非常有用。打开文件后,按
s-e
即可使用 sudo 访问权限来编辑/保存文件。 Bozhidar Batsov 解释了三种使用升级权限打开文件的简单方法。我认为最优雅的是下面的。我只是做了一个小小的修改,使其更兼容 Emacs 默认生态系统,以便它可以自动完成 Vertico 和其他补全平台:
(defun er-sudo-edit (&optional arg)
"Edit currently visited file as root.
With a prefix ARG prompt for a file to visit.
Will also prompt for a file to visit if current
buffer is not visiting a file."
(interactive "P")
(if (or arg (not buffer-file-name))
(find-file (concat "/sudo:root@localhost:"
(read-file-name "Find file(as root): ")))
(find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))