假设我想使用以下命令在现有 Emacs 会话中打开文件 su 或者 sudo, ,而不需要落入外壳并做 sudoedit 或者 sudo emacs. 。一种方法是

C-x C-f /sudo::/path/to/file

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

[编辑] @JBB 是对的。我希望能够调用 su/sudo 保存以及打开。保存时重新授权就可以了(但不理想)。我正在寻找的是以下的变体 find-filesave-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 成为您的窗口管理器。没有那个就够臃肿了。:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top