jao-eshell-here.el 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. ;;; jao-eshell-here.el --- Easy opening of eshell buffers -*- lexical-binding: t; -*-
  2. ;; Copyright (C) 2021, 2023 jao
  3. ;; Author: jao <mail@jao.io>
  4. ;; Keywords: eshell
  5. ;; This program is free software; you can redistribute it and/or modify
  6. ;; it under the terms of the GNU General Public License as published by
  7. ;; the Free Software Foundation, either version 3 of the License, or
  8. ;; (at your option) any later version.
  9. ;; This program is distributed in the hope that it will be useful,
  10. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. ;; GNU General Public License for more details.
  13. ;; You should have received a copy of the GNU General Public License
  14. ;; along with this program. If not, see <https://www.gnu.org/licenses/>.
  15. ;;; Commentary:
  16. ;; Commands for toggling eshell buffers below the current one.
  17. ;;; Code:
  18. (require 'eshell)
  19. (defvar jao-eshell-here-display-buffer-alist
  20. '(("^\\*eshell"
  21. (display-buffer-reuse-window display-buffer-below-selected)
  22. (window-height . 0.5)))
  23. "Value to use for `display-buffer-alist' when displaying the eshell buffer.")
  24. (defun jao-eshell-here--find-window (b)
  25. (when-let (w (seq-find (lambda (w) (eq (window-buffer w) b))
  26. (window-list)))
  27. (select-window w)))
  28. (defun jao-eshell-here--frame-buffer (&optional b)
  29. (let ((p 'jao-eshell-buffer))
  30. (if b (set-frame-parameter nil p b) (frame-parameter nil p))))
  31. (defun jao-eshell--cd-here (&optional dir)
  32. (eshell-kill-input)
  33. (eshell/cd (or dir default-directory))
  34. (insert "\n")
  35. (eshell-send-input))
  36. (defun jao-eshell-here (stay &optional force-new)
  37. "Open an eshell buffer below current buffer.
  38. Buffers are reused (per frame) unless FORCE-NEW is t. With prefix
  39. STAY (C-u), open at project's root, and with double prefix (C-u
  40. C-u) open in the current's buffer default dir."
  41. (interactive "p")
  42. (let ((b (unless force-new (jao-eshell-here--frame-buffer)))
  43. (dir (cond ((> stay 4) default-directory)
  44. ((> stay 1)
  45. (project-root
  46. (or (project-current)
  47. `(transient . ,default-directory))))))
  48. (display-buffer-alist
  49. (append display-buffer-alist jao-eshell-here-display-buffer-alist)))
  50. (jao-with-attached-buffer "^\\*eshell" 0.5
  51. (if (buffer-live-p b)
  52. (progn (pop-to-buffer b nil t)
  53. ;; (eshell-save-some-history)
  54. (when dir (jao-eshell--cd-here dir)))
  55. (let ((default-directory (or dir default-directory)))
  56. (eshell (when force-new 4)))
  57. (unless force-new (jao-eshell-here--frame-buffer (current-buffer)))))))
  58. ;;;###autoload
  59. (defun eshell/x ()
  60. (when (derived-mode-p 'eshell-mode)
  61. (when (fboundp 'eshell-autojump-save)
  62. (eshell-autojump-save))
  63. ;; (eshell-save-some-history)
  64. (if (> (frame-height) (window-height))
  65. (delete-window)
  66. (bury-buffer))))
  67. ;;;###autoload
  68. (defun jao-eshell-here-toggle (stay &optional force-new)
  69. "Open or close an eshell buffer, using `jao-eshell-here'."
  70. (interactive "p")
  71. (if (or (and force-new (derived-mode-p 'eshell-mode))
  72. (eq (current-buffer) (jao-eshell-here--frame-buffer)))
  73. (eshell/x)
  74. (jao-eshell-here stay force-new)))
  75. ;;;###autoload
  76. (defun jao-eshell-here-toggle-new (stay)
  77. "Open or close a new eshell buffer, using `jao-eshell-here'."
  78. (interactive "p")
  79. (jao-eshell-here-toggle stay t))
  80. (provide 'jao-eshell-here)
  81. ;;; jao-eshell-here.el ends here