Skip to content

Instantly share code, notes, and snippets.

@Superbil
Last active December 24, 2017 19:16
Show Gist options
  • Save Superbil/e4c9bd46349e3e3603f9e3c9e7b43c4a to your computer and use it in GitHub Desktop.
Save Superbil/e4c9bd46349e3e3603f9e3c9e7b43c4a to your computer and use it in GitHub Desktop.
;; Running on GNU Emacs 26.0.90
Debugger entered--Lisp error: (wrong-type-argument tramp-file-name nil)
signal(wrong-type-argument (tramp-file-name nil))
debugger-may-continue = t
inhibit-redisplay = nil
inhibit-debugger = t
inhibit-changing-match-data = nil
(or (progn (and (memq (car-safe nil) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name nil)))
[no locals]
(progn (or (progn (and (memq (car-safe nil) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name nil))) (nth 2 nil))
[no locals]
(tramp-make-tramp-file-name "sudo" (progn (or (progn (and (memq (car-safe nil) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name nil))) (nth 2 nil)) (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 4 vec)) (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 6 vec)) (format "ssh:%s@%s|" (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 2 vec)) (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 4 vec))))
[no locals]
(let ((vec (tramp-dissect-file-name tempfile))) (tramp-make-tramp-file-name "sudo" (progn (or (progn (and (memq (car-safe nil) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name nil))) (nth 2 nil)) (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 4 vec)) (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 6 vec)) (format "ssh:%s@%s|" (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 2 vec)) (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 4 vec)))))
vec = (tramp-file-name "ssh" "superbil" nil "pi" nil "/etc/." nil)
(if (file-remote-p tempfile) (let ((vec (tramp-dissect-file-name tempfile))) (tramp-make-tramp-file-name "sudo" (progn (or (progn (and (memq (car-safe nil) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name nil))) (nth 2 nil)) (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 4 vec)) (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 6 vec)) (format "ssh:%s@%s|" (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 2 vec)) (progn (or (progn (and (memq (car-safe vec) cl-struct-tramp-file-name-tags) t)) (signal 'wrong-type-argument (list 'tramp-file-name vec))) (nth 4 vec))))) (concat "/sudo:root@localhost:" tempfile))
[no locals]
prepare-tramp-sudo-string("/ssh:superbil@pi:/etc/.")
tempfile = "/ssh:superbil@pi:/etc/."
(find-alternate-file (prepare-tramp-sudo-string my-file-name))
[no locals]
(progn (setq my-file-name (dired-get-file-for-visit)) (find-alternate-file (prepare-tramp-sudo-string my-file-name)))
[no locals]
(if (equal major-mode 'dired-mode) (progn (setq my-file-name (dired-get-file-for-visit)) (find-alternate-file (prepare-tramp-sudo-string my-file-name))) (setq my-file-name (buffer-file-name) position (point)) (find-alternate-file (prepare-tramp-sudo-string my-file-name)) (goto-char position))
[no locals]
(let ((my-file-name) (position)) (if (equal major-mode 'dired-mode) (progn (setq my-file-name (dired-get-file-for-visit)) (find-alternate-file (prepare-tramp-sudo-string my-file-name))) (setq my-file-name (buffer-file-name) position (point)) (find-alternate-file (prepare-tramp-sudo-string my-file-name)) (goto-char position)))
my-file-name = "/ssh:superbil@pi:/etc/."
position = nil
sudo-edit-current-file()
[no locals]
funcall-interactively(sudo-edit-current-file)
call-interactively(sudo-edit-current-file nil nil)
command-execute(sudo-edit-current-file)
(defun prepare-tramp-sudo-string (tempfile)
(if (file-remote-p tempfile)
(let ((vec (tramp-dissect-file-name tempfile)))
(tramp-make-tramp-file-name
"sudo"
(tramp-file-name-user nil)
(tramp-file-name-host vec)
(tramp-file-name-localname vec)
(format "ssh:%s@%s|"
(tramp-file-name-user vec)
(tramp-file-name-host vec))))
(concat "/sudo:root@localhost:" tempfile)))
(defun sudo-edit-current-file ()
(interactive)
(let ((my-file-name) ; fill this with the file to open
(position)) ; if the file is already open save position
(if (equal major-mode 'dired-mode) ; test if we are in dired-mode
(progn
(setq my-file-name (dired-get-file-for-visit))
(find-alternate-file (prepare-tramp-sudo-string my-file-name)))
(setq my-file-name (buffer-file-name) ; hopefully anything else is an already opened file
position (point))
(find-alternate-file (prepare-tramp-sudo-string my-file-name))
(goto-char position))))
@Superbil
Copy link
Author

Superbil commented Dec 24, 2017

好像這樣也行…

(defun prepare-tramp-sudo-string (tempfile)
  (if (version< tramp-version "2.3")
      (if (file-remote-p tempfile)
          (let ((vec (tramp-dissect-file-name tempfile)))
            (tramp-make-tramp-file-name
             "sudo"
             (tramp-file-name-user nil)
             (tramp-file-name-host vec)
             (tramp-file-name-localname vec)
             (format "ssh:%s@%s|"
                     (tramp-file-name-user vec)
                     (tramp-file-name-host vec))))
        (concat "/sudo:root@localhost:" tempfile))
    ;; For new version tramp
    (if (file-remote-p tempfile)
        (let ((vec (tramp-dissect-file-name tempfile)))
          (tramp-make-tramp-file-name
           "sudo"
           nil
           (tramp-file-name-domain vec)
           (tramp-file-name-host vec)
           (tramp-file-name-port vec)
           (tramp-file-name-localname vec)))
      (concat "/sudo:localhost:" tempfile))))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment