シェルにドロップダウンしてsu
またはSudo emacs
を実行せずに、Sudo
またはsudoedit
を使用して、既存の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はnotSSH経由で往復Sudoを行い、subshellを使用します。マニュアルを参照してください: https://www.gnu.org/software/tramp/#Inline-methods
したがって、TRAMPを使用することをお勧めします。
helm
を使用する場合、helm-find-files
はC-c r
でルートとしてファイルを開くことをサポートします。
元の質問への答えではありませんが、tramp/Sudoルーティングを少し簡単にするヘルパー関数を次に示します。
[.____。 .____。](let((tramp-file-name(concat "/ Sudo ::"(expand-file-name file-name)))) (find-file tramp-file-name)) )
少なくとも保存のために、 Sudo-save package はまさにその種の問題のために書かれました。
あなたの例は、少なくとも私のバージョンのTRAMP( "2.1.13-pre")では、sshをまったく起動しません。 find-fileとsave-bufferの両方がうまく機能します。
アドバイスコマンドを使用することをお勧めします。この関数を〜/ .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でシェルを開き、Sudo emacsを実行できます。
問題は、おそらくファイルを開くだけではないということです。後で保存できるようにします。したがって、ファイルを開くためだけに存在するのではなく、ルート権限を保持する必要があります。
Emacsをウィンドウマネージャーにしたいようです。それなしでは十分に肥大化しています。 :)