From e28aca4de0854e2e17ac953a0994ef49a5645484 Mon Sep 17 00:00:00 2001 From: bth Date: Thu, 18 Jul 2024 14:06:10 -0700 Subject: [PATCH] (um-next) : change the um/next.sh interface to call this function um/next.sh now has minimal elisp, and calls this function instead, and only prints the next file with UMNEXTPRINT so that (um-next-shell) can just get the next file and feed it into (next-file) and we don't have to call (undo) to leave out the header --- elisp/um.el | 33 +++++++++++++++++++++++++-------- shell/next.sh | 20 ++++++++++++-------- shell/test/um.bats | 10 +++++----- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/elisp/um.el b/elisp/um.el index 56dc333..ac2bb1e 100644 --- a/elisp/um.el +++ b/elisp/um.el @@ -205,20 +205,37 @@ NOTE: this searches in the current project root only. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; shell integration -(defun um-next-file-shell (dir &optional descriptor header) +(defun um-next (next-file &optional tag skip-header) + "Takes the next-file generated by the shell script and opens it. + +With the optional tag generated by the script. +And the option not to insert the um-journal-header. +" + (find-file next-file) + (unless skip-header + (um-journal-header) + (if tag + (progn (previous-line) + (insert (format "+ %s\n" tag)) + (next-line)))) + (message (format "creating %s" next-file)) + ) + +(defun um-next-shell (dir &optional descriptor header) "Calls um next in the provided dir. With the option not to leave behind the um-journal-header. + +Returns the value of next-file computed by um next " - (let ((default-directory dir)) + (let ((default-directory dir) (next-file)) ;; https://emacs.stackexchange.com/a/19878 - (eval (car (read-from-string (shell-command-to-string (concat "export UMNEXTECHO=true; um next" descriptor))))) - ;; HACK: so that the um-journal-header doesn't - ;; leave the file modified. - (unless header - (undo)) + (setq next-file (shell-command-to-string + (concat "export UMNEXTPRINT=true; um next" + (concat " " descriptor)))) + (um-next next-file nil t) + next-file ) ) - (provide 'um) diff --git a/shell/next.sh b/shell/next.sh index 16908e7..18dd05d 100755 --- a/shell/next.sh +++ b/shell/next.sh @@ -30,24 +30,28 @@ LASTFILE=`$UMBASEPATH/last.sh || echo $UMDEFAULTINIT` NEXTFILE=`echo $LASTFILE | awk -f $UMBASEPATH/next.awk -v arg=$1` # tag is optional second arg to this script -TAGINSERT='(previous-line) (insert "+ %s\\n") (next-line)' if [ $2 ]; then # + means insert the string descriptor as tag if [ $2 = '+' ]; then - UMTAG=$(printf "$TAGINSERT" "$1") + UMTAG="$1" else - UMTAG=$(printf "$TAGINSERT" "$2") + UMTAG="$2" fi + UMELISP=$(printf '(um-next "%s" "%s")' "$NEXTFILE" "$UMTAG") +else + UMELISP=$(printf '(um-next "%s")' "$NEXTFILE") fi -UMELISP="(progn (setq um-next-file \"$NEXTFILE\") (find-file um-next-file) (um-journal-header) $UMTAG (message \"creating $NEXTFILE\"))" - # for testing and piping -if [ $UMNEXTECHO ]; then +if [ $UMNEXTPRINT ]; then + # NOTE: printf instead of echo, because echo inserts a newline, and we pipe + # this back into elisp for um-next-shell: + printf $NEXTFILE +elif [ $UMNEXTTEST ]; then echo $UMELISP else - # HACK: emacs won't accept piped input as a file name, so we use --eval to open - # the file via find-file. + # NOTE: emacs won't accept piped input as a file name, so we use --eval to run + # um-next as elisp. Which also lets us add the header and tag. emacsclient --eval "$UMELISP" fi diff --git a/shell/test/um.bats b/shell/test/um.bats index 6b19a2d..c0752e6 100644 --- a/shell/test/um.bats +++ b/shell/test/um.bats @@ -13,11 +13,11 @@ setup() { export ORIGPWD=`pwd` cd $DIR/mockjournal # so that we can run next.sh without dealing with emacsclient. - export UMNEXTECHO=true + export UMNEXTTEST=true } teardown() { - export UMNEXTECHO=false + export UMNEXTTEST=false cd $ORIGPWD git restore $DIR/mockjournal } @@ -46,7 +46,7 @@ um_next_awk() { @test "um next empty elisp" { run um next - assert_output '(progn (setq um-next-file "100.md") (find-file um-next-file) (um-journal-header) (message "creating 100.md"))' + assert_output '(um-next "100.md")' } @test "um next descriptor" { @@ -56,12 +56,12 @@ um_next_awk() { @test "um next descriptor tag" { run um next foo bar - assert_output --partial '(insert "+ bar\n")' + assert_output '(um-next "100.foo.md" "bar")' } @test "um next descriptor +" { run um next foo + - assert_output --partial '(insert "+ foo\n")' + assert_output '(um-next "100.foo.md" "foo")' } @test "um last" {