Compare commits

...

2 Commits

Author SHA1 Message Date
df92555538
Add state information to eshell git prompt 2022-08-29 18:46:07 +02:00
4e25b535ca
Fix search logic when jumping to first non-finished checkbox
Also stay put when no open checkbox is found, i.e., do not move to the end of
the subtree.
2022-08-29 17:58:02 +02:00
2 changed files with 37 additions and 11 deletions

View File

@ -8,6 +8,7 @@
;;; Code:
(require 'dash)
(require 'subr-x)
(require 'seq)
(require 'eshell)
@ -57,10 +58,13 @@
;; Inspired by https://github.com/howardabrams/dot-files/blob/master/emacs-eshell.org#special-prompt
"Return name of git branch of current directory, as a string.
The format will be BASE-DIR::BRANCH-NAME, where BASE-DIR is the
directory containing the .git directory or link file of the
The format will be BASE-NAME@BASE-DIR[STATE], where BASE-DIR is
the directory containing the .git directory or link file of the
current git repository, and BRANCH-NAME is the name of the
current branch.
current branch. STATE will display information about whether the
worktree is dirty or whether the repository needs pushing. When
no extra state information is available, STATE will be empty and
the brackets will be ommitted.
Return the empty string if the current directory is not part of a
git repository."
@ -73,8 +77,22 @@ git repository."
(save-match-data
(let* ((git-branch (string-trim
(shell-command-to-string "git rev-parse --abbrev-ref HEAD")))
(base-dir (file-name-base (string-trim-right repo-dir "/?"))))
(format "%s@%s" git-branch base-dir))))))
(base-dir (file-name-base (string-trim-right repo-dir "/?")))
(state-list (cl-remove-if #'null
(list
(when (file-exists-p (file-name-concat "." ".git" "MERGE_HEAD"))
"merge")
(unless (= 0 (call-process "git" nil nil nil
"diff" "--no-ext-diff" "--quiet"))
"dirty")
(unless (= 0 (call-process "git" nil nil nil
"diff" "--no-ext-diff" "--quiet" "--cached"))
"uncommitted")
(unless (string-empty-p (shell-command-to-string "git stash list --quiet"))
"stash")))))
(if state-list
(format "%s@%s[%s]" git-branch base-dir (apply #'concat (-interpose "|" state-list)))
(format "%s@%s" git-branch base-dir)))))))
(defun eshell/default-prompt-function ()
"A prompt for eshell of the form

View File

@ -770,12 +770,20 @@ If there's no such open checkbox, emit a message and stay put."
(unless (derived-mode-p 'org-mode)
(user-error "Not in Org buffer, exiting"))
(save-restriction
(widen)
(org-back-to-heading 'invisible-ok)
(org-narrow-to-subtree)
(unless (or (re-search-forward "\\[-\\]" nil 'no-error)
(re-search-forward "\\[ \\]" nil 'no-error))
(message "No open checkbox in subtree"))))
(let ((original-point (point)))
(widen)
(org-back-to-heading 'invisible-ok)
(org-narrow-to-subtree)
(unless
;; Yes, progn is not strictly necessary, but it feels cleaner this way.
(or (progn
(goto-char (point-min))
(re-search-forward " \\[-\\] " nil 'no-error))
(progn
(goto-char (point-min))
(re-search-forward " \\[ \\] " nil 'no-error)))
(message "No open checkbox in subtree")
(goto-char original-point)))))
;;; Calendar