Use connection-local setting for tramp-remote-path

* doc/misc/tramp.texi (Remote programs): Mention connection-local
settings for `tramp-remote-path'.

* lisp/net/tramp-sh.el (tramp-get-remote-path): Expand connection-local
variables.
This commit is contained in:
Michael Albinus 2019-03-27 16:28:08 +01:00
parent e50bfaaeae
commit 907d11fc53
2 changed files with 113 additions and 77 deletions

View file

@ -1979,6 +1979,39 @@ preserves the path value, which can be used to update
shell supports the login argument @samp{-l}.
@end defopt
Starting with Emacs 26, @code{tramp-remote-path} can be set per host
via connection-local
@ifinfo
variables, @xref{Connection Variables, , , emacs}.
@end ifinfo
@ifnotinfo
variables.
@end ifnotinfo
You could define your own search directories like this:
@lisp
@group
(connection-local-set-profile-variables 'remote-path-with-bin
'((tramp-remote-path . ("~/bin" tramp-default-remote-path))))
@end group
@group
(connection-local-set-profile-variables 'remote-path-with-apply-pub-bin
'((tramp-remote-path . ("/appli/pub/bin" tramp-default-remote-path))))
@end group
@group
(connection-local-set-profiles
'(:application tramp :machine "randomhost") 'remote-path-with-bin)
@end group
@group
(connection-local-set-profiles
'(:application tramp :user "anotheruser" :machine "anotherhost")
'remote-path-with-apply-pub-bin)
@end group
@end lisp
When remote search paths are changed, local @value{tramp} caches must
be recomputed. To force @value{tramp} to recompute afresh, call
@kbd{M-x tramp-cleanup-this-connection @key{RET}} or friends

View file

@ -5314,87 +5314,90 @@ Return ATTR."
(defun tramp-get-remote-path (vec)
"Compile list of remote directories for $PATH.
Nonexistent directories are removed from spec."
(with-tramp-connection-property
;; When `tramp-own-remote-path' is in `tramp-remote-path', we
;; cache the result for the session only. Otherwise, the result
;; is cached persistently.
(if (memq 'tramp-own-remote-path tramp-remote-path)
(tramp-get-connection-process vec)
vec)
"remote-path"
(let* ((remote-path (copy-tree tramp-remote-path))
(elt1 (memq 'tramp-default-remote-path remote-path))
(elt2 (memq 'tramp-own-remote-path remote-path))
(default-remote-path
(when elt1
(or
(tramp-send-command-and-read
vec "echo \\\"`getconf PATH 2>/dev/null`\\\"" 'noerror)
;; Default if "getconf" is not available.
(progn
(tramp-message
vec 3
"`getconf PATH' not successful, using default value \"%s\"."
"/bin:/usr/bin")
"/bin:/usr/bin"))))
(own-remote-path
;; The login shell could return more than just the $PATH
;; string. So we use `tramp-end-of-heredoc' as marker.
(when elt2
(or
(tramp-send-command-and-read
vec
(format
"%s %s %s 'echo %s \\\"$PATH\\\"'"
(tramp-get-method-parameter vec 'tramp-remote-shell)
(mapconcat
#'identity
(tramp-get-method-parameter vec 'tramp-remote-shell-login)
" ")
(mapconcat
#'identity
(tramp-get-method-parameter vec 'tramp-remote-shell-args)
" ")
(tramp-shell-quote-argument tramp-end-of-heredoc))
'noerror (regexp-quote tramp-end-of-heredoc))
(progn
(tramp-message
vec 2 "Could not retrieve `tramp-own-remote-path'")
nil)))))
(with-current-buffer (tramp-get-connection-buffer vec)
;; Expand connection-local variables.
(tramp-set-connection-local-variables vec)
(with-tramp-connection-property
;; When `tramp-own-remote-path' is in `tramp-remote-path', we
;; cache the result for the session only. Otherwise, the
;; result is cached persistently.
(if (memq 'tramp-own-remote-path tramp-remote-path)
(tramp-get-connection-process vec)
vec)
"remote-path"
(let* ((remote-path (copy-tree tramp-remote-path))
(elt1 (memq 'tramp-default-remote-path remote-path))
(elt2 (memq 'tramp-own-remote-path remote-path))
(default-remote-path
(when elt1
(or
(tramp-send-command-and-read
vec "echo \\\"`getconf PATH 2>/dev/null`\\\"" 'noerror)
;; Default if "getconf" is not available.
(progn
(tramp-message
vec 3
"`getconf PATH' not successful, using default value \"%s\"."
"/bin:/usr/bin")
"/bin:/usr/bin"))))
(own-remote-path
;; The login shell could return more than just the $PATH
;; string. So we use `tramp-end-of-heredoc' as marker.
(when elt2
(or
(tramp-send-command-and-read
vec
(format
"%s %s %s 'echo %s \\\"$PATH\\\"'"
(tramp-get-method-parameter vec 'tramp-remote-shell)
(mapconcat
#'identity
(tramp-get-method-parameter vec 'tramp-remote-shell-login)
" ")
(mapconcat
#'identity
(tramp-get-method-parameter vec 'tramp-remote-shell-args)
" ")
(tramp-shell-quote-argument tramp-end-of-heredoc))
'noerror (regexp-quote tramp-end-of-heredoc))
(progn
(tramp-message
vec 2 "Could not retrieve `tramp-own-remote-path'")
nil)))))
;; Replace place holder `tramp-default-remote-path'.
(when elt1
(setcdr elt1
(append
(split-string (or default-remote-path "") ":" 'omit)
(cdr elt1)))
(setq remote-path (delq 'tramp-default-remote-path remote-path)))
;; Replace place holder `tramp-default-remote-path'.
(when elt1
(setcdr elt1
(append
(split-string (or default-remote-path "") ":" 'omit)
(cdr elt1)))
(setq remote-path (delq 'tramp-default-remote-path remote-path)))
;; Replace place holder `tramp-own-remote-path'.
(when elt2
(setcdr elt2
(append
(split-string (or own-remote-path "") ":" 'omit)
(cdr elt2)))
(setq remote-path (delq 'tramp-own-remote-path remote-path)))
;; Replace place holder `tramp-own-remote-path'.
(when elt2
(setcdr elt2
(append
(split-string (or own-remote-path "") ":" 'omit)
(cdr elt2)))
(setq remote-path (delq 'tramp-own-remote-path remote-path)))
;; Remove double entries.
(setq elt1 remote-path)
(while (consp elt1)
(while (and (car elt1) (setq elt2 (member (car elt1) (cdr elt1))))
(setcar elt2 nil))
(setq elt1 (cdr elt1)))
;; Remove double entries.
(setq elt1 remote-path)
(while (consp elt1)
(while (and (car elt1) (setq elt2 (member (car elt1) (cdr elt1))))
(setcar elt2 nil))
(setq elt1 (cdr elt1)))
;; Remove non-existing directories.
(delq
nil
(mapcar
(lambda (x)
(and
(stringp x)
(file-directory-p (tramp-make-tramp-file-name vec x 'nohop))
x))
remote-path)))))
;; Remove non-existing directories.
(delq
nil
(mapcar
(lambda (x)
(and
(stringp x)
(file-directory-p (tramp-make-tramp-file-name vec x 'nohop))
x))
remote-path))))))
(defun tramp-get-remote-locale (vec)
"Determine remote locale, supporting UTF8 if possible."