Subject: bug#65356: closed (Re: bug#65356: 30.0.50; [wishlist] Support Tramp method, user name and host name completion in eshell)

From: [email-masked] (GNU bug Tracking System)
Date: Wed, 23 Aug 2023 07:57:02 +0000

Your bug report

#65356: 30.0.50; [wishlist] Support Tramp method, user name and host name completion in eshell

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
65356: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=65356
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#65356: 30.0.50; [wishlist] Support Tramp method, user name and host name completion in eshell
From: Michael Albinus <[email-masked]>
To: Jim Porter <[email-masked]>
Cc: [email-masked], Stefan Monnier <[email-masked]>
Date: Wed, 23 Aug 2023 09:56:32 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Version: 30.1

Jim Porter <[email-masked]> writes:

Hi Jim,

> Let's just go with the change to add 'pcomplete-remote-file-ignore'
> for now. I'll have to think more about how Eshell can selectively
> ignore remote files correctly in all cases; there are a bunch of areas
> where Eshell could be smarter about completion already, and I have the
> feeling they'll conflict with each other if we don't plan this out
> carefully...

Agreed. Pushed to master, I'm closing the bug.

Best regards, Michael.

Subject: 30.0.50; [wishlist] Support Tramp method, user name and host name completion in eshell
From: Michael Albinus <[email-masked]>
To: [email-masked]
Date: Thu, 17 Aug 2023 20:01:51 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

When we open a file with find-file, the minibuffer offers method, user
name and host name completion for remote files. That is, after typing
"C-x C-f /ss TAB" we're offered with the completions "ssh:", "sshfs:"
and "sshx:". Same for user name and host name.

In eshell, this feature does not exist. I would like if I could type
"cd /ss TAB" and could see the same offering of "ssh:", "sshfs:" and
"sshx:". Same for user name and host name.

The appended patch does this for me. I have no idea how good it fits
into the eshell machinery, for example whether there are problems with
the em-elecslash.el module. Comments welcome!

Disclaimer: The idea has appeared on
<https://emacs.stackexchange.com/questions/78479/can-eshell-provide-tramp-auto-completion>.

Best regards, Michael.

In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
 3.24.38, cairo version 1.17.8) of 2023-08-15 built on gandalf
Repository revision: 5c101b1adac2b4f3cc4e08a6492b406952c529f3
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12201009
System Description: Fedora Linux 38 (Workstation Edition)

Configured using:
 'configure --with-tree-sitter'

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
LIBOTF LIBSELINUX LIBXML2 M17N_FLT MODULES NOTIFY INOTIFY PDUMPER PNG
RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER
X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  value of $XMODIFIERS: @im=ibus
  locale-coding-system: utf-8

Major mode: ELisp/l

Minor modes in effect:
  debbugs-browse-mode: t
  bug-reference-prog-mode: t
  display-time-mode: t
  delete-selection-mode: t
  icomplete-mode: t
  global-goto-address-mode: t
  goto-address-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/home/albinus/src/elpa/packages/debbugs/debbugs hides /home/albinus/.emacs.d/elpa/debbugs-0.36/debbugs
/home/albinus/src/elpa/packages/debbugs/debbugs-org hides /home/albinus/.emacs.d/elpa/debbugs-0.36/debbugs-org
/home/albinus/src/elpa/packages/debbugs/debbugs-gnu hides /home/albinus/.emacs.d/elpa/debbugs-0.36/debbugs-gnu
/home/albinus/src/elpa/packages/debbugs/debbugs-guix hides /home/albinus/.emacs.d/elpa/debbugs-0.36/debbugs-guix
/home/albinus/src/elpa/packages/debbugs/debbugs-browse hides /home/albinus/.emacs.d/elpa/debbugs-0.36/debbugs-browse
/home/albinus/src/elpa/packages/debbugs/debbugs-pkg hides /home/albinus/.emacs.d/elpa/debbugs-0.36/debbugs-pkg
/home/albinus/src/elpa/packages/debbugs/debbugs-autoloads hides /home/albinus/.emacs.d/elpa/debbugs-0.36/debbugs-autoloads
/home/albinus/src/elpa/packages/debbugs/debbugs-compat hides /home/albinus/.emacs.d/elpa/debbugs-0.36/debbugs-compat
~/lisp/telepathy hides /home/albinus/.emacs.d/elpa/telepathy-20131209.1258/telepathy
/home/albinus/src/elpa/packages/tramp-theme/tramp-theme-autoloads hides /home/albinus/.emacs.d/elpa/tramp-theme-0.2/tramp-theme-autoloads
/home/albinus/src/elpa/packages/tramp-theme/tramp-theme hides /home/albinus/.emacs.d/elpa/tramp-theme-0.2/tramp-theme
/home/albinus/src/elpa/packages/tramp-theme/tramp-theme-pkg hides /home/albinus/.emacs.d/elpa/tramp-theme-0.2/tramp-theme-pkg
/home/albinus/.emacs.d/elpa/hydra-0.15.0/lv hides /home/albinus/.emacs.d/elpa/lv-0.15.0/lv
/home/albinus/src/tramp/lisp/tramp-sh hides /usr/local/share/emacs/site-lisp/tramp-sh
/home/albinus/src/tramp/lisp/tramp-cmds hides /usr/local/share/emacs/site-lisp/tramp-cmds
/home/albinus/src/tramp/lisp/tramp-gvfs hides /usr/local/share/emacs/site-lisp/tramp-gvfs
/home/albinus/src/tramp/lisp/tramp-ftp hides /usr/local/share/emacs/site-lisp/tramp-ftp
/home/albinus/src/tramp/lisp/tramp-crypt hides /usr/local/share/emacs/site-lisp/tramp-crypt
/home/albinus/src/tramp/lisp/tramp-adb hides /usr/local/share/emacs/site-lisp/tramp-adb
/home/albinus/src/tramp/lisp/tramp hides /usr/local/share/emacs/site-lisp/tramp
/home/albinus/src/tramp/lisp/tramp-cache hides /usr/local/share/emacs/site-lisp/tramp-cache
/home/albinus/src/tramp/lisp/tramp-rclone hides /usr/local/share/emacs/site-lisp/tramp-rclone
/home/albinus/src/tramp/lisp/tramp-compat hides /usr/local/share/emacs/site-lisp/tramp-compat
/home/albinus/src/tramp/lisp/tramp-integration hides /usr/local/share/emacs/site-lisp/tramp-integration
/home/albinus/src/tramp/lisp/tramp-archive hides /usr/local/share/emacs/site-lisp/tramp-archive
/home/albinus/src/tramp/lisp/tramp-sudoedit hides /usr/local/share/emacs/site-lisp/tramp-sudoedit
/home/albinus/src/tramp/lisp/tramp-loaddefs hides /usr/local/share/emacs/site-lisp/tramp-loaddefs
/home/albinus/src/tramp/lisp/tramp-uu hides /usr/local/share/emacs/site-lisp/tramp-uu
/home/albinus/src/tramp/lisp/tramp-smb hides /usr/local/share/emacs/site-lisp/tramp-smb
/home/albinus/src/tramp/lisp/trampver hides /usr/local/share/emacs/site-lisp/trampver
/home/albinus/.emacs.d/elpa/transient-20230602.2121/transient hides /usr/local/share/emacs/30.0.50/lisp/transient
~/lisp/dbus hides /usr/local/share/emacs/30.0.50/lisp/net/dbus
/home/albinus/src/tramp/lisp/tramp-sh hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-sh
/home/albinus/src/tramp/lisp/tramp-fuse hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-fuse
/home/albinus/src/tramp/lisp/tramp-loaddefs hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-loaddefs
/home/albinus/src/tramp/lisp/tramp-ftp hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-ftp
/home/albinus/src/tramp/lisp/tramp hides /usr/local/share/emacs/30.0.50/lisp/net/tramp
/home/albinus/src/tramp/lisp/tramp-cache hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-cache
/home/albinus/src/tramp/lisp/tramp-uu hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-uu
/home/albinus/src/tramp/lisp/tramp-rclone hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-rclone
/home/albinus/src/tramp/lisp/tramp-integration hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-integration
/home/albinus/src/tramp/lisp/tramp-archive hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-archive
/home/albinus/src/tramp/lisp/tramp-adb hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-adb
/home/albinus/src/tramp/lisp/tramp-cmds hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-cmds
/home/albinus/src/tramp/lisp/tramp-compat hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-compat
/home/albinus/src/tramp/lisp/tramp-sudoedit hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-sudoedit
/home/albinus/src/tramp/lisp/tramp-container hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-container
/home/albinus/src/tramp/lisp/tramp-gvfs hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-gvfs
/home/albinus/src/tramp/lisp/tramp-crypt hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-crypt
/home/albinus/src/tramp/lisp/tramp-message hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-message
/home/albinus/src/tramp/lisp/tramp-smb hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-smb
/home/albinus/src/tramp/lisp/trampver hides /usr/local/share/emacs/30.0.50/lisp/net/trampver
/home/albinus/src/tramp/lisp/tramp-sshfs hides /usr/local/share/emacs/30.0.50/lisp/net/tramp-sshfs

Features:
(shadow sort mail-extr warnings emacsbug message yank-media puny rfc822
mml mml-sec epa derived epg rfc6068 epg-config gnus-util mm-decode
mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader
sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils
cl-print cl-extra find-func shortdoc em-xtra em-unix em-tramp em-term
term disp-table ehelp em-script em-prompt em-pred em-ls em-hist em-glob
em-cmpl em-dirs em-basic em-banner em-alias esh-mode esh-var eshell
esh-cmd generator esh-ext esh-opt esh-proc esh-io esh-arg esh-module
esh-groups esh-util help-fns radix-tree mule-util display-line-numbers
pulse color find-dired xref project grep compile text-property-search
misearch multi-isearch ediff-vers ediff ediff-merg ediff-mult ediff-wind
ediff-diff ediff-help ediff-init ediff-util vc-git diff-mode easy-mmode
debbugs-browse bug-reference dired-aux face-remap ob-shell ob ob-tangle
ol org-src ob-ref ob-lob ob-table ob-exp ob-comint ob-core org-cycle
org-fold org-fold-core ob-eval org-keys oc org-compat org-version
org-macs vc vc-dispatcher time tramp-cache time-stamp tramp-sh lxc-tramp
lxd-tramp tramp trampver tramp-integration files-x tramp-message
help-mode tramp-compat xdg shell pcomplete comint ansi-osc ring
parse-time iso8601 time-date format-spec ansi-color tramp-loaddefs rx
delsel ido jka-compr icomplete cus-edit pp cus-load icons wid-edit dired
dired-loaddefs goto-addr thingatpt alert-autoloads
android-mode-autoloads auth-source-gopass-autoloads
auth-source-keytar-autoloads auth-source-kwallet-autoloads
auth-source-xoauth2-autoloads auto-sudoedit-autoloads
auto-virtualenv-autoloads auto-virtualenvwrapper-autoloads
clang-format-autoloads company-shell-autoloads company-autoloads
counsel-toki-autoloads counsel-tramp-autoloads counsel-autoloads
dbus-codegen-autoloads debbugs-autoloads dired-du-autoloads
dired-rsync-autoloads direnv-autoloads disk-usage-autoloads
dockerfile-mode-autoloads ednc-autoloads el-get-autoloads
envrc-autoloads exec-path-from-shell-autoloads fontaine-autoloads
forge-autoloads closql-autoloads emacsql-autoloads
friendly-tramp-path-autoloads ggtags-autoloads ghub-autoloads
gited-autoloads gitlab-ci-mode-flycheck-autoloads
gitlab-ci-mode-autoloads flycheck-autoloads gntp-autoloads
gnus-desktop-notify-autoloads helm-gitlab-autoloads
helm-projectile-autoloads helm-autoloads helm-core-autoloads
async-autoloads ibuffer-tramp-autoloads inheritenv-autoloads
ivy-gitlab-autoloads gitlab-autoloads jarchive-autoloads
journalctl-mode-autoloads keepass-mode-autoloads keytar-autoloads
kubel-autoloads kubernetes-autoloads log4e-autoloads lsp-java-autoloads
dap-mode-autoloads lsp-docker-autoloads bui-autoloads
lsp-treemacs-autoloads lsp-mode-autoloads lxc-tramp-autoloads
lxd-tramp-autoloads magit-filenotify-autoloads magit-autoloads pcase
git-commit-autoloads magit-popup-autoloads magit-section-autoloads
marcopolo-autoloads nexus-autoloads nnir-est-autoloads oauth2-autoloads
ob-restclient-autoloads orderless-autoloads org-tree-slide-autoloads
pkg-info-autoloads epl-autoloads popup-autoloads projectile-autoloads
promise-autoloads pyenv-mode-autoloads pylint-autoloads
python-environment-autoloads deferred-autoloads pythonic-autoloads
f-autoloads pyvenv-autoloads recentf-remove-sudo-tramp-prefix-autoloads
relint-autoloads request-autoloads restclient-test-autoloads
restclient-autoloads s3ed-autoloads finder-inf slime-autoloads
macrostep-autoloads spinner-autoloads ssh-deploy-autoloads
swiper-autoloads ivy-autoloads sx-autoloads markdown-mode-autoloads
telepathy-autoloads tramp-theme-autoloads transient-dwim-autoloads
transient-autoloads treemacs-autoloads cfrs-autoloads posframe-autoloads
ht-autoloads pfuture-autoloads ace-window-autoloads avy-autoloads
treepy-autoloads urgrep-autoloads uuid-autoloads vdiff-autoloads
hydra-autoloads lv-autoloads vertico-autoloads virtualenv-autoloads
virtualenvwrapper-autoloads s-autoloads dash-autoloads
web-server-autoloads with-editor-autoloads info compat-autoloads
xr-autoloads yaml-autoloads yaml-mode-autoloads package browse-url url
url-proxy url-privacy url-expand url-methods url-history url-cookie
generate-lisp-file url-domsuf url-util mailcap url-handlers url-parse
auth-source cl-seq eieio eieio-core cl-macs password-cache json subr-x
map byte-opt gv bytecomp byte-compile url-vars cl-loaddefs cl-lib rmc
iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook
vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win
term/common-win x-dnd touch-screen tool-bar dnd fontset image regexp-opt
fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode
register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select
scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors
frame minibuffer nadvice seq simple cl-generic indonesian philippine
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite emoji-zwj charscript
charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp
files window text-properties overlay sha1 md5 base64 format env
code-pages mule custom widget keymap hashtable-print-readable backquote
threads dbusbind inotify dynamic-setting system-font-setting
font-render-setting cairo gtk x-toolkit xinput2 x multi-tty move-toolbar
make-network-process emacs)

Memory information:
((conses 16 234759 52920) (symbols 48 19742 1) (strings 32 66564 4085)
 (string-bytes 1 2281459) (vectors 16 40066)
 (vector-slots 8 1166864 141729) (floats 8 244 2758)
 (intervals 56 11249 545) (buffers 992 27))

diff --git a/lisp/eshell/em-tramp.el b/lisp/eshell/em-tramp.el
index 94eb9797033..c90e689f6de 100644
--- a/lisp/eshell/em-tramp.el
+++ b/lisp/eshell/em-tramp.el
@@ -51,11 +51,23 @@ eshell-tramp-initialize
   "Initialize the Tramp-using commands code."
   (when (eshell-using-module 'eshell-cmpl)
     (add-hook 'pcomplete-try-first-hook
-	      'eshell-complete-host-reference nil t))
+              'eshell-complete-partial-tramp-file-name))
   (setq-local eshell-complex-commands
               (append '("su" "sudo" "doas")
                       eshell-complex-commands)))

+(defun eshell-complete-partial-tramp-file-name ()
+  "Complete a partial Tramp file name (method, user name, hostname)."
+  (let ((arg (pcomplete-actual-arg))
+        (non-essential t)
+        (minibuffer-completing-file-name t))
+    (when (string-match tramp-completion-file-name-regexp arg)
+      (setq pcomplete-stub (substring arg (length tramp-prefix-format))
+            pcomplete-last-completion-raw t
+            pcomplete-termination-string "")
+      (throw 'pcomplete-completions
+             (file-name-all-completions pcomplete-stub tramp-prefix-format)))))
+
 (autoload 'eshell-parse-command "esh-cmd")

 (defun eshell/su (&rest args)