diff --git a/.build.yml b/.build.yml new file mode 100644 index 0000000..3562911 --- /dev/null +++ b/.build.yml @@ -0,0 +1,58 @@ +image: alpine/edge +oauth: pages.sr.ht/PAGES:RW +packages: + - hut + - uv +environment: + site: ficd.sh + draft_site: draft.ficd.sh + proxy: ficd.srht.site + repo: ficd.sh + zona_repo: git+https://git.sr.ht/~ficd/zona + zona_ref: 71e541aa5e02a3e28a8b62bc7a1e609a9f6f7b78 +tasks: + - build: | + if [ "$GIT_REF" = "refs/heads/main" ]; then + cd $repo + uv run --with "${zona_repo}@${zona_ref}" zona build --output public + else + echo "Skipping build: not on main" + fi + + - build_draft: | + if [ "$GIT_REF" = "refs/heads/main" ]; then + cd $repo + uv run --with "${zona_repo}@${zona_ref}" zona build --output public-draft --draft + else + echo "Skipping build: not on main" + fi + + - package: | + if [ "$GIT_REF" = "refs/heads/main" ]; then + cd $repo/public + tar -cvz . > ../public.tar.gz + else + echo "Skipping package: not on main" + fi + + - package_draft: | + if [ "$GIT_REF" = "refs/heads/main" ]; then + cd $repo/public-draft + tar -cvz . > ../public-draft.tar.gz + else + echo "Skipping package: not on main" + fi + + - upload: | + if [ "$GIT_REF" = "refs/heads/main" ]; then + hut pages publish -d "$site" $repo/public.tar.gz + hut pages publish -d "$proxy" $repo/public.tar.gz + else + echo "Skipping upload: not on main" + fi + - upload_draft: | + if [ "$GIT_REF" = "refs/heads/main" ]; then + hut pages publish -d "$draft_site" $repo/public-draft.tar.gz + else + echo "Skipping upload: not on main" + fi diff --git a/config.yml b/config.yml index 16945ce..fef43fd 100644 --- a/config.yml +++ b/config.yml @@ -6,7 +6,6 @@ sitemap: Now: /now Git: /git Contact: /contact - Rss: /rss.xml ignore: - .git - .env diff --git a/content/about.md b/content/about.md index f5a0906..6db0e95 100644 --- a/content/about.md +++ b/content/about.md @@ -2,19 +2,16 @@ title: About --- -My name is Daniel, and I am a programmer, Linux enthusiast, and graduate student -of cybersecurity. My research interest is authentication, and I like programming -in Python and POSIX shell. I spend my free time writing code, tinkering, and -contributing to open-source projects. Feel free to [contact me](/contact) if you -want to see my resume or learn more about my work. +My name is Daniel, and I am a programmer, Linux enthusiast, and graduate +student of cybersecurity. My research interest is authentication, and I +like programming in Python and POSIX shell. I spend my free time writing +code, tinkering, and contributing to open-source projects. Feel free to +[contact me](/contact) if you want to see my resume or learn more about my +work. -[TOC] - -## My work - -I'm the author [zona] (a static site generator), [Ashen] (a color scheme), and a -number of [Kakoune plugins](/kakoune). Check my various [Git] forge profiles to -see my latest work. +I'm the author [zona] (a static site generator), [Ashen] (a color scheme), +and a number of [Kakoune] plugins. Check my various [Git] forge profiles +to see my latest work. [zona]: https://git.ficd.sh/ficd/zona [Git]: /git @@ -23,25 +20,25 @@ see my latest work. ## Education -I completed a Bachelor's of Computing (Honours) at Queen's University in 2024, -and I'm currently in the Master's of Science program at the School of Computing. -As part of the NSERC CREATE Cybersecurity program, my work combines programming, -cryptography, system design, and threat modeling to tackle real-world security -challenges. I'm currently working on my thesis, which introduces a novel method -of detecting signal relay attacks in the context of multi-factor authentication. +I completed a Bachelor's of Computing (Honours) at Queen's University in +2024, and I'm currently in the Master's of Science program at the School +of Computing. As part of the NSERC CREATE Cybersecurity program, my work +combines programming, cryptography, system design, and threat modeling to +tackle real-world security challenges. I'm currently working on my thesis, +which introduces a novel method of detecting signal relay attacks in the +context of multi-factor authentication. -## Things I use +## Stack I use [Kakoune] as my text editor, and I type in [Colemak-DH](https://colemakmods.github.io/mod-dh/) on a -[custom layout](https://git.ficd.sh/ficd/zmk). I run Arch Linux on a desktop PC -and ThinkPad, my preferred terminal is Foot, and I enjoy Niri as a window -manager. +[custom layout](https://git.ficd.sh/ficd/zmk). I run Arch Linux on a +desktop PC and ThinkPad, my preferred terminal is Foot, and I enjoy Niri +as a window manager. ## This Website This website is my personal blog and homepage. It's [JavaScript free](https://jsfree.org/), and registered on -[1mb.club](https://1mb.club/). The color scheme is [Ashen], and it was built -using [zona]. I'm working on a post describing my process for building it --- -stay tuned if you're interested. +[1mb.club](https://1mb.club/). The color scheme is [Ashen], and it was +built using [zona]. diff --git a/content/blog/ai-programming-survival.md b/content/blog/ai-programming-survival.md index 5ee662c..63a1df5 100644 --- a/content/blog/ai-programming-survival.md +++ b/content/blog/ai-programming-survival.md @@ -2,11 +2,9 @@ title: How I'm Surviving The AI Programming Epidemic date: Wed 09 Jul 2025 draft: true -description: | - My thoughts on AI programming, and my self-imposed rules and workflow when it comes - to AI integration. --- -This post should cover my thoughts about AI assisted programming, vibe-coding, -and my personal rules and workflow when it comes to AI integration to keep -myself from becoming reliant on it and to help myself keep learning. +This post should cover my thoughts about AI assisted programming, +vibe-coding, and my personal rules and workflow when it comes to AI +integration to keep myself from becoming reliant on it and to help myself +keep learning. diff --git a/content/blog/angels-and-wires.md b/content/blog/angels-and-wires.md index cabc6ef..83406d3 100644 --- a/content/blog/angels-and-wires.md +++ b/content/blog/angels-and-wires.md @@ -1,7 +1,6 @@ --- title: angels and wires date: 2025-07-16 -description: A poem about technology. And mushrooms. ---
diff --git a/content/blog/building-my-own-ssg.md b/content/blog/building-my-own-ssg.md index 4513357..0ee0ad6 100644 --- a/content/blog/building-my-own-ssg.md +++ b/content/blog/building-my-own-ssg.md @@ -2,8 +2,6 @@ title: Building My Own Static Site Generator date: 2025-07-10 draft: true -description: | - An overview of static site generators and my experience of developing Zona. --- *[SSG]: Static Site Generator @@ -19,73 +17,75 @@ description: | [^jd]: [jdugan6240.dev](https://jdugan6240.dev/posts/custom_site_generator.html#why) -[^long-sentence]: I disabled the "long sentences" linter in my grammar checker. - Take that for being unapologetic! +[^long-sentence]: I disabled the "long sentences" linter in my grammar + checker. Take that for being unapologetic! -[^small-web]: The "small web" is a way to collectively refer to independent, - home-made, personal websites --- often with a focus on creativity, - anti-capitalism, and technology. +[^small-web]: The "small web" is a way to collectively refer to + independent, home-made, personal websites --- often with a focus on + creativity, anti-capitalism, and technology. -Those of us in the open-source world tend to be very _passionate_ about what we -do — and passion often manifests itself in _blogging_. Rolling your own blogging -setup seems to be a rite of passage. It's a project of moderate complexity, fun, -and not particularly time-consuming. +Those of us in the open-source world tend to be very _passionate_ about +what we do — and passion often manifests itself in _blogging_. Rolling +your own blogging setup seems to be a rite of passage. It's a project of +moderate complexity, fun, and not particularly time-consuming. -Personal websites and blogs are very... personal. Why not maximize the control -we have over them? Many of the programmers I respect publish blogs using a -[homebrewed] SSG. I figured it was time to join them! +Personal websites and blogs are very... personal. Why not maximize the +control we have over them? Many of the programmers I respect publish blogs +using a [homebrewed] SSG. I figured it was time to join them! This article is about how (and why) I built [zona], the SSG that built and -rendered the blog post you're reading. Without any further ado, let's get into -it! +rendered the blog post you're reading. Without any further ado, let's get +into it! [TOC] ## Zonelets & Zoner -I don't remember how I found out about the small web,[^small-web], but I _do_ -recall how it immediately sparked something in me. As an autist with very -particular interests that's always struggled to fit in, the premise of having my -very own corner of the internet where I could unapologetically be myself without -fear of retribution from rude social-media commenters or being subject to the -whims of some grumpy content moderator was _very_ appealing to me.[^long-sentence] +I don't remember how I found out about the small web,[^small-web], but I +_do_ recall how it immediately sparked something in me. As an autist with +very particular interests that's always struggled to fit in, the premise +of having my very own corner of the internet where I could +unapologetically be myself without fear of retribution from rude +social-media commenters or being subject to the whims of some grumpy +content moderator was _very_ appealing to me.[^long-sentence] ## Reinventing The Wheel There's no shortage of excellent SSG tools out there. [Hugo] is fast, -configurable, and very popular. [Jekyll] is the default on GitHub pages, which -makes it _(I'm guessing)_ the most commonly-used SSG by a long shot. [Zola] is -tiny, dependency free, and _very_ flexible. +configurable, and very popular. [Jekyll] is the default on GitHub pages, +which makes it _(I'm guessing)_ the most commonly-used SSG by a long shot. +[Zola] is tiny, dependency free, and _very_ flexible. -You can certainly build some awesome blogs with these tools, and customize them -as much as you want. For example, my friend Alisa uses [Zola] to publish -[her blog](https://axlefublr.github.io/), which is a great example of how a -minimal website can truly shine with the right styling and customization. +You can certainly build some awesome blogs with these tools, and customize +them as much as you want. For example, my friend Alisa uses [Zola] to +publish [her blog](https://axlefublr.github.io/), which is a great example +of how a minimal website can truly shine with the right styling and +customization. -So: if there's such an abundance of great static site generators, why did I -write my own? JD[^jd], a fellow Kakoune enjoyer, puts it well: +So: if there's such an abundance of great static site generators, why did +I write my own? JD[^jd], a fellow Kakoune enjoyer, puts it well: > 1. It's a good learning experience \[...\] -> 2. Many static site generators are complex and take time to learn to configure -> \[...\] -> 3. A custom solution grants complete control over how exactly the site is -> generated \[...\] +> 2. Many static site generators are complex and take time to learn to +> configure \[...\] +> 3. A custom solution grants complete control over how exactly the site +> is generated \[...\] -My main motivation for starting work on [zona] was the third point: **complete -control**. I don't think being a control freak makes me an outlier among Linux -users — why else would we be breaking our operating system near-daily, if not -for some obsessive customization? +My main motivation for starting work on [zona] was the third point: +**complete control**. I don't think being a control freak makes me an +outlier among Linux users — why else would we be breaking our operating +system near-daily, if not for some obsessive customization? -It's happened very often that I find some tool I like, and during the process of -tweaking it, I find _something_ that can't be changed --- which ends up -bothering me immensely. I figured that I'd rather avoid this experience while -writing my own blog. This way, if something is missing, it's my fault, and no -one else's. +It's happened very often that I find some tool I like, and during the +process of tweaking it, I find _something_ that can't be changed --- which +ends up bothering me immensely. I figured that I'd rather avoid this +experience while writing my own blog. This way, if something is missing, +it's my fault, and no one else's. ## Requirements -The features I implemented in [zona] are informed by what I want from my own -blog. The primary user is myself, after all! I knew I wanted: +The features I implemented in [zona] are informed by what I want from my +own blog. The primary user is myself, after all! I knew I wanted: - Writing in Markdown with as little embedded HTML as possible. - A convenient live preview. @@ -96,6 +96,6 @@ blog. The primary user is myself, after all! I knew I wanted: ## Snakes Eating Gophers: A Valiant First Attempt -I started work on [zona] in October, 2024. At this point, I had written a few -(smaller) projects in Go, and I wanted to work on something more complicated to -learn the language better. +I started work on [zona] in October, 2024. At this point, I had written a +few (smaller) projects in Go, and I wanted to work on something more +complicated to learn the language better. diff --git a/content/blog/building-this-site.md b/content/blog/building-this-site.md index 37797fd..5b83aab 100644 --- a/content/blog/building-this-site.md +++ b/content/blog/building-this-site.md @@ -1,7 +1,6 @@ --- title: Building This Site date: 2025-04-10 -description: Short post about why I'm publishing this website. --- I care about thoughtful design, and forcing your visitors to download dozens of diff --git a/content/blog/email-formatting.md b/content/blog/email-formatting.md index 0f76c7d..e712cc7 100644 --- a/content/blog/email-formatting.md +++ b/content/blog/email-formatting.md @@ -1,9 +1,6 @@ --- title: Email Formatting Is Harder Than It Looks date: 2025-07-14 -description: | - A detailed overview of plain-text email formatting, what makes it deceptively - hard, and how I wrote mailfmt. --- *[UTF-8]: Unicode Transformation Format – 8 bit. Text encoding standard. diff --git a/content/blog/email-in-helix.md b/content/blog/email-in-helix.md index e850edc..851d39c 100644 --- a/content/blog/email-in-helix.md +++ b/content/blog/email-in-helix.md @@ -1,7 +1,6 @@ --- title: Writing Emails In Helix date: 2025-05-29 -description: Tutorial on configuring Helix for email composition. --- This article is all about writing emails in Helix. Obviously, Helix isn't an diff --git a/content/blog/email-in-kakoune.md b/content/blog/email-in-kakoune.md index 0ba3ad3..fb23e83 100644 --- a/content/blog/email-in-kakoune.md +++ b/content/blog/email-in-kakoune.md @@ -1,20 +1,20 @@ --- title: Writing Emails In Kakoune date: 2025-06-01 -description: Tutorial on configuring Kakoune for email reading & composition. --- -This post will guide you through my setup for using Kakoune as an email composer -inside `aerc`. I'll also explain how to configure Kakoune to act as the _pager_ -for reading `text/plain` emails. If you only care about the final config, feel -free to skip to it [here](#final-configuration). +This post will guide you through my setup for using Kakoune as an email +composer inside `aerc`. I'll also explain how to configure Kakoune to act +as the _pager_ for reading `text/plain` emails. If you only care about the +final config, feel free to skip to it [here](#final-configuration). [TOC] ## Naive Approach -Since `aerc` uses your `$EDITOR` for composition, you don't technically have to -do anything. I prefer setting it explicitly in `aerc.conf`, for good measure: +Since `aerc` uses your `$EDITOR` for composition, you don't technically +have to do anything. I prefer setting it explicitly in `aerc.conf`, for +good measure: ```ini [compose] @@ -25,8 +25,9 @@ The rest of the magic happens in your `kakrc`. ## Composer Setup -Essentially, we want to hook `filetype=mail` and set our buffer configuration -there. I'll share a recommended configuration with some explanation. +Essentially, we want to hook `filetype=mail` and set our buffer +configuration there. I'll share a recommended configuration with some +explanation. ```kak hook global WinSetOption filetype=mail %~ @@ -41,51 +42,53 @@ hook global WinSetOption filetype=mail %~ ~ ``` -I use a custom formatter to format emails. It automatically hard-wraps lines -while preserving certain markup elements, code blocks, sign-offs, and signature -blocks. For more details, check the formatting section of my post on -[Helix](/blog/email/helix#formatting). +I use a custom formatter to format emails. It automatically hard-wraps +lines while preserving certain markup elements, code blocks, sign-offs, +and signature blocks. For more details, check the formatting section of my +post on [Helix](/blog/email/helix#formatting). -I find that setting `>` as the `comment_line` token is convenient for working -with quotes in replies. +I find that setting `>` as the `comment_line` token is convenient for +working with quotes in replies. The `try autospell-enable` enables my -[kak-autospell](https://codeberg.org/ficd/kak-autospell) plugin for the buffer. -Essentially, it provides spellchecking that's continuously refreshed and hidden -in insert mode. +[kak-autospell](https://codeberg.org/ficd/kak-autospell) plugin for the +buffer. Essentially, it provides spellchecking that's continuously +refreshed and hidden in insert mode. -The remaining commands configure auto-formatting on save. I always prefer having -this on so I never forget to format my message before sending it. +The remaining commands configure auto-formatting on save. I always prefer +having this on so I never forget to format my message before sending it. ## Reader Setup -I find that using Kakoune to **read** emails is helpful because of how easy it -is to copy quotes, open links, etc. Configuring this is a tad hackier, however. -The basic idea is to set Kakoune as the viewer `pager` in `aerc.conf`. +I find that using Kakoune to **read** emails is helpful because of how +easy it is to copy quotes, open links, etc. Configuring this is a tad +hackier, however. The basic idea is to set Kakoune as the viewer `pager` +in `aerc.conf`. -However, all this does is pipe the email to `kak` through standard input, so we -need to tell the editor to treat it like an email: +However, all this does is pipe the email to `kak` through standard input, +so we need to tell the editor to treat it like an email: ```ini [viewer] pager=kak -e 'set buffer filetype mail' ``` -When you're using Kakoune as a pager, you'll probably want to configure some -things differently. In my case, I like to set the buffer as `readonly`, remove -the `number-lines` and `show-whitespaces` highlighters, disable soft-wrap & my -scrolloff settings, and _not_ set any formatters. +When you're using Kakoune as a pager, you'll probably want to configure +some things differently. In my case, I like to set the buffer as +`readonly`, remove the `number-lines` and `show-whitespaces` highlighters, +disable soft-wrap & my scrolloff settings, and _not_ set any formatters. -The `pager` command above sets the filetype, but we need to distinguish between -_composing_ and _reading_ in our Kakoune hook. When Kakoune is opened with input -through standard input, it loads a buffer that's conveniently named `*stdin*`. -Thus, we can check the buffer name before continuing. +The `pager` command above sets the filetype, but we need to distinguish +between _composing_ and _reading_ in our Kakoune hook. When Kakoune is +opened with input through standard input, it loads a buffer that's +conveniently named `*stdin*`. Thus, we can check the buffer name before +continuing. -If we're in "reading mode", we define a hidden command called `ismailreader` -which doesn't do anything. Why? If the command is defined, and we try to invoke -it... well, nothing happens! But if it's **not** defined, we get an error -instead. We can combine this with the `try` command to for some simple boolean -logic. +If we're in "reading mode", we define a hidden command called +`ismailreader` which doesn't do anything. Why? If the command is defined, +and we try to invoke it... well, nothing happens! But if it's **not** +defined, we get an error instead. We can combine this with the `try` +command to for some simple boolean logic. ```kak evaluate-commands %sh{ diff --git a/content/blog/implementing-kakoune-syntax-highlighting.md b/content/blog/implementing-kakoune-syntax-highlighting.md index 36b5a19..b4a1be5 100644 --- a/content/blog/implementing-kakoune-syntax-highlighting.md +++ b/content/blog/implementing-kakoune-syntax-highlighting.md @@ -1,7 +1,6 @@ --- title: Implementing Kakoune Syntax Highlighting In Pygments date: July 04, 2025 -description: An account of my implementation of a Kakoune lexer in Pygments. --- As a programmer, one thing I care about a _lot_ is syntax highlighting. In fact, @@ -109,5 +108,4 @@ own projects. [Kakoune]: https://kakoune.org [Helix]: https://github.com/helix-editor/helix [Pygments]: https://pygments.org/ - *[SSG]: Static Site Generator diff --git a/content/blog/index.md b/content/blog/index.md index bcca928..ed48c47 100644 --- a/content/blog/index.md +++ b/content/blog/index.md @@ -4,4 +4,7 @@ template: post_list post: false --- -Likely topics: text editors, command line, Linux, and programming. +Welcome to my blog. Expect to find posts about Linux, text editors, and +programming. If you have questions about something I've written, please +[contact](/contact) me. + diff --git a/content/blog/kak/markdown-formatter-ignore.md b/content/blog/kak/markdown-formatter-ignore.md index 27ef61c..0931b3f 100644 --- a/content/blog/kak/markdown-formatter-ignore.md +++ b/content/blog/kak/markdown-formatter-ignore.md @@ -2,9 +2,7 @@ title: "Kakoune: Markdown Formatter Ignore" date: 2025-07-09 draft: true -description: | - An account of Markdown formatter pre-processing. In Kakoune, just because. --- -This post about the markdown formatting mini-plugin I wrote which can ignore -block images by regex. +This post about the markdown formatting mini-plugin I wrote which can +ignore block images by regex. diff --git a/content/blog/kak/url-open.md b/content/blog/kak/url-open.md index 3cb475d..9b88232 100644 --- a/content/blog/kak/url-open.md +++ b/content/blog/kak/url-open.md @@ -1,16 +1,14 @@ --- title: Opening URLs In Kakoune date: 07 Jul 2025 -description: | - A brief post about how I implemented URL opening in Kakoune. --- [Kakoune]: https://kakoune.org -One feature built into [Helix](https://docs.helix-editor.com/) is the ability to -super-easily open URLs in your browser. All you need to do is move your cursor -over a URL, and press `gf`. This is _very_ helpful when reading documentation, -emails, et cetera... +One feature built into [Helix](https://docs.helix-editor.com/) is the +ability to super-easily open URLs in your browser. All you need to do is +move your cursor over a URL, and press `gf`. This is _very_ helpful when +reading documentation, emails, et cetera... So, how can we do this in [Kakoune]? @@ -26,15 +24,16 @@ Here's our target user experience: 4. The user is notified of any errors or success. Like any bit of custom functionality, the best way to go is to define a -**command**. This gives us re-usability, and greater flexibility (since `map` -only allows mapping to _key sequences_, not any arbitrary string of commands). +**command**. This gives us re-usability, and greater flexibility (since +`map` only allows mapping to _key sequences_, not any arbitrary string of +commands). ## Selecting -First, we need to find the URL under the cursor. Of course, if there _isn't_ -one, we should fail at this step. The standard way to do this in Kakoune is by -using a regular expression to filter the selection. If there's no matches at -all, that's something we can `try/catch`. +First, we need to find the URL under the cursor. Of course, if there +_isn't_ one, we should fail at this step. The standard way to do this in +Kakoune is by using a regular expression to filter the selection. If +there's no matches at all, that's something we can `try/catch`. We won't get far without a URL regex. When I'm including long regexes in `#!kak execute-keys` commands, I like saving them to a register, like so: @@ -43,23 +42,24 @@ We won't get far without a URL regex. When I'm including long regexes in set-register b 'https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)' ``` -Then, we just need to check if this regex exists around the user's cursor. Since -URLs don't have spaces, we can select the surrounding `WORD`, and filter from -there: +Then, we just need to check if this regex exists around the user's cursor. +Since URLs don't have spaces, we can select the surrounding `WORD`, and +filter from there: ```kak execute-keys -draft 'sb"ay' ``` -The above command selects the outer `WORD`, then runs the select command with -our regex (stored in register `b`). Once the URL has been selected, it's copied -to the `a` register. If there is no URL, the command fails. +The above command selects the outer `WORD`, then runs the select command +with our regex (stored in register `b`). Once the URL has been selected, +it's copied to the `a` register. If there is no URL, the command fails. ## Cleaning -It's usually better to allow regex to be a bit greedier, and then filter -unwanted characters out of the result. In our case, some trailing punctuation is -included in the capture -- we can use `sed` in a shell block to strip them. +It's usually better to allow regex to be a bit greedier, and then +filter unwanted characters out of the result. In our case, some +trailing punctuation is included in the capture -- we can use `sed` +in a shell block to strip them. ```sh clean_url="$(echo "$kak_reg_a" | sed 's/[][(){}.,;!?]*$//')" @@ -67,37 +67,37 @@ clean_url="$(echo "$kak_reg_a" | sed 's/[][(){}.,;!?]*$//')" ## Opening -Our next step is to figure out how we'd open a URL from the shell -- after all, -anything we implement in Kakoune ends up running shell commands! If you have -`xdg-open` available (part of the `xdg-utils` package on Arch Linux), this is -simple: +Our next step is to figure out how we'd open a URL from the shell -- +after all, anything we implement in Kakoune ends up running shell +commands! If you have `xdg-open` available (part of the `xdg-utils` +package on Arch Linux), this is simple: ```sh xdg-open https://ficd.sh ``` -XDG handles figuring out the correct application to forward the URL to. If your -environment is set up properly, this is probably your default browser. If you -don't have (or don't want to use) `xdg-open`, most browsers let you open URLs -from the command line directly: +XDG handles figuring out the correct application to forward the URL to. If +your environment is set up properly, this is probably your default +browser. If you don't have (or don't want to use) `xdg-open`, most +browsers let you open URLs from the command line directly: ```sh firefox https://ficd.sh ``` -Depending on the browser -- if you already have an open session, the link will -be opened as a new tab in an existing window. Nice! +Depending on the browser -- if you already have an open session, the link +will be opened as a new tab in an existing window. Nice! -Let's define an **option** which contains the shell command we'll use to open -the link: +Let's define an **option** which contains the shell command we'll +use to open the link: ```kak # %s gets replaced with the URL declare-option str url_open_cmd 'xdg-open %s' ``` -Then, in our shell block, we can substitute the cleaned URL into the `%s` format -specifier, and evaluate the resulting string as a command: +Then, in our shell block, we can substitute the cleaned URL into the `%s` +format specifier, and evaluate the resulting string as a command: ```sh if eval "$(printf "$kak_opt_url_open_cmd" "$clean_url")" >/dev/null 2>&1; then @@ -109,8 +109,8 @@ fi ## Completed Plugin -That's it, that's all! We now have a command called `url-open`, which we can -easily bind to something like `gu`: +That's it, that's all! We now have a command called `url-open`, +which we can easily bind to something like `gu`: ```kak map global goto u ': url-open' @@ -148,3 +148,4 @@ define-command -docstring %{ } } ``` + diff --git a/content/blog/mirror-srht-to-github.md b/content/blog/mirror-srht-to-github.md index 675ae09..439b42b 100644 --- a/content/blog/mirror-srht-to-github.md +++ b/content/blog/mirror-srht-to-github.md @@ -1,7 +1,6 @@ --- title: Automatically Mirror Sr.ht To GitHub date: 2025-05-15 -description: Brief tutorial on setting up automatic mirroring from sr.ht to github. --- For a variety of reasons, I've recently migrated to [sr.ht](https://sr.ht/~ficd) diff --git a/content/blog/on-websites.md b/content/blog/on-websites.md index 2def2f2..6d6233d 100644 --- a/content/blog/on-websites.md +++ b/content/blog/on-websites.md @@ -1,7 +1,6 @@ --- title: On Websites (Or The Case For The Personal Web) date: 2025-05-05 -description: My thoughts on websites, DIY, and the small web. --- ## Preamble diff --git a/content/blog/rediscovering-email.md b/content/blog/rediscovering-email.md index e99d55e..fc830ad 100644 --- a/content/blog/rediscovering-email.md +++ b/content/blog/rediscovering-email.md @@ -1,7 +1,6 @@ --- title: Rediscovering Email date: 2025-03-24 -description: My experience of delving into email. Nerdily. --- ## Preamble diff --git a/content/blog/text-editing-matters.md b/content/blog/text-editing-matters.md index f2a3474..bf77586 100644 --- a/content/blog/text-editing-matters.md +++ b/content/blog/text-editing-matters.md @@ -2,14 +2,14 @@ title: Why Text Editing Matters date: Wed 09 Jul 2025 draft: true -description: A manifesto on why we should care about our text editing experience. --- -This post will gather my thoughts in general about why text editing, and caring -about your text editor experience, really matters, especially for programmers -and writers. +This post will gather my thoughts in general about why text editing, and +caring about your text editor experience, really matters, especially for +programmers and writers. -- Keep this less focused on any particular editor, and more about the general - principles of why modal editing is cool and the ideological/personal reasons I - have for caring so much about my editor. Can reference vim & kakoune but the - kakoune deep-dive will get its own post. +- Keep this less focused on any particular editor, and more about the + general principles of why modal editing is cool and the + ideological/personal reasons I have for caring so much about my editor. + Can reference vim & kakoune but the kakoune deep-dive will get its own + post. diff --git a/content/blog/the-lovecraftian-internet.md b/content/blog/the-lovecraftian-internet.md index ace2252..db71705 100644 --- a/content/blog/the-lovecraftian-internet.md +++ b/content/blog/the-lovecraftian-internet.md @@ -1,7 +1,6 @@ --- title: The Lovecraftian Internet date: 2025-04-05 -description: Brief post about how the internet is very, very big. --- The web we know is spun by gluttonous spiders no longer satiated by flies and diff --git a/content/blog/why-kakoune.md b/content/blog/why-kakoune.md index f94b38b..8495155 100644 --- a/content/blog/why-kakoune.md +++ b/content/blog/why-kakoune.md @@ -2,7 +2,7 @@ title: Why Kakoune? date: July 6, 2025 draft: true -description: Detailing my experience with Kakoune and why I think it's so great. --- Blog post explaining why I switched to and really enjoy using Kakoune. + diff --git a/content/git.md b/content/git.md index b036b06..2bc468e 100644 --- a/content/git.md +++ b/content/git.md @@ -7,26 +7,14 @@ title: Git [codeberg]: https://codeberg.org/ficd [github]: https://github.com/ficcdaf -## forge profiles - -My main forge for projects on which I expect to _collaborate_ is [codeberg]. I -[self-host a Forgejo instance](https://git.ficd.sh/ficd) for my personal -projects. I have repositories on [git.sr.ht], but I'm currently in the process -of migrating to [codeberg] -- don't expect the old repositories to stay -mirrored. Finally, I use [github] _only_ if I'm contributing to a project hosted -there. +My main forge for projects on which I expect to _collaborate_ is +[codeberg]. I [self-host a Forgejo instance](https://git.ficd.sh/ficd) for +my personal projects. I have repositories on [git.sr.ht], but I'm +currently in the process of migrating to [codeberg] -- don't expect the +old repositories to stay mirrored. Finally, I use [github] _only_ if I'm +contributing to a project hosted there. - [git.ficd.sh] (self-hosted) - [codeberg] - [git.sr.ht] - [github] - -## selected projects - -Here are some of my projects you may be interested in. To see the rest, please -check my [profiles](#forge-profiles). - -- [kakoune plugins](/kakoune) -- [zona](https://git.ficd.sh/ficd/zona) -- [ashen](https://codeberg.org/ficd/ashen) -- [`mailfmt`](https://git.ficd.sh/ficd/mailfmt) diff --git a/content/kakoune.md b/content/kakoune.md deleted file mode 100644 index 08745d4..0000000 --- a/content/kakoune.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Kakoune ---- - -[Kakoune]: https://kakoune.org - -Here is a list of [Kakoune]-related software I've written: - -[TOC] - -## `pygments-kakoune` - -An implementation of Kakoune command lexing for the Pygments syntax highlighting -library. [Repo](https://codeberg.org/ficd/pygments-kakoune) - -## `kak-ashen` - -Implementation of [Ashen](https://codeberg.org/ficd/ashen) for Kakoune. -[Repo](https://codeberg.org/ficd/kak-ashen) - -## `kak-search-highlight` - -Plugin for interactively highlighting search terms in Kakoune. -[Repo](https://codeberg.org/ficd/kak-search-highlight) - -## `kak-ltex-dictionary` - -Hack implementing "add to dictionary" functionality for -[`ltex-ls`](https://github.com/ltex-plus/ltex-ls-plus) through `kakoune-lsp`. -[Repo](https://codeberg.org/ficd/kak-ltex-dictionary) - -## `kak-autospell` - -Small plugin to make working with Kakoune `stdlib`'s `spell`' plugin more -convenient. [Repo](https://codeberg.org/ficd/kak-autospell) - -## `kak-fish` - -Implementation of `fish %{...}` command evaluation for Kakoune. -[Repo](https://codeberg.org/ficd/kak-fishr) - -## `kak-title-bar` - -Plugin implementing a live buffer list as the terminal window title. -[Repo](https://codeberg.org/ficd/kak-title-bar) - -## `kak-lsp-diags` - -Companion plugin to `kakoune-lsp` adding inlay diagnostics on hover support. -[Repo](https://codeberg.org/ficd/kak-lsp-diags) - -## `byline.kak` - -Fork of [`byline.kak`](https://github.com/evanrelf/byline.kak) (which adds -Helix-like behavior to `x` and `X`) --- improving performance by 17 times. -[Repo](https://codeberg.org/ficd/byline.kak)