Changes to ebb/flow for a better UI
This commit is contained in:
parent
1e2f016c5f
commit
549887bce5
1 changed files with 68 additions and 22 deletions
|
@ -402,7 +402,8 @@ This buffer has a minor-mode that binds ~C-c C-q~ to close the window and return
|
||||||
(defun ha-eshell-ebbflow-return ()
|
(defun ha-eshell-ebbflow-return ()
|
||||||
"Close the ebb-flow window and return to Eshell session."
|
"Close the ebb-flow window and return to Eshell session."
|
||||||
(interactive)
|
(interactive)
|
||||||
(if (boundp 'ha-eshell-ebbflow-return-buffer)
|
(if (and (boundp 'ha-eshell-ebbflow-return-buffer)
|
||||||
|
(bufferp 'ha-eshell-ebbflow-return-buffer))
|
||||||
(pop-to-buffer ha-eshell-ebbflow-return-buffer)
|
(pop-to-buffer ha-eshell-ebbflow-return-buffer)
|
||||||
(bury-buffer)))
|
(bury-buffer)))
|
||||||
|
|
||||||
|
@ -415,7 +416,7 @@ This buffer has a minor-mode that binds ~C-c C-q~ to close the window and return
|
||||||
#+end_src
|
#+end_src
|
||||||
Since I use Evil, I also add ~Q~ to call this function:
|
Since I use Evil, I also add ~Q~ to call this function:
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(evil-define-key 'normal ebbflow-mode-map (kbd "Q") 'ha-eshell-ebbflow-return)
|
(evil-define-key 'normal ebbflow-mode-map "Q" 'ha-eshell-ebbflow-return)
|
||||||
#+end_src
|
#+end_src
|
||||||
*** flow (or Buffer Cat)
|
*** flow (or Buffer Cat)
|
||||||
Eshell can send the output of a command sequence to a buffer:
|
Eshell can send the output of a command sequence to a buffer:
|
||||||
|
@ -492,6 +493,9 @@ Straight-forward to acquire the contents of a buffer :
|
||||||
(defalias 'eshell/bcat 'eshell/flow)
|
(defalias 'eshell/bcat 'eshell/flow)
|
||||||
#+end_src
|
#+end_src
|
||||||
*** ebb: Bump Data to a Buffer
|
*** ebb: Bump Data to a Buffer
|
||||||
|
The =ebb= function puts content /into/ the /ebbflow buffer/. Any content given to it on the command line is placed into the buffer, for instance:
|
||||||
|
- =ebb foobar= :: replaces the contents of the buffer with the text, =foobar=
|
||||||
|
- =ebb -p foobar= :: adds the text at the beginning
|
||||||
We have three separate use-cases:
|
We have three separate use-cases:
|
||||||
1. Execute a command, inserting the output into the buffer (good if we know the output will be long, complicated, or needing manipulation)
|
1. Execute a command, inserting the output into the buffer (good if we know the output will be long, complicated, or needing manipulation)
|
||||||
2. Insert one or more files into the buffer (this assumes the files are data)
|
2. Insert one or more files into the buffer (this assumes the files are data)
|
||||||
|
@ -499,17 +503,22 @@ We have three separate use-cases:
|
||||||
|
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(defun eshell/ebb (&rest args)
|
(defun eshell/ebb (&rest args)
|
||||||
"Run command with output into a buffer, or output of last command.
|
"Insert text content into *eshell-edit* buffer, or if not text is given, the output of last command.
|
||||||
Usage: ebb [OPTION] [COMMAND] [FILE ...]
|
Usage: ebb [OPTION] [text content]
|
||||||
-h, --help show this usage screen
|
-h, --help show this usage screen
|
||||||
-a, --append add command output to the *eshell-edit* buffer
|
-m, --mode specify the major-mode for the *eshell-edit* buffer, e.g. json
|
||||||
-p, --prepend add command output to the end of *eshell-edit* buffer
|
-n, --newline separate the text contents by newlines (this is default)
|
||||||
-i, --insert add command output to *eshell-edit* at point"
|
-s, --spaces separate the text contents by spaces, instead of newlines
|
||||||
(let* ((options (eshell-getopts '((:name insert :short "i" :long "insert")
|
-b, --begin add text content to the beginning of the *eshell-edit* buffer
|
||||||
(:name append :short "a" :long "append")
|
-e, --end add text content to the end of *eshell-edit* buffer
|
||||||
(:name prepend :short "p" :long "prepend")
|
-i, --insert add text content to *eshell-edit* at point"
|
||||||
(:name mode :short "m" :long "mode" :parameter string)
|
(let* ((options (eshell-getopts '((:name insert :short "i" :long "insert")
|
||||||
(:name help :short "h" :long "help"
|
(:name append :short "e" :long "end")
|
||||||
|
(:name prepend :short "b" :long "begin")
|
||||||
|
(:name newline :short "n" :long "newline")
|
||||||
|
(:name spaces :short "s" :long "spaces")
|
||||||
|
(:name mode-option :short "m" :long "mode" :parameter string)
|
||||||
|
(:name help :short "h" :long "help"
|
||||||
:help eshell/ebb))
|
:help eshell/ebb))
|
||||||
args))
|
args))
|
||||||
(location (cond
|
(location (cond
|
||||||
|
@ -518,19 +527,19 @@ We have three separate use-cases:
|
||||||
((gethash 'prepend options) :prepend)
|
((gethash 'prepend options) :prepend)
|
||||||
(t :replace)))
|
(t :replace)))
|
||||||
(params (gethash 'parameters options)))
|
(params (gethash 'parameters options)))
|
||||||
(cond
|
|
||||||
((seq-empty-p params) (ha-eshell-ebb-output location))
|
(if (seq-empty-p params)
|
||||||
((file-exists-p (car params)) (ha-eshell-ebb-files location params))
|
((ha-eshell-ebb-output location))
|
||||||
(t (ha-eshell-ebb-command location params)))
|
(ha-eshell-ebb-string location (gethash 'spaces options) params))
|
||||||
|
|
||||||
;; At this point, we are in the `ha-eshell-ebbflow-buffername', and
|
;; At this point, we are in the `ha-eshell-ebbflow-buffername', and
|
||||||
;; the buffer contains the inserted data. Did we specify a major-mode?
|
;; the buffer contains the inserted data. Did we specify a major-mode?
|
||||||
(let ((mode (gethash 'mode options)))
|
(when-let ((mode-option (gethash 'mode-option options)))
|
||||||
(if (s-starts-with? "js" mode)
|
(if (s-starts-with? "js" mode-option)
|
||||||
(js-json-mode) ; Or should we just go to json-ts-mode?
|
(js-json-mode) ; Or should we just go to json-ts-mode?
|
||||||
(funcall (concat mode "-mode"))))
|
(funcall (intern (concat mode-option "-mode")))))
|
||||||
|
|
||||||
;; Flip on the minor mode so we can close the window later on:
|
;; Flip on the minor mode-option so we can close the window later on:
|
||||||
(ebbflow-mode +1)
|
(ebbflow-mode +1)
|
||||||
(goto-char (point-min)))
|
(goto-char (point-min)))
|
||||||
|
|
||||||
|
@ -558,6 +567,19 @@ Each of the use-case functions described needs to switch to the =*eshell-edit*=
|
||||||
(:replace (delete-region (point-min) (point-max))))))
|
(:replace (delete-region (point-min) (point-max))))))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
One way to call =ebb= is with a command wrapped in braces, e.g. =ebb { ls -1 }=, which calls this function, as the output from the ={ … }= /sub-shell/ is passed as arguments to the =ebb= command, and appears as =command-results=:
|
||||||
|
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(defun ha-eshell-ebb-string (insert-location space-separator-p command-results)
|
||||||
|
"Insert the COMMAND-RESULTS into the `ha-eshell-ebbflow-buffername`.
|
||||||
|
Contents are placed based on INSERT-LOCATION and, if given, separated
|
||||||
|
by SEPARATOR (which defaults to a space)."
|
||||||
|
(let* ((sep (if space-separator-p " " "\n"))
|
||||||
|
(str (string-join (-flatten command-results) sep)))
|
||||||
|
(ha-eshell-ebb-switch-to-buffer insert-location)
|
||||||
|
(insert str)))
|
||||||
|
#+end_src
|
||||||
|
|
||||||
Command string passed to [[help:eshell-command][eshell-command]]:
|
Command string passed to [[help:eshell-command][eshell-command]]:
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(defun ha-eshell-ebb-command (insert-location command-parts)
|
(defun ha-eshell-ebb-command (insert-location command-parts)
|
||||||
|
@ -1353,7 +1375,31 @@ Whenever I open a shell, I instinctively type =ls= … so why not do that automa
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(defun ha-eshell-banner ()
|
(defun ha-eshell-banner ()
|
||||||
"Return a string containing the files in the current directory."
|
"Return a string containing the files in the current directory."
|
||||||
(eshell/lsd))
|
(let ((fg (face-attribute 'default :background))
|
||||||
|
(bg (face-attribute 'default :foreground))
|
||||||
|
(bg "#c09644")
|
||||||
|
(dd (thread-last default-directory
|
||||||
|
(replace-regexp-in-string (getenv "HOME") "~")))
|
||||||
|
(gs (thread-last "git status --short --branch --ahead-behind 2>/dev/null"
|
||||||
|
(shell-command-to-list)
|
||||||
|
(first)
|
||||||
|
(replace-regexp-in-string
|
||||||
|
(rx "## "
|
||||||
|
(group (zero-or-more not-newline))
|
||||||
|
(zero-or-more anychar))
|
||||||
|
"\\1")
|
||||||
|
(replace-regexp-in-string
|
||||||
|
(rx "...") " → "))))
|
||||||
|
(ignore-errors
|
||||||
|
(concat
|
||||||
|
;; Line 1
|
||||||
|
(propertize
|
||||||
|
(format " %s • ⑆ %s " dd gs)
|
||||||
|
'face `(:background ,bg :foreground ,fg))
|
||||||
|
"\n"
|
||||||
|
;; Line 2
|
||||||
|
(ha-dad-joke)
|
||||||
|
"\n\n"))))
|
||||||
#+end_src
|
#+end_src
|
||||||
* Shell Windows
|
* Shell Windows
|
||||||
Now that I often need to pop into remote systems to run a shell or commands, I create helper functions to create those buffer windows. Each buffer begins with =eshell=: allowing me to have more than one eshells, typically, one per project.
|
Now that I often need to pop into remote systems to run a shell or commands, I create helper functions to create those buffer windows. Each buffer begins with =eshell=: allowing me to have more than one eshells, typically, one per project.
|
||||||
|
|
Loading…
Reference in a new issue