]> code.delx.au - gnu-emacs-elpa/commitdiff
multishell - Change to name preceding path, rather than following.
authorKen Manheimer <ken.manheimer@gmail.com>
Mon, 4 Jan 2016 16:09:19 +0000 (11:09 -0500)
committerKen Manheimer <ken.manheimer@gmail.com>
Mon, 4 Jan 2016 16:09:19 +0000 (11:09 -0500)
* This will be simpler for completion on shell choices, persistence.
* We can make typing of the initial "/" be a cue to delineate a distinct field
  * We may be leverage field distinction for tramp remote path completion
* ... and use editing of the fields for editing of the historical records.

multishell.el

index 2138a07582a3cfd2c70524236a72dc50f8f26486..b9804207dbb7d9472a84bc782eb62772daba9860 100644 (file)
@@ -3,7 +3,7 @@
 ;; Copyright (C) 1999-2016 Free Software Foundation, Inc. and Ken Manheimer
 
 ;; Author: Ken Manheimer <ken.manheimer@gmail.com>
 ;; Copyright (C) 1999-2016 Free Software Foundation, Inc. and Ken Manheimer
 
 ;; Author: Ken Manheimer <ken.manheimer@gmail.com>
-;; Version: 1.0.2
+;; Version: 0
 ;; Created: 1999 -- first public availability
 ;; Keywords: processes
 ;; URL: https://github.com/kenmanheimer/EmacsUtils
 ;; Created: 1999 -- first public availability
 ;; Keywords: processes
 ;; URL: https://github.com/kenmanheimer/EmacsUtils
@@ -18,7 +18,7 @@
 ;; * ... or to a shell buffer if you're not currently in one.
 ;; * Use universal arguments to launch and choose among alternate shell buffers,
 ;; * ... and select which is default.
 ;; * ... or to a shell buffer if you're not currently in one.
 ;; * Use universal arguments to launch and choose among alternate shell buffers,
 ;; * ... and select which is default.
-;; * Prepend a path to a new shell name to launch a shell in that directory,
+;; * Append a path to a new shell name to launch a shell in that directory,
 ;; * ... and use a path with Emacs tramp syntax to launch a remote shell.
 ;;
 ;; Customize-group `multishell` to select and activate a keybinding and set
 ;; * ... and use a path with Emacs tramp syntax to launch a remote shell.
 ;;
 ;; Customize-group `multishell` to select and activate a keybinding and set
@@ -28,7 +28,7 @@
 ;;
 ;;; Change Log:
 ;;
 ;;
 ;;; Change Log:
 ;;
-;; 2016-01-02 Ken Manheimer - initial release
+;; 2016-01-02 Ken Manheimer - working on this in public.
 ;;
 ;;; TODO:
 ;;
 ;;
 ;;; TODO:
 ;;
@@ -146,7 +146,7 @@ Otherwise, open a new window in the current frame.
   "Easily navigate to and within multiple shell buffers, local and remote.
 
 Use universal arguments to launch and choose between alternate
   "Easily navigate to and within multiple shell buffers, local and remote.
 
 Use universal arguments to launch and choose between alternate
-shell buffers and to select which is default.  Prepend a path to
+shell buffers and to select which is default.  Append a path to
 a new shell name to launch a shell in that directory, and use
 Emacs tramp syntax to launch a remote shell.
 
 a new shell name to launch a shell in that directory, and use
 Emacs tramp syntax to launch a remote shell.
 
@@ -199,7 +199,7 @@ single or doubled universal arguments:
 ===== Select starting directory and remote host:
 
 The shell buffer name you give to the prompt for a universal arg
 ===== Select starting directory and remote host:
 
 The shell buffer name you give to the prompt for a universal arg
-can include a preceding path. That will be used for the startup
+can include an appended path. That will be used for the startup
 directory. You can use tramp remote syntax to specify a remote
 shell. If there is an element after a final '/', that's used for
 the buffer name. Otherwise, the host, domain, or path is used.
 directory. You can use tramp remote syntax to specify a remote
 shell. If there is an element after a final '/', that's used for
 the buffer name. Otherwise, the host, domain, or path is used.
@@ -208,7 +208,7 @@ For example:
 
 * Use '/ssh:example.net:/' for a shell buffer on example.net named
   \"example.net\".
 
 * Use '/ssh:example.net:/' for a shell buffer on example.net named
   \"example.net\".
-* '/ssh:example.net|sudo:root@example.net:/\#ex' for a root shell on 
+* '\#ex/ssh:example.net|sudo:root@example.net:/' for a root shell on 
   example.net named \"#ex\"."
 
 ;; I'm leaving the following out of the docstring for now because just
   example.net named \"#ex\"."
 
 ;; I'm leaving the following out of the docstring for now because just
@@ -348,26 +348,35 @@ on empty input."
 (defun multishell:derive-target-name-and-path (path-ish)
   "Give tramp-style PATH-ISH, determine target name and default directory.
 
 (defun multishell:derive-target-name-and-path (path-ish)
   "Give tramp-style PATH-ISH, determine target name and default directory.
 
-The name is the part of the string after the final '/' slash, if
-any. Otherwise, it's either the host-name, domain-name, or local
-host name. The path is everything besides the string following
-the final '/' slash.
+The name is the part of the string before the initial '/' slash,
+if any. Otherwise, it's either the host-name, domain-name, final
+directory name, or local host name. The path is everything
+besides the string before the initial '/' slash.
 
 Return them as a list (name dir), with dir nil if none given."
   (let (name (path "") dir)
     (cond ((string= path-ish "") (setq dir multishell:primary-name))
 
 Return them as a list (name dir), with dir nil if none given."
   (let (name (path "") dir)
     (cond ((string= path-ish "") (setq dir multishell:primary-name))
-          ((string-match "^\\*\\(/.*/\\)\\(.*\\)\\*" path-ish)
-           (setq path (match-string 1 path-ish))
-           (setq name
-                 (multishell:bracket-asterisks
-                  (if (string= (match-string 2 path-ish) "")
-                      (let ((v (tramp-dissect-file-name
-                                path)))
-                        (or (tramp-file-name-host v)
-                            (tramp-file-name-domain v)
-                            (tramp-file-name-localname v)
-                            path))
-                    (match-string 2 path-ish)))))
+          ((string-match "^\\*\\([^/]*\\)\\(/.*/\\)\\(.*\\)\\*" path-ish)
+           ;; We have a path, use it
+           (let ((overt-name (match-string 1 path-ish))
+                 (overt-path (match-string 2 path-ish))
+                 (trailing-name (match-string 3 path-ish)))
+             (if (string= overt-name "") (setq overt-name nil))
+             (if (string= overt-path "") (setq overt-path nil))
+             (if (string= trailing-name "") (setq trailing-name nil))
+             (setq path (concat overt-path trailing-name))
+             (setq name
+                   (multishell:bracket-asterisks
+                    (or overt-name
+                        (if (tramp-file-name-p path)
+                            (let ((vec (tramp-dissect-file-name path)))
+                              (or (tramp-file-name-host vec)
+                                  (tramp-file-name-domain vec)
+                                  (tramp-file-name-localname vec)
+                                  trailing-name
+                                  system-name))
+                          (multishell:unbracket-asterisks
+                           multishell:primary-name)))))))
           (t (setq name (multishell:bracket-asterisks path-ish))))
     (list name path)))
 
           (t (setq name (multishell:bracket-asterisks path-ish))))
     (list name path)))
 
@@ -385,6 +394,7 @@ Return them as a list (name dir), with dir nil if none given."
   (if (string= (substring name -1) "*")
       (setq name (substring name 0 -1)))
   name)
   (if (string= (substring name -1) "*")
       (setq name (substring name 0 -1)))
   name)
+
 (defun multishell:start-shell-in-buffer (buffer-name dir)
   "Ensure a shell is started, using whatever name we're passed."
   ;; We work around shell-mode's bracketing of the buffer name, and do
 (defun multishell:start-shell-in-buffer (buffer-name dir)
   "Ensure a shell is started, using whatever name we're passed."
   ;; We work around shell-mode's bracketing of the buffer name, and do