Emacs: Starting Gemlog Entries Faster (publ. 2024-02-12)
A great thing about gemtext is it is so simple I don't need a CMS. But it was still taking me a minute or two to create the new gemtext file on the server, as I had to login, navigate to the correct directory, and type a file name with the correct date and sequence number. I use a sequence number in my system in case there is more than one post a day. Naturally, the solution for me was an Emacs function.
Here is the function doing most of the work which finds, over SSH, the next unused path in my file naming scheme:
(defvar gemlog-directory "/ssh:yourdomainhere.example.com:/srv/gemini/gemlog/")
(defun find-unused-gemlog-file (gemlog &optional time)
"Return a string with the the path <gemlog-directory>/<gemlog>/YYYYMMDD-N.gmi, where the file does not yet exist and N is the lowest whole number possible in the range [0,inf)."
(let* ((time (if time time (current-time)))
(prefix (format-time-string "%Y%m%d-" time)))
(cl-labels ((worker (seqnum)
(let ((proposed-path
(concat
gemlog-directory gemlog "/" prefix (number-to-string seqnum) ".gmi")))
(if (file-exists-p proposed-path)
(worker (1+ seqnum))
proposed-path))))
(worker 0))))
True lispy recursion going on there. Next is a function that actually creates the file:
(defun make-new-gemlog-file (gemlog)
"Finds an unused file path using find-unused-gemlog-file and creates and opens it with find-file."
(find-file (find-unused-gemlog-file gemlog)))
I have several gemlogs, but they are found at the same root directory, so I pass in the name of the specific gemlog directory. Finally I made a convenient interactive function to call it for a specific gemlog:
(defun make-new-starlog-entry ()
(interactive)
(make-new-gemlog-file "starlog"))
So, now I just call make-new-starlog-entry (through Helm) to start a new starlog gemlog post. I'm working on another function that will add the entry to the gemfeed index, and some other convenience functions.
Copyright
This work © 2024 by Christopher Howard is licensed under Attribution-ShareAlike 4.0 International.
CC BY-SA 4.0 Deed