This is a short function I crafted recently to create a new Hugo article from within the Emacs. Until now, each time I wanted to create a new article, I had to spawn eshell and run hugo new
command from there.
In essence, it is really a dumb function, and has no notion of hugo commands, templates, structure, or anything for that matter. It assumes my own post structure and just inserts hard-coded template into appropriate place for my site. It prompts for name of the article which is just down-cased and spaces are replaced with dashes (-) in order to generate filename.
(setq hugo-root-dir "~/Area52/tomica.net/")
(defun tomica/hugo-new-blog-post ()
"Function to create new Hugo post."
(interactive)
(let* (
(page-title (read-string "Enter the page title: "))
(filename (replace-regexp-in-string " " "-" (downcase page-title)))
(template (concat
"---\n"
"title: %s\n"
"date: %s\n"
"draft: true\n"
"type: post\n"
"categories: \n"
" - Blog\n"
"tags:\n"
" - \n"
"---\n"))
)
(if (not (file-exists-p hugo-root-dir))
(message "Hugo root directory not found: %s" hugo-root-dir)
(let* (
(page-path (expand-file-name (concat "content/blog/" (format-time-string "%Y/%m/") filename ".md") hugo-root-dir))
)
(if (file-exists-p page-path)
(message "Page already exists: %s" page-path)
(with-temp-file page-path
(insert (format template page-title (format-time-string "%Y-%m-%dT%H:%M:%S%z")))
(message "New page created: %s" page-path)))
)
)
)
)
I plan on evolving this function with time, but not in the immediate future. Once I start developing more things on top of it I’ll probably move it into a separate repository and use it as a private package.
Some features I’d like to see in the future:
- prompt for tags, give a list of existing tags in other files (such as org-mode does with its own tags)
- have function which will collect all articles within the hugo site and allow to select one using some completion/selection framework so I can open that file and edit it
- When generating filename, account for more special characters such as
'
- … who knows
I’m aware that there’s already easy-hugo package which might provide what I’m looking for and much more, but it would be an overkill to use it at this time. Instead, I decided to play a bit :-)