Update toggle shell to allow multiple shells bound to M-1 to M-9

Derived from torenord/.emacs.d
This commit is contained in:
Lars Tveito 2017-08-01 19:30:20 +02:00
parent 35c45088e7
commit 62a484fbe5

View File

@ -957,19 +957,43 @@
** Shell ** Shell
I use =shell= whenever i want to use access the command line in Emacs. I Inspired by [[https://github.com/torenord/.emacs.d][torenord]], I maintain quick access to shell buffers with bindings
keep a symlink between my =~/.bash_profile= (because I run OS X) and ~M-1~ to ~M-9~. In addition, the ~M-§~ (on an international English
=~/.emacs_bash=, to make the transition between my standard terminal and keyboard) is bound toggle between the last visited shell, and the last
the shell as small as possible. To be able to quickly switch back and visited non-shell buffer. The following functions facilitate this, and are
forth between a shell I make use of this little function. bound in the [[Key bindings]] section.
#+BEGIN_SRC emacs-lisp #+BEGIN_SRC emacs-lisp
(lexical-let ((last-shell ""))
(defun toggle-shell () (defun toggle-shell ()
"Jumps to eshell or back."
(interactive) (interactive)
(if (string= (buffer-name) "*shell*") (cond ((string-match-p "^\\*shell<[1-9][0-9]*>\\*$" (buffer-name))
(switch-to-prev-buffer) (goto-non-shell-buffer))
(shell))) ((get-buffer last-shell) (switch-to-buffer last-shell))
(t (shell (setq last-shell "*shell<1>*")))))
(defun switch-shell (n)
(let ((buffer-name (format "*shell<%d>*" n)))
(setq last-shell buffer-name)
(cond ((get-buffer buffer-name)
(switch-to-buffer buffer-name))
(t (shell buffer-name)
(rename-buffer buffer-name)))))
(defun goto-non-shell-buffer ()
(let* ((r "^\\*shell<[1-9][0-9]*>\\*$")
(shell-buffer-p (lambda (b) (string-match-p r (buffer-name b))))
(non-shells (cl-remove-if shell-buffer-p (buffer-list))))
(when non-shells
(switch-to-buffer (first non-shells))))))
#+END_SRC
Don't query whether or not the ~shell~-buffer should be killed, just kill
it.
#+BEGIN_SRC emacs-lisp
(defadvice shell (after kill-with-no-query nil activate)
(set-process-query-on-exit-flag (get-buffer-process ad-return-value) nil))
#+END_SRC #+END_SRC
I'd like the =C-l= to work more like the standard terminal (which works I'd like the =C-l= to work more like the standard terminal (which works
@ -988,9 +1012,8 @@
(comint-truncate-buffer))) (comint-truncate-buffer)))
#+END_SRC #+END_SRC
Lastly we should bind our functions. The =toggle-shell= should be a The =clear-shell= should only be bound in =comint-mode=, which is a mode
global binding (because we want to be able to switch to a shell from any most shell and REPL's is derived from.
buffer), but the =clear-shell= should only affect =shell-mode=.
#+BEGIN_SRC emacs-lisp #+BEGIN_SRC emacs-lisp
(add-hook 'comint-mode-hook (lambda () (local-set-key (kbd "C-l") 'clear-comint))) (add-hook 'comint-mode-hook (lambda () (local-set-key (kbd "C-l") 'clear-comint)))
@ -1387,10 +1410,13 @@
(define-key custom-bindings-map (kbd "C-c C-=") 'global-scale-up) (define-key custom-bindings-map (kbd "C-c C-=") 'global-scale-up)
(define-key custom-bindings-map (kbd "C-c C-+") 'global-scale-up) (define-key custom-bindings-map (kbd "C-c C-+") 'global-scale-up)
(define-key custom-bindings-map (kbd "C-c C--") 'global-scale-down) (define-key custom-bindings-map (kbd "C-c C--") 'global-scale-down)
(define-key custom-bindings-map (kbd "C-x t") 'toggle-shell)
(define-key custom-bindings-map (kbd "C-c j") 'cycle-spacing-delete-newlines) (define-key custom-bindings-map (kbd "C-c j") 'cycle-spacing-delete-newlines)
(define-key custom-bindings-map (kbd "C-c d") 'duplicate-thing) (define-key custom-bindings-map (kbd "C-c d") 'duplicate-thing)
(define-key custom-bindings-map (kbd "<C-tab>") 'tidy) (define-key custom-bindings-map (kbd "<C-tab>") 'tidy)
(define-key custom-bindings-map (kbd "M-§") 'toggle-shell)
(dolist (n (number-sequence 1 9))
(global-set-key (kbd (concat "M-" (int-to-string n)))
(lambda () (interactive) (switch-shell n))))
(define-key custom-bindings-map (kbd "C-c C-q") (define-key custom-bindings-map (kbd "C-c C-q")
'(lambda () '(lambda ()
(interactive) (interactive)