mirror of
https://github.com/larstvei/dot-emacs.git
synced 2024-11-26 07:28:31 +00:00
Update toggle shell to allow multiple shells bound to M-1 to M-9
Derived from torenord/.emacs.d
This commit is contained in:
parent
35c45088e7
commit
62a484fbe5
56
init.org
56
init.org
@ -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
|
||||||
(defun toggle-shell ()
|
(lexical-let ((last-shell ""))
|
||||||
"Jumps to eshell or back."
|
(defun toggle-shell ()
|
||||||
(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)
|
||||||
|
Loading…
Reference in New Issue
Block a user