From 68e56025bcb9c1fc14ddc840e103806b104db4e9 Mon Sep 17 00:00:00 2001 From: Ralf Beckmann Date: Sun, 3 Nov 2019 02:00:04 +0100 Subject: [PATCH 1/3] Fixed sudo edit on remote files The previous implementation failed, if the remote user was given only implicitly. --- core/autoload/files.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index 7365641f6..9555efe89 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -319,9 +319,14 @@ file if it exists, without confirmation." (interactive "FOpen file as root: ") (when (file-writable-p file) (user-error "File is user writeable, aborting sudo")) - (find-file (if (file-remote-p file) - (concat "/" (file-remote-p file 'method) ":" (file-remote-p file 'user) "@" (file-remote-p file 'host) "|sudo:root@" (file-remote-p file 'host) ":" (file-remote-p file 'localname)) - (concat "/sudo:root@localhost:" file)))) + (let* ((host (or (file-remote-p file 'host) "localhost")) + (user-host (if-let (( user (file-remote-p file 'user))) + (concat user "@" host) + host)) + (hop1 (when (file-remote-p file) (concat "/" (file-remote-p file 'method) ":" user-host))) + (sep (if hop1 "|" "/")) + (hop2 (concat "sudo:root@" host ":" (or (file-remote-p file 'localname) file)))) + (find-file (concat hop1 sep hop2)))) ;;;###autoload (defun doom/sudo-this-file () From 7a810d53a0d27467e7ae69f0c9453fe065963c79 Mon Sep 17 00:00:00 2001 From: Ralf Beckmann Date: Sun, 3 Nov 2019 14:25:10 +0100 Subject: [PATCH 2/3] Consider current buffer's file when sudo-editing If doom/sudo-find-file is invoked with a file that is equal to the current buffer's file, kill that buffer since it is probably not needed anymore. --- core/autoload/files.el | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index 9555efe89..9a9b21bfc 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -317,16 +317,19 @@ file if it exists, without confirmation." (defun doom/sudo-find-file (file) "Open FILE as root." (interactive "FOpen file as root: ") - (when (file-writable-p file) - (user-error "File is user writeable, aborting sudo")) (let* ((host (or (file-remote-p file 'host) "localhost")) - (user-host (if-let (( user (file-remote-p file 'user))) - (concat user "@" host) - host)) - (hop1 (when (file-remote-p file) (concat "/" (file-remote-p file 'method) ":" user-host))) - (sep (if hop1 "|" "/")) - (hop2 (concat "sudo:root@" host ":" (or (file-remote-p file 'localname) file)))) - (find-file (concat hop1 sep hop2)))) + (f (concat "/" (when (file-remote-p file) + (concat (file-remote-p file 'method) ":" + (if-let (user (file-remote-p file 'user)) + (concat user "@" host) + host) + "|")) + "sudo:root@" host + ":" (or (file-remote-p file 'localname) + file)))) + (if (and buffer-file-name (equal file (file-truename buffer-file-name))) + (find-alternate-file f) + (find-file f)))) ;;;###autoload (defun doom/sudo-this-file () From 12fcd3857dadc93ea2ae35d31cd22d62ab645f12 Mon Sep 17 00:00:00 2001 From: Ralf Beckmann Date: Thu, 14 Nov 2019 20:40:40 +0100 Subject: [PATCH 3/3] Avoid superfluous buffers when sudo-editing When invoking 'doom/sudo-this-file', do not keep the old buffer around, since it is most likely no longer needed. --- core/autoload/files.el | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index 9a9b21bfc..d3e183d58 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -313,26 +313,26 @@ file if it exists, without confirmation." (`aborted (message "Aborted")) (_ t))) +(defun doom--sudo-file (file) + (let ((host (or (file-remote-p file 'host) "localhost"))) + (concat "/" (when (file-remote-p file) + (concat (file-remote-p file 'method) ":" + (if-let (user (file-remote-p file 'user)) + (concat user "@" host) + host) + "|")) + "sudo:root@" host + ":" (or (file-remote-p file 'localname) + file)))) + ;;;###autoload (defun doom/sudo-find-file (file) "Open FILE as root." (interactive "FOpen file as root: ") - (let* ((host (or (file-remote-p file 'host) "localhost")) - (f (concat "/" (when (file-remote-p file) - (concat (file-remote-p file 'method) ":" - (if-let (user (file-remote-p file 'user)) - (concat user "@" host) - host) - "|")) - "sudo:root@" host - ":" (or (file-remote-p file 'localname) - file)))) - (if (and buffer-file-name (equal file (file-truename buffer-file-name))) - (find-alternate-file f) - (find-file f)))) + (find-file (doom--sudo-file file))) ;;;###autoload (defun doom/sudo-this-file () "Open the current file as root." (interactive) - (doom/sudo-find-file (file-truename buffer-file-name))) + (find-alternate-file (doom--sudo-file buffer-file-name)))