Compare commits
14 Commits
055b288d98
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 0b5411c6bd | |||
| e9e56da86c | |||
| d8b3064f13 | |||
| e05401e20a | |||
| 5daa1e5f3a | |||
| 53cedfb96b | |||
| 129dc0889c | |||
| 8928f88b68 | |||
| f2a88fbb60 | |||
| 58406a9038 | |||
| 3b9f0c91b9 | |||
| e597e8f981 | |||
| 3660cabe34 | |||
| bcb75d526b |
@@ -2,12 +2,12 @@
|
||||
title = "About"
|
||||
author = ["Anne"]
|
||||
date = 2025-10-31T00:00:00+01:00
|
||||
lastmod = 2025-10-31T22:30:55+01:00
|
||||
lastmod = 2025-11-01T14:15:45+01:00
|
||||
draft = false
|
||||
url = "/about"
|
||||
+++
|
||||
|
||||
Hi there --- and welcome!
|
||||
## 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.
|
||||
|
||||
@@ -25,8 +25,8 @@ Thanks for stopping by --- stay curious!
|
||||
|
||||
x Anne
|
||||
|
||||
---
|
||||
|
||||
P.S. if you're wondering...
|
||||
### 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)))
|
||||
```
|
||||
@@ -1,20 +1,20 @@
|
||||
+++
|
||||
title = "Hello World!"
|
||||
author = ["Anne"]
|
||||
date = 2025-10-31T00:00:00+01:00
|
||||
lastmod = 2025-10-31T22:19:35+01:00
|
||||
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! {#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 and figured out how to set up and manage my own mail server on Linux.
|
||||
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
|
||||
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>).
|
||||
@@ -5,7 +5,8 @@ html {
|
||||
body {
|
||||
line-height: 1.5;
|
||||
max-width: 768px;
|
||||
margin: 1rem;
|
||||
margin: auto;
|
||||
padding: 0 1rem 0 1rem;
|
||||
font-family: Tahoma, Verdana, Arial, sans-serif;
|
||||
color: lightgray;
|
||||
}
|
||||
@@ -38,12 +39,18 @@ nav ul li a {
|
||||
color: violet;
|
||||
}
|
||||
|
||||
div#tags div {
|
||||
div#byline {
|
||||
color: grey;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
div#tags {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
div#tags ul {
|
||||
padding: 0;
|
||||
padding-left: 0.5rem;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
div#tags ul li {
|
||||
@@ -59,6 +66,30 @@ a {
|
||||
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 +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>
|
||||
|
||||
@@ -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,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