Compare commits
21 Commits
4c623110cd
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 0b5411c6bd | |||
| e9e56da86c | |||
| d8b3064f13 | |||
| e05401e20a | |||
| 5daa1e5f3a | |||
| 53cedfb96b | |||
| 129dc0889c | |||
| 8928f88b68 | |||
| f2a88fbb60 | |||
| 58406a9038 | |||
| 3b9f0c91b9 | |||
| e597e8f981 | |||
| 3660cabe34 | |||
| bcb75d526b | |||
| 055b288d98 | |||
| e7e5487e38 | |||
| 54fe0efd3d | |||
| c013934b8b | |||
| 78ba0ec1fe | |||
| cff05088ba | |||
| 7db91b67c9 |
32
content/pages/about.md
Normal file
32
content/pages/about.md
Normal file
@@ -0,0 +1,32 @@
|
||||
+++
|
||||
title = "About"
|
||||
author = ["Anne"]
|
||||
date = 2025-10-31T00:00:00+01:00
|
||||
lastmod = 2025-11-01T14:15:45+01:00
|
||||
draft = false
|
||||
url = "/about"
|
||||
+++
|
||||
|
||||
## Hi there --- and welcome! {#hi-there-and-welcome}
|
||||
|
||||
You've stumbled upon my quiet spot online. I'm Anne (she/her), a DIY geek kind of girl living in the wonderful city of Amsterdam.
|
||||
|
||||
Some time ago, out of curiosity, I started building my own private server from collected scrap parts. I wanted to understand how the internet actually works. So I got myself a [domain name](<https://minded.net>) and figured out how to set up and manage my own mail server running on Linux.
|
||||
|
||||
I quickly discovered the simple joy of being independent --- and how empowering it is to understand things because you’ve built them yourself.
|
||||
|
||||
While tinkering, I learned a lot from others who shared their bits and pieces online. That's exactly what this small corner of the web is about too. Maybe you ended up here while figuring something out, just like I usually do. Hopefully you find a few answers here -- or at least some inspiration. Happy to help :-)
|
||||
|
||||
These days I'm still hosting my own private mail and web servers, while basically living [my life in plain text](<https://orgmode.org/index.html>).
|
||||
|
||||
Feel free to get in touch: [anne@minded.net](<mailto:anne@minded.net>)
|
||||
|
||||
Thanks for stopping by --- stay curious!
|
||||
|
||||
x Anne
|
||||
|
||||
|
||||
### P.S. if you're wondering... {#p-dot-s-dot-if-you-re-wondering-dot-dot-dot}
|
||||
|
||||
- you'll find the repo of this blog here: [git.minded.net/anne/blog.minded.net](<https://git.minded.net/anne/blog.minded.net>)
|
||||
- my literate Emacs configuration: [init.el.org](<https://blog.minded.net/pages/emacs/init.el.org>)
|
||||
515
content/pages/emacs/init.el.org.md
Normal file
515
content/pages/emacs/init.el.org.md
Normal file
@@ -0,0 +1,515 @@
|
||||
+++
|
||||
title = "init.el.org"
|
||||
author = ["Anne"]
|
||||
date = 2025-10-31T00:00:00+01:00
|
||||
lastmod = 2025-11-01T00:03:32+01:00
|
||||
tags = ["emacs"]
|
||||
draft = false
|
||||
+++
|
||||
|
||||
## My Emacs configuration {#my-emacs-configuration}
|
||||
|
||||
More about [the Emacs initialization file](https://www.gnu.org/software/emacs/manual/html_node/emacs/Init-File.html)
|
||||
|
||||
`~/.emacs.d/init.el` is generated from this org file with [Org-babel](https://orgmode.org/worg/org-contrib/babel/)
|
||||
|
||||
How to tangle: `M-x org-babel-tangle` or `C-c C-v t`
|
||||
|
||||
My Emacs repository: [git.minded.net/anne/emacs](https://git.minded.net/anne/emacs)
|
||||
|
||||
The source version of this file: [git.minded.net/anne/emacs/src/branch/main/init.el.org](https://git.minded.net/anne/emacs/src/branch/main/init.el.org?display=source)
|
||||
|
||||
Or view this file on my blog: [blog.minded.net/pages/emacs/init.el.org](https://blog.minded.net/pages/emacs/init.el.org)
|
||||
|
||||
|
||||
### About me {#about-me}
|
||||
|
||||
```elisp
|
||||
(setq user-full-name "Anne"
|
||||
user-mail-address "anne@minded.net")
|
||||
```
|
||||
|
||||
|
||||
### Use-package {#use-package}
|
||||
|
||||
<https://github.com/jwiegley/use-package>
|
||||
|
||||
```elisp
|
||||
(require 'package)
|
||||
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
|
||||
(package-initialize)
|
||||
(unless (package-installed-p 'use-package)
|
||||
(package-refresh-contents)
|
||||
(package-install 'use-package))
|
||||
(require 'use-package)
|
||||
(setq use-package-always-ensure 't)
|
||||
```
|
||||
|
||||
|
||||
### Reload configuration {#reload-configuration}
|
||||
|
||||
`M-x reload-emacs-init`
|
||||
|
||||
```elisp
|
||||
(defun reload-emacs-init ()
|
||||
(interactive)
|
||||
(load-file "~/.emacs.d/init.el")
|
||||
(message "Configuarion reloaded!"))
|
||||
```
|
||||
|
||||
|
||||
### Customizations file {#customizations-file}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Saving-Customizations.html>
|
||||
|
||||
You can choose to save customizations somewhere other than your initialization file.
|
||||
|
||||
```elisp
|
||||
(setq custom-file "~/.emacs.d/custom.el")
|
||||
(load custom-file 'noerror 'nomessage)
|
||||
```
|
||||
|
||||
|
||||
### TRAMP {#tramp}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/tramp/Auto_002dsave-File-Lock-and-Backup.html>
|
||||
|
||||
```elisp
|
||||
(setq tramp-allow-unsafe-temporary-files t)
|
||||
```
|
||||
|
||||
|
||||
### zone-mode {#zone-mode}
|
||||
|
||||
```elisp
|
||||
(add-to-list 'auto-mode-alist '("/etc/bind/zones/" . zone-mode))
|
||||
```
|
||||
|
||||
|
||||
### Lock files {#lock-files}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Locks.html>
|
||||
|
||||
If create-lockfiles is nil, Emacs does not lock files.
|
||||
|
||||
```elisp
|
||||
(setq create-lockfiles nil)
|
||||
```
|
||||
|
||||
|
||||
### Yes-or-no prompts {#yes-or-no-prompts}
|
||||
|
||||
<https://www.emacswiki.org/emacs/YesOrNoP>
|
||||
|
||||
```elispx1
|
||||
(defalias 'yes-or-no-p 'y-or-n-p)
|
||||
```
|
||||
|
||||
|
||||
### Keeping buffers up-to-date {#keeping-buffers-up-to-date}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Auto-Revert.html>
|
||||
|
||||
```elisp
|
||||
(global-auto-revert-mode 1)
|
||||
(setq global-auto-revert-non-file-buffers t)
|
||||
```
|
||||
|
||||
|
||||
### Disable startup screen {#disable-startup-screen}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/elisp/Startup-Summary.html>
|
||||
|
||||
```elisp
|
||||
(setq inhibit-startup-screen nil)
|
||||
```
|
||||
|
||||
|
||||
### What to display {#what-to-display}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Frames.html>
|
||||
|
||||
I do like the menu bar after all.
|
||||
|
||||
```elisp
|
||||
(tool-bar-mode -1)
|
||||
;;(menu-bar-mode -1)
|
||||
(tooltip-mode -1)
|
||||
```
|
||||
|
||||
|
||||
### Mode line column and line numbers {#mode-line-column-and-line-numbers}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/efaq/Displaying-the-current-line-or-column.html>
|
||||
|
||||
```elisp
|
||||
(column-number-mode t)
|
||||
```
|
||||
|
||||
|
||||
### Theme {#theme}
|
||||
|
||||
```elisp
|
||||
(use-package ef-themes
|
||||
:ensure t
|
||||
:demand t
|
||||
:config
|
||||
(ef-themes-select 'ef-dream))
|
||||
```
|
||||
|
||||
```elisp
|
||||
(custom-set-faces
|
||||
'(helm-buffer-directory ((t (:extend t :background "dim gray" :foreground "DarkRed"))))
|
||||
'(helm-ff-directory ((t (:extend t :background "dim gray" :foreground "DarkRed"))))
|
||||
'(org-agenda-date-today ((t (:inherit org-agenda-date :underline nil))))
|
||||
'(menu ((t (:background "magenta")))))
|
||||
```
|
||||
|
||||
|
||||
### Mood-line {#mood-line}
|
||||
|
||||
<https://gitlab.com/jessieh/mood-line>
|
||||
|
||||
A lightweight, drop-in replacement for the default Emacs mode line configuration.
|
||||
|
||||
```elisp
|
||||
(use-package mood-line
|
||||
:config (mood-line-mode)
|
||||
;;(setq mood-line-format mood-line-format-default)
|
||||
(setq mood-line-format mood-line-format-default-extended)
|
||||
(setq mood-line-glyph-alist mood-line-glyphs-unicode))
|
||||
```
|
||||
|
||||
|
||||
### Suppress dialog boxes {#suppress-dialog-boxes}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Dialog-Boxes.html>
|
||||
|
||||
```elisp
|
||||
(setq use-dialog-box nil)
|
||||
```
|
||||
|
||||
|
||||
### Sentences {#sentences}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/efaq/Filling-paragraphs-with-a-single-space.html>
|
||||
|
||||
```elisp
|
||||
(setq sentence-end-double-space nil)
|
||||
```
|
||||
|
||||
|
||||
### Minibuffer {#minibuffer}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer-Edit.html>
|
||||
|
||||
```elisp
|
||||
(setq resize-mini-windows t)
|
||||
(setq max-mini-window-height 0.5)
|
||||
```
|
||||
|
||||
|
||||
### Word wrap {#word-wrap}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Visual-Line-Mode.html>
|
||||
|
||||
```elisp
|
||||
(add-hook 'text-mode-hook 'visual-line-mode)
|
||||
```
|
||||
|
||||
|
||||
### Mouse support {#mouse-support}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Mouse-Input.html>
|
||||
|
||||
```elisp
|
||||
(xterm-mouse-mode 1)
|
||||
(mouse-wheel-mode 1)
|
||||
(context-menu-mode 1)
|
||||
```
|
||||
|
||||
|
||||
### Kill-line {#kill-line}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Killing-by-Lines.html>
|
||||
|
||||
If non-nil, `kill-line` with no arg at start of line kills the whole line.
|
||||
|
||||
```elisp
|
||||
(setq kill-whole-line t)
|
||||
```
|
||||
|
||||
|
||||
### Indentation {#indentation}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/eintr/Indent-Tabs-Mode.html>
|
||||
|
||||
```elisp
|
||||
(setq-default indent-tabs-mode nil)
|
||||
```
|
||||
|
||||
|
||||
### Electric pair mode {#electric-pair-mode}
|
||||
|
||||
<https://emacsdocs.org/docs/emacs/Matching>
|
||||
|
||||
```elisp
|
||||
(electric-pair-mode 1)
|
||||
```
|
||||
|
||||
|
||||
### Overwrite highlighted region {#overwrite-highlighted-region}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/efaq/Replacing-highlighted-text.html>
|
||||
|
||||
```elisp
|
||||
(delete-selection-mode t)
|
||||
```
|
||||
|
||||
|
||||
### Scrolling {#scrolling}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Scrolling.html>
|
||||
|
||||
```elisp
|
||||
(setq scroll-error-top-bottom t)
|
||||
```
|
||||
|
||||
|
||||
### Cursor {#cursor}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Cursor-Display.html>
|
||||
|
||||
```elisp
|
||||
(global-hl-line-mode t)
|
||||
```
|
||||
|
||||
|
||||
### Window handling {#window-handling}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Window-Convenience.html>
|
||||
|
||||
Winner mode is a global minor mode that records the changes in the window configuration (i.e., how the frames are partitioned into windows), so that you can undo them.
|
||||
|
||||
```elisp
|
||||
(winner-mode 1)
|
||||
```
|
||||
|
||||
The Windmove package defines commands for moving directionally between neighboring windows in a frame.
|
||||
|
||||
```elisp
|
||||
(use-package windmove
|
||||
:bind
|
||||
(("<f2> <right>" . windmove-right)
|
||||
("<f2> <left>" . windmove-left)
|
||||
("<f2> <up>" . windmove-up)
|
||||
("<f2> <down>" . windmove-down)))
|
||||
```
|
||||
|
||||
|
||||
### Crux {#crux}
|
||||
|
||||
<https://github.com/bbatsov/crux>
|
||||
|
||||
A Collection of Ridiculously Useful eXtensions for Emacs. crux bundles many useful interactive commands to enhance your overall Emacs experience.
|
||||
|
||||
```elisp
|
||||
(use-package crux
|
||||
:bind
|
||||
("C-a" . crux-move-beginning-of-line)
|
||||
("C-c o" . crux-open-with)
|
||||
("C-k" . crux-kill-whole-line)
|
||||
("C-c f" . crux-cleanup-buffer-or-region)
|
||||
("C-x C-a" . crux-sudo-edit)
|
||||
:config
|
||||
(crux-with-region-or-buffer indent-region)
|
||||
(crux-with-region-or-buffer untabify)
|
||||
(crux-with-region-or-line comment-or-uncomment-region))
|
||||
```
|
||||
|
||||
|
||||
### Dired {#dired}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html>
|
||||
|
||||
```elisp
|
||||
(put 'dired-find-alternate-file 'disabled nil)
|
||||
(setq dired-listing-switches "-agho --group-directories-first")
|
||||
```
|
||||
|
||||
|
||||
### Kill buffer {#kill-buffer}
|
||||
|
||||
```elisp
|
||||
(global-set-key (kbd "C-x k") 'kill-current-buffer)
|
||||
```
|
||||
|
||||
|
||||
### Unset C-z {#unset-c-z}
|
||||
|
||||
Unset C-z which is bound to \`suspend-frame' by default.
|
||||
|
||||
```elisp
|
||||
(global-unset-key (kbd "C-z"))
|
||||
```
|
||||
|
||||
|
||||
### Backups {#backups}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Backup.html>
|
||||
|
||||
Automatically backup buffers/files into the ~.emacs.d/backup/ directory.
|
||||
|
||||
```elisp
|
||||
(setq backup-directory-alist '(("." . "~/.emacs.d/backups")))
|
||||
(setq backup-by-copying t ; Don't delink hardlinks
|
||||
version-control t ; Use version numbers on backups
|
||||
delete-old-versions t ; Automatically delete excess backups
|
||||
kept-new-versions 20 ; how many of the newest versions to keep
|
||||
kept-old-versions 5) ; and how many of the old
|
||||
```
|
||||
|
||||
|
||||
### backup-walker {#backup-walker}
|
||||
|
||||
<https://github.com/lewang/backup-walker>
|
||||
|
||||
```elisp
|
||||
(use-package backup-walker
|
||||
:bind
|
||||
("C-c b" . backup-walker-start))
|
||||
```
|
||||
|
||||
|
||||
### Auto save {#auto-save}
|
||||
|
||||
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Auto-Save-Control.html>
|
||||
|
||||
```elisp
|
||||
(setq auto-save-timeout 20 ; number of seconds idle time before auto-save (default: 30)
|
||||
auto-save-interval 200) ; number of keystrokes between auto-saves (default: 300)
|
||||
```
|
||||
|
||||
|
||||
### Lastmod time stamp {#lastmod-time-stamp}
|
||||
|
||||
```elisp
|
||||
(setq time-stamp-start "\\(^:last_modified: \\\\?[\[<]+\\|^:LASTMOD: \\\\?[\[<]+\\|^#\\+lastmod: \\\\?[\[<]+\\|^;; lastmod: \\\\?[\[<]+\\)")
|
||||
(setq time-stamp-end "\\\\?[\]>]")
|
||||
(setq time-stamp-format "%Y-%02m-%02d %3a %02H:%02M")
|
||||
(setq time-stamp-limit 12)
|
||||
(add-hook 'before-save-hook 'time-stamp)
|
||||
(setq time-stamp-active t)
|
||||
```
|
||||
|
||||
|
||||
### Magit {#magit}
|
||||
|
||||
<https://magit.vc/>
|
||||
|
||||
<https://systemcrafters.net/mastering-git-with-magit/introduction/>
|
||||
|
||||
```elisp
|
||||
(use-package magit
|
||||
:ensure t)
|
||||
```
|
||||
|
||||
|
||||
### Which-key {#which-key}
|
||||
|
||||
<https://github.com/justbur/emacs-which-key>
|
||||
|
||||
which-key is a minor mode for Emacs that displays the key bindings following your currently entered incomplete command (a prefix) in a popup.
|
||||
|
||||
```elisp
|
||||
(use-package which-key
|
||||
:config
|
||||
(which-key-mode)
|
||||
(setq which-key-idle-delay 0.5
|
||||
which-key-idle-secondary-delay 0.5)
|
||||
(which-key-setup-side-window-bottom))
|
||||
```
|
||||
|
||||
|
||||
### Helm {#helm}
|
||||
|
||||
<https://emacs-helm.github.io/helm/>
|
||||
|
||||
Imagine a life without Helm...
|
||||
|
||||
```elisp
|
||||
(use-package helm
|
||||
:ensure t
|
||||
:config
|
||||
;;(require 'helm-config)
|
||||
:init
|
||||
(helm-mode 1)
|
||||
(setq helm-split-window-inside-p t)
|
||||
:diminish helm-mode
|
||||
:bind (("M-x" . helm-M-x) ; Evaluate functions
|
||||
("C-x C-f" . helm-find-files) ; Open or create files
|
||||
("C-x b" . helm-mini) ; Select buffers
|
||||
("C-x C-b" . helm-buffers-list)
|
||||
("C-x C-r" . helm-recentf) ; Select recently saved files
|
||||
("C-c i" . helm-imenu) ; Select document heading
|
||||
("M-y" . helm-show-kill-ring) ; Show the kill ring
|
||||
("C-x c g" . helm-do-grep-ag)
|
||||
:map helm-map
|
||||
("C-z" . helm-select-action)
|
||||
("<tab>" . helm-execute-persistent-action)))
|
||||
```
|
||||
|
||||
|
||||
### Org-appear {#org-appear}
|
||||
|
||||
<https://github.com/awth13/org-appear>
|
||||
|
||||
Make invisible parts of Org elements appear visible.
|
||||
|
||||
```elisp
|
||||
(use-package org-appear
|
||||
:load-path "~/.emacs.d/etc/elisp/org-appear"
|
||||
:hook (org-mode . org-appear-mode)
|
||||
:init
|
||||
(setq org-appear-autolinks t))
|
||||
```
|
||||
|
||||
Hide emphasis markers by default.
|
||||
|
||||
```elisp
|
||||
(setq org-hide-emphasis-markers t)
|
||||
```
|
||||
|
||||
|
||||
### Org-roam {#org-roam}
|
||||
|
||||
<https://github.com/org-roam/org-roam>
|
||||
|
||||
<https://www.orgroam.com/>
|
||||
|
||||
```elisp
|
||||
(use-package org-roam
|
||||
:ensure t
|
||||
;;:init
|
||||
;;(setq org-roam-v2-ack t)
|
||||
:custom
|
||||
(org-roam-directory "~/org/notes")
|
||||
(org-roam-completion-everywhere t)
|
||||
(org-roam-capture-templates
|
||||
'(("d" "default" plain "%?"
|
||||
:target (file+head "%<%Y%m%d>-${slug}.org"
|
||||
":PROPERTIES:\n:CREATED: %U\n:LASTMOD: []\n:END:\n#+title: ${title}\n\n\n")
|
||||
:unnarrowed t)))
|
||||
:config
|
||||
(org-roam-db-autosync-mode)
|
||||
(setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:42}" 'face 'org-tag)))
|
||||
:bind (("C-c n l" . org-roam-buffer-toggle)
|
||||
("C-c n f" . org-roam-node-find)
|
||||
("C-c n i" . org-roam-node-insert)
|
||||
("C-c n c" . org-roam-capture)
|
||||
("C-c n d" . org-id-get-create)
|
||||
("C-c n t" . org-roam-tag-add)
|
||||
("C-c n u" . org-roam-tag-remove)
|
||||
("C-c n a" . org-roam-alias-add)
|
||||
("C-c n b" . org-roam-alias-remove)))
|
||||
```
|
||||
20
content/posts/hello-world.md
Normal file
20
content/posts/hello-world.md
Normal file
@@ -0,0 +1,20 @@
|
||||
+++
|
||||
title = "Hello World!"
|
||||
author = ["Anne"]
|
||||
date = 2025-03-16T00:00:00+01:00
|
||||
lastmod = 2025-11-01T14:16:51+01:00
|
||||
draft = false
|
||||
summary = "You’ve stumbled upon my quiet spot online. Probably you ended up here while figuring something out, just like I usually do. Hopefully you find a few answers here --- or at least some inspiration."
|
||||
+++
|
||||
|
||||
## Hi there --- and welcome! {#hi-there-and-welcome}
|
||||
|
||||
You’ve stumbled upon my quiet spot online. Probably you ended up here while figuring something out, just like I usually do.
|
||||
|
||||
I’m Anne (she/her), a DIY geek kind of girl living in the wonderful city of Amsterdam. Some time ago, out of curiosity, I started building my own private server from collected scrap parts. I wanted to understand how the internet actually works. So I got myself a [domain name](<https://minded/net>) and figured out how to set up and manage my own mail server on Linux.
|
||||
|
||||
I quickly discovered the joy of being independent --- and how empowering it is to understand things because you’ve built them yourself.
|
||||
|
||||
While tinkering, I learned a lot from others who shared their bits and pieces online. That’s exactly what this small corner of the web is about too. Hopefully you find a few answers here --- or at least some inspiration. Happy to help :-)
|
||||
|
||||
x [Anne](<mailto:anne@minded.net>)
|
||||
63
content/posts/hugo-workflow.md
Normal file
63
content/posts/hugo-workflow.md
Normal file
@@ -0,0 +1,63 @@
|
||||
+++
|
||||
title = "The appeal of wysiwyg"
|
||||
author = ["Anne"]
|
||||
date = 2025-11-01T00:00:00+01:00
|
||||
lastmod = 2025-11-01T15:36:21+01:00
|
||||
tags = ["hugo", "workflow"]
|
||||
draft = false
|
||||
summary = "For a DIY girl like me, [Hugo](https://gohugo.io) is awesome. Hugo is a static website generator that gives you complete control over its output --- right from the command line. What more could a girl wish for?"
|
||||
+++
|
||||
|
||||
## Hugo is awesome {#hugo-is-awesome}
|
||||
|
||||
For a DIY girl like me, [Hugo](<https://gohugo.io>) is awesome. Hugo is a static website generator that gives you complete control over its output --- right from the command line. What more could a girl wish for?
|
||||
|
||||
Even better, you can use your [favorite text editor](<https://www.gnu.org/software/emacs/>) to write new content or tweak your theme. While I love the command line, I do understand the appeal of wysiwyg: it's nice to be able see what your content will look before publishing it online. But do you really need a full-blown content management system with all the bells and whistles for that? Nope, actually you don't. Hugo can help you out just as easily!
|
||||
|
||||
|
||||
### My workflow {#my-workflow}
|
||||
|
||||
So what does my workflow look like? In a nutshell: I create some new content on my laptop, check out how it renders in my browser locally, and when satisfied, push it to my server --- which automaticaly deploys it online.
|
||||
|
||||
Preferably, I write in [Emacs Org Mode](<https://orgmode.org/>), typing away on my laptop sitting somewhere cozy, with a cup of coffee within reach. On my laptop, I have a local clone of my blog. The main git repository lives online on [Gitea](<https://about.gitea.com/>) on my private server, which also serves my blog to the world.
|
||||
|
||||
> Note to self: write a post about magically deploying a static website with Hugo, Gitea and webhooks.
|
||||
|
||||
Before I start writing, I `cd` into the root of my local copy of my blog's repository and fire up the Hugo web server:
|
||||
|
||||
```sh { linenos=false }
|
||||
cd ~/projects/blog.minded.net
|
||||
hugo server --buildDrafts --navigateToChanged
|
||||
```
|
||||
|
||||
The [Hugo embedded web server](<https://gohugo.io/commands/hugo_server/>) watches your files for changes and renders new content in real time. To see what's happening, you can point your browser to `http://localhost:1313`.
|
||||
|
||||
The `buildDrafts` option makes Hugo render draft posts as well. And even better: `navigateToChanged` redirects your browser instantly to your last edit. Babes, that's so nifty!
|
||||
|
||||
Then I kindly ask Hugo to add some new content and start writing:
|
||||
|
||||
```sh { linenos=false }
|
||||
hugo new content posts/my-new-post.md
|
||||
emacs content/posts/my-new-post.md
|
||||
```
|
||||
|
||||
Every time I save my changes, the Hugo embedded server renders the new content on the fly, so I can immediatly see what my writings look like in my browser. Wysiwyg enough for me!
|
||||
|
||||
> Hugo supports several [content formats](<https://gohugo.io/content-management/formats/>) out of the box. [Markdown](<https://www.markdownguide.org/tools/hugo/>) is the default format, but it also supports [Emacs Org Mode](<https://orgmode.org/>) and other formats. There are so many ways to get things done! Since I love Org Mode, I split up the technical stuff (i.e. my Hugo theme) and my content. When writing and editing posts and pages [ox-hugo](<https://github.com/kaushalmodi/ox-hugo>) helps to export my Org files to Markdown for Hugo. Maybe I'll circle back on that later in another post.
|
||||
|
||||
|
||||
### Get it out there {#get-it-out-there}
|
||||
|
||||
When I'm done writing, I commit and push my edits to my main repository on Gitea:
|
||||
|
||||
```sh { linenos=false }
|
||||
git add content/posts/my-new-post.md
|
||||
git commit -m "Added my new post"
|
||||
git push
|
||||
```
|
||||
|
||||
Gitea then automagically gets Hugo to rebuild my blog and publish it online. It really is that simple.
|
||||
|
||||
> One last note to self: don't forget about `draft = true` in the [front matter](<https://gohugo.io/content-management/front-matter/#draft>) of my new post :P
|
||||
|
||||
If you are curious, you can find the repo of this blog here: [git.minded.net](<https://git.minded.net/anne/blog.minded.net>).
|
||||
30
hugo.toml
30
hugo.toml
@@ -1,3 +1,29 @@
|
||||
baseURL = 'https://example.org/'
|
||||
baseURL = 'https://blog.minded.net/'
|
||||
languageCode = 'en-us'
|
||||
title = 'My New Hugo Site'
|
||||
title = 'blog.minded.net'
|
||||
theme = 'minimalminded'
|
||||
|
||||
[[menus.main]]
|
||||
name = 'posts'
|
||||
pageRef = '/posts'
|
||||
weight = 10
|
||||
|
||||
[[menus.main]]
|
||||
name = 'tags'
|
||||
pageRef = '/tags'
|
||||
weight = 20
|
||||
|
||||
[module]
|
||||
[module.hugoVersion]
|
||||
extended = false
|
||||
min = "0.116.0"
|
||||
|
||||
[[menus.main]]
|
||||
name = 'about'
|
||||
pageRef = '/pages/about'
|
||||
weight = 90
|
||||
|
||||
[markup]
|
||||
[markup.highlight]
|
||||
style = 'doom-one'
|
||||
linenos = true
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
html {
|
||||
color-scheme: light dark;
|
||||
}
|
||||
|
||||
body {
|
||||
color: #222;
|
||||
font-family: sans-serif;
|
||||
line-height: 1.5;
|
||||
margin: 1rem;
|
||||
max-width: 768px;
|
||||
margin: auto;
|
||||
padding: 0 1rem 0 1rem;
|
||||
font-family: Tahoma, Verdana, Arial, sans-serif;
|
||||
color: lightgray;
|
||||
}
|
||||
|
||||
header {
|
||||
@@ -11,12 +16,80 @@ header {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
header h1 a {
|
||||
color: purple;
|
||||
}
|
||||
|
||||
footer {
|
||||
border-top: 1px solid #222;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #00e;
|
||||
text-decoration: none;
|
||||
nav ul {
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
nav ul li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
nav ul li a {
|
||||
padding-right: 8px;
|
||||
font-weight: bold;
|
||||
color: violet;
|
||||
}
|
||||
|
||||
div#byline {
|
||||
color: grey;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
div#tags {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
div#tags ul {
|
||||
padding-left: 0.5rem;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
div#tags ul li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
div#tags ul li a::before {
|
||||
content: "#";
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: palevioletred;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
padding-top: 1rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: palevioletred;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
color: lightblue;
|
||||
font-size: 0.9rem;
|
||||
margin: 0;
|
||||
padding-left: 0.5rem;
|
||||
border-left: 0.4rem solid lightblue;
|
||||
}
|
||||
|
||||
div#footer {
|
||||
padding: 2rem 0 2rem 0;
|
||||
}
|
||||
|
||||
div#footer p {
|
||||
color: grey;
|
||||
font-size: 0.9rem;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
+++
|
||||
title = 'Home'
|
||||
date = 2023-01-01T08:00:00-07:00
|
||||
draft = false
|
||||
+++
|
||||
|
||||
Laborum voluptate pariatur ex culpa magna nostrud est incididunt fugiat
|
||||
pariatur do dolor ipsum enim. Consequat tempor do dolor eu. Non id id anim anim
|
||||
excepteur excepteur pariatur nostrud qui irure ullamco.
|
||||
@@ -1,7 +0,0 @@
|
||||
+++
|
||||
title = 'Posts'
|
||||
date = 2023-01-01T08:30:00-07:00
|
||||
draft = false
|
||||
+++
|
||||
|
||||
Tempor est exercitation ad qui pariatur quis adipisicing aliquip nisi ea consequat ipsum occaecat. Nostrud consequat ullamco laboris fugiat esse esse adipisicing velit laborum ipsum incididunt ut enim. Dolor pariatur nulla quis fugiat dolore excepteur. Aliquip ad quis aliqua enim do consequat.
|
||||
@@ -1,10 +0,0 @@
|
||||
+++
|
||||
title = 'Post 1'
|
||||
date = 2023-01-15T09:00:00-07:00
|
||||
draft = false
|
||||
tags = ['red']
|
||||
+++
|
||||
|
||||
Tempor proident minim aliquip reprehenderit dolor et ad anim Lorem duis sint eiusmod. Labore ut ea duis dolor. Incididunt consectetur proident qui occaecat incididunt do nisi Lorem. Tempor do laborum elit laboris excepteur eiusmod do. Eiusmod nisi excepteur ut amet pariatur adipisicing Lorem.
|
||||
|
||||
Occaecat nulla excepteur dolore excepteur duis eiusmod ullamco officia anim in voluptate ea occaecat officia. Cillum sint esse velit ea officia minim fugiat. Elit ea esse id aliquip pariatur cupidatat id duis minim incididunt ea ea. Anim ut duis sunt nisi. Culpa cillum sit voluptate voluptate eiusmod dolor. Enim nisi Lorem ipsum irure est excepteur voluptate eu in enim nisi. Nostrud ipsum Lorem anim sint labore consequat do.
|
||||
@@ -1,10 +0,0 @@
|
||||
+++
|
||||
title = 'Post 2'
|
||||
date = 2023-02-15T10:00:00-07:00
|
||||
draft = false
|
||||
tags = ['red','green']
|
||||
+++
|
||||
|
||||
Anim eiusmod irure incididunt sint cupidatat. Incididunt irure irure irure nisi ipsum do ut quis fugiat consectetur proident cupidatat incididunt cillum. Dolore voluptate occaecat qui mollit laborum ullamco et. Ipsum laboris officia anim laboris culpa eiusmod ex magna ex cupidatat anim ipsum aute. Mollit aliquip occaecat qui sunt velit ut cupidatat reprehenderit enim sunt laborum. Velit veniam in officia nulla adipisicing ut duis officia.
|
||||
|
||||
Exercitation voluptate irure in irure tempor mollit Lorem nostrud ad officia. Velit id fugiat occaecat do tempor. Sit officia Lorem aliquip eu deserunt consectetur. Aute proident deserunt in nulla aliquip dolore ipsum Lorem ut cupidatat consectetur sit sint laborum. Esse cupidatat sit sint sunt tempor exercitation deserunt. Labore dolor duis laborum est do nisi ut veniam dolor et nostrud nostrud.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 19 KiB |
@@ -1,12 +0,0 @@
|
||||
+++
|
||||
title = 'Post 3'
|
||||
date = 2023-03-15T11:00:00-07:00
|
||||
draft = false
|
||||
tags = ['red','green','blue']
|
||||
+++
|
||||
|
||||
Occaecat aliqua consequat laborum ut ex aute aliqua culpa quis irure esse magna dolore quis. Proident fugiat labore eu laboris officia Lorem enim. Ipsum occaecat cillum ut tempor id sint aliqua incididunt nisi incididunt reprehenderit. Voluptate ad minim sint est aute aliquip esse occaecat tempor officia qui sunt. Aute ex ipsum id ut in est velit est laborum incididunt. Aliqua qui id do esse sunt eiusmod id deserunt eu nostrud aute sit ipsum. Deserunt esse cillum Lorem non magna adipisicing mollit amet consequat.
|
||||
|
||||

|
||||
|
||||
Sit excepteur do velit veniam mollit in nostrud laboris incididunt ea. Amet eu cillum ut reprehenderit culpa aliquip labore laborum amet sit sit duis. Laborum id proident nostrud dolore laborum reprehenderit quis mollit nulla amet veniam officia id id. Aliquip in deserunt qui magna duis qui pariatur officia sunt deserunt.
|
||||
@@ -1 +1,4 @@
|
||||
<p>Copyright {{ now.Year }}. All rights reserved.</p>
|
||||
<div id="footer">
|
||||
<p>© {{ now.Year }} by <a href="mailto:anne@minded.net">Anne</a> is licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a><img src="https://mirrors.creativecommons.org/presskit/icons/cc.svg" alt="" style="max-width: 1em;max-height:1em;margin-left: .2em;"><img src="https://mirrors.creativecommons.org/presskit/icons/by.svg" alt="" style="max-width: 1em;max-height:1em;margin-left: .2em;"><img src="https://mirrors.creativecommons.org/presskit/icons/nc.svg" alt="" style="max-width: 1em;max-height:1em;margin-left: .2em;"><img src="https://mirrors.creativecommons.org/presskit/icons/sa.svg" alt="" style="max-width: 1em;max-height:1em;margin-left: .2em;"></p>
|
||||
<p>Please feel free to share and reuse.</p>
|
||||
</div>
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
<h1>{{ site.Title }}</h1>
|
||||
<h1><a href="{{ .Site.BaseURL }}">{{ site.Title }}</a></h1>
|
||||
{{ partial "menu.html" (dict "menuID" "main" "page" .) }}
|
||||
|
||||
@@ -12,8 +12,7 @@ For a given taxonomy, renders a list of terms assigned to the page.
|
||||
|
||||
{{- with $page.GetTerms $taxonomy }}
|
||||
{{- $label := (index . 0).Parent.LinkTitle }}
|
||||
<div>
|
||||
<div>{{ $label }}:</div>
|
||||
<div id="tags">
|
||||
<ul>
|
||||
{{- range . }}
|
||||
<li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{{ define "main" }}
|
||||
{{ .Content }}
|
||||
{{ range site.RegularPages }}
|
||||
{{ range where site.RegularPages "Type" "posts"}}
|
||||
<section>
|
||||
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
|
||||
{{ .Summary }}
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
{{ define "main" }}
|
||||
<h1>{{ .Title }}</h1>
|
||||
|
||||
{{ $dateMachine := .Date | time.Format "2006-01-02T15:04:05-07:00" }}
|
||||
{{ $dateHuman := .Date | time.Format ":date_long" }}
|
||||
<time datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
|
||||
{{ $dateMachine := .Date | time.Format "2006-01-02" }}
|
||||
{{ $dateHuman := .Date | time.Format "2006-01-02" }}
|
||||
<div id="byline">
|
||||
<time datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
|
||||
{{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
|
||||
</div>
|
||||
|
||||
{{ .Content }}
|
||||
{{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
|
||||
{{ end }}
|
||||
|
||||
Reference in New Issue
Block a user