diff options
| author | Yuchen Pei <id@ypei.org> | 2023-10-14 12:18:38 +1100 | 
|---|---|---|
| committer | Yuchen Pei <id@ypei.org> | 2023-10-14 12:18:38 +1100 | 
| commit | 0383ed224a7708315f3da83d5e809c597b0e888a (patch) | |
| tree | 8e2c180e2e9b41dc7c51b0bbe210d79c840944a5 /emacs/.emacs.d/lisp | |
| parent | ad1cdc1f55bf90f635365b728b91888edf31fa6e (diff) | |
[emacs] Fix notes and shell cycle and creation.
One function to switch or cycle default notes indirect buffers.
One to switch or cycle shell mode buffers.
Diffstat (limited to 'emacs/.emacs.d/lisp')
| -rw-r--r-- | emacs/.emacs.d/lisp/my/my-buffer.el | 36 | ||||
| -rw-r--r-- | emacs/.emacs.d/lisp/my/my-org.el | 47 | ||||
| -rw-r--r-- | emacs/.emacs.d/lisp/my/my-prog.el | 29 | ||||
| -rw-r--r-- | emacs/.emacs.d/lisp/my/my-utils.el | 5 | 
4 files changed, 91 insertions, 26 deletions
diff --git a/emacs/.emacs.d/lisp/my/my-buffer.el b/emacs/.emacs.d/lisp/my/my-buffer.el index fa51abf..af72cfb 100644 --- a/emacs/.emacs.d/lisp/my/my-buffer.el +++ b/emacs/.emacs.d/lisp/my/my-buffer.el @@ -28,6 +28,7 @@  ;; Much of the following is from prot-emacs  (defun my-get-major-mode-for-buffer (buffer) +  "Returns the major mode for BUFFER."    (buffer-local-value 'major-mode (get-buffer buffer)))  ;;; Copied from mastering emacs @@ -71,16 +72,21 @@ With a prefix-arg, prompt for major mode."        (call-interactively 'my-switch-to-buffer-matching-major-mode)      (switch-to-buffer (my--buffer-major-mode-prompt)))) +(defun my-buffer-find-mode (mode) +  "Find a buffer of a given MODE not in a live window." +  (seq-find +   (lambda (buffer) +     (and +      (with-current-buffer buffer +        (derived-mode-p mode)) +      (not (my-buffer-live-window-p buffer)))) +   (buffer-list))) +  (defun my-buffer-quick-major-mode (mode) -  "Switch to the first buffer of a given mode." -  (let ((buffers (buffer-list))) -    (while (and buffers -                (with-current-buffer (car buffers) -                  (not (derived-mode-p mode)))) -      (setq buffers (cdr buffers))) -    (if buffers -        (switch-to-buffer (car buffers)) -      (message "No buffers in %S" mode)))) +  "Switch to the first buffer of a given MODE not in a live window." +  (if-let ((buffer_ (my-buffer-find-mode mode))) +      (switch-to-buffer buffer) +    (message "No non-live-window buffers in %S" mode)))  (defun my-buffer-switch-or-create-major-mode (mode)    "Switch to or create a buffer with a chosen major mode. @@ -208,7 +214,7 @@ Do not try to make a new directory or anything fancy."    (switch-to-buffer (my--buffer-vc-root-prompt)))  (defun my-bookmark-save-no-prompt (&rest _) -    "Run `bookmark-save' without prompts. +  "Run `bookmark-save' without prompts.  The intent of this function is to be added as an :after advice to  `bookmark-set-internal'.  Concretely, this means that when @@ -216,7 +222,11 @@ The intent of this function is to be added as an :after advice to  afterwards.  We set this up because there is no hook after  setting a bookmark and we want to automatically save bookmarks at  that point." -    (funcall 'bookmark-save)) +  (funcall 'bookmark-save)) + +(defun my-buffer-live-window-p (buffer) +  "Whether BUFFER is in a live window." +  (window-live-p (get-buffer-window buffer)))  (defun my-cycle-windows ()    "Cycle all windows." @@ -425,10 +435,6 @@ for the given MAJOR-MODE, any text is appended to it."                            (not (equal (cdr buffer) current)))))))      (switch-to-buffer buffer))) -(defun my-list-cycle (xs) -  "Cycle a list." -  (cdr (append xs (list (car xs))))) -  (defvar my-indirect-buffer-list nil)  (defun my-cycle-indirect-buffer () diff --git a/emacs/.emacs.d/lisp/my/my-org.el b/emacs/.emacs.d/lisp/my/my-org.el index 8a6991e..01082d8 100644 --- a/emacs/.emacs.d/lisp/my/my-org.el +++ b/emacs/.emacs.d/lisp/my/my-org.el @@ -156,9 +156,50 @@ Otherwise deactivate mark and move point to after the block."         (save-excursion (my-org-beginning-of-line-or-indent) (point))         (point))))) -(defun my-org-open-default-notes-file () -  (interactive) -  (find-file org-default-notes-file)) +(defvar my-shell-buffer-list nil +  "List of default org notes file buffers.") + +(defun my-org-open-or-cycle-notes (arg) +  "Open default notes file. + +Switch to the first buffer with the notes file that's not in a +live window, or find the notes file. + +If repeated, cycle through indirect buffers of the default notes. + +With a prefix ARG, creates a new indirect buffer of the default +notes file." +  (interactive "P") +  (if arg +      (with-current-buffer (find-file-noselect org-default-notes-file) +        (clone-indirect-buffer nil t) +        (setq my-notes-buffer-list +              (setq-filter 'my-buffer-with-same-base-p +                           (buffer-list)))) +    (if (eq last-command 'my-org-open-or-cycle-notes) +        (progn +          (setq my-notes-buffer-list +                (my-list-cycle my-notes-buffer-list)) +          (switch-to-buffer (car my-notes-buffer-list))) +      (let ((buffer +             (find-file-noselect org-default-notes-file))) +        (with-current-buffer buffer +          (setq my-notes-buffer-list +                (seq-filter 'my-buffer-with-same-base-p (buffer-list)))) +        ;; Find first buffer that is not in a live window. If no such +        ;; buffer exists, fall back to `find-file-noselect'. +        (setq buffer +              (or +               (seq-find +                (lambda (buffer) +                  (not (my-buffer-live-window-p buffer))) +                my-notes-buffer-list) +               (find-file-noselect org-default-notes-file))) +        (while (not (eq buffer (car my-notes-buffer-list))) +          (setq my-notes-buffer-list +                (my-list-cycle my-notes-buffer-list)))) +      (switch-to-buffer (car my-notes-buffer-list)) +      )))  ;; links  (defun my-org-substitute-gnus-link-after-archiving () diff --git a/emacs/.emacs.d/lisp/my/my-prog.el b/emacs/.emacs.d/lisp/my/my-prog.el index 798b4cd..a0e0ce7 100644 --- a/emacs/.emacs.d/lisp/my/my-prog.el +++ b/emacs/.emacs.d/lisp/my/my-prog.el @@ -137,20 +137,33 @@  (require 'my-buffer) -(defun my-switch-or-create-shell-buffer (arg) +(defvar my-shell-buffer-list nil +  "List of shell mode buffers.") + +(defun my-shell-open-or-cycle (arg)    "Switch to or create a shell buffer.  If there's no buffer with shell mode, or with a prefix-arg,  create a shell buffer using `my-shell-with-directory'"    (interactive "P")    (if (or arg -          (not (seq-filter -                (lambda (buffer) -                  (with-current-buffer buffer -                    (derived-mode-p 'shell-mode))) -                (buffer-list)))) -      (call-interactively 'my-shell-with-directory) -    (my-buffer-quick-major-mode 'shell-mode))) +          (not (my-buffer-find-mode 'shell-mode))) +      (progn +        (call-interactively 'my-shell-with-directory) +        (setq my-shell-buffer-list +              (seq-filter 'my-buffer-with-same-major-mode-p +                          (buffer-list)))) +    (if (eq last-command 'my-shell-open-or-cycle) +        (progn +          (setq my-shell-buffer-list +                (my-list-cycle my-shell-buffer-list)) +          (switch-to-buffer (car my-shell-buffer-list))) +      (let ((buffer +             (my-buffer-find-mode 'shell-mode))) +        (switch-to-buffer buffer) +        (setq my-shell-buffer-list +              (seq-filter 'my-buffer-with-same-major-mode-p +                          (buffer-list)))))))  ;;; gdb  (require 'gdb-mi) diff --git a/emacs/.emacs.d/lisp/my/my-utils.el b/emacs/.emacs.d/lisp/my/my-utils.el index f80fb13..db7e804 100644 --- a/emacs/.emacs.d/lisp/my/my-utils.el +++ b/emacs/.emacs.d/lisp/my/my-utils.el @@ -45,6 +45,11 @@  (defun my-delete-http-header ()    (delete-region (point-min) (progn (my-skip-http-header) (point)))) +;; lists +(defun my-list-cycle (xs) +  "Cycle a list." +  (cdr (append xs (list (car xs))))) +  (defun my-get-current-line-no-properties ()    (save-excursion      (let ((beg (progn (beginning-of-line)  | 
