"Life is all about sharing. If we are good at something, pass it on." - Mary Berry

How to create snippets in Helix?


Helix currently does not support snippets. However, there is a workaround to insert snippets using :insert-output to run a shell command. Still, this might not feel like the most natural way to work with snippets.

For instance, in GoLand, a similar feature called live templates allows you to type err and expand it into the following:

1if err != nil {

I wonder if I can archieve the same functionality in Helix by creating a simple language server


Reload Helix automatically after switching from lazygit


This is a continuation of the Helix series. In the previous posts, I shared methods to:

I also have a script to call lazygit from within Helix:

 3source wezterm-split-pane.sh
 5program=$(wezterm cli list | awk -v pane_id="$pane_id" '$3==pane_id { print $6 }')
 6if [ "$program" = "lazygit" ]; then
 7    wezterm cli activate-pane-direction down
 9    echo "lazygit" | wezterm cli send-text --pane-id $pane_id --no-paste


Helix: How to jump to the build error from the terminal output?


In my previous post, I shared how I run code in Helix, and today I’ve taken things a step further by integrating WezTerm into Helix. Now, after running the code, if I encountered errors or warnings, I can simply click on the corresponding file to open it in Helix at the specific line and column number.

Previously, I had to either look at the line number and navigate to that specific line or manually copy the file path and open it in Helix, which was somewhat cumbersome.


How I run code in Helix editor?


In my previous post, I mentioned that I’ve made the switch to WezTerm and Helix, and today I want to share how I run my code in this setup.

Previously, I would split Wezterm into two panes and run the code in a new pane. However, I found it cumbersome to type different commands for each programming language (Go, C, Racket, and so on). While auto-completion helped to some extent, or using control-p to run the previous command, it still took up a little time.


SICP Exercise 2.77: expected a procedure that can be applied to arguments, given #f


2.5.1 Generic Arithmetic Operations

Louis Reasoner tries to evaluate the expression (magnitude z) where z is the object shown in figure 2.24. To his surprise, instead of the answer 5 he gets an error message from apply-generic, saying there is no method for the operation magnitude on the types (complex).

To simplify the install-complex-package procedure, I made the following changes:

 1(define (install-complex-package)
 2  (define (make-from-real-imag x y)
 3		((get 'make-from-real-imag 'rectangular) x y))
 4	(define (tag z) (attach-tag 'complex z))
 5	(put 'make-from-real-imag 'complex
 6		(lambda (x y) (tag (make-from-real-imag x y))))
10(trace-define (make-complex-from-real-imag x y)
11	((get 'make-from-real-imag 'complex) x y))
13(magnitude (make-complex-from-real-imag 3 4))


Docker rootless keeps restarting?


As some of you may know, this blog is hosted on Raspberry Pi. To monitor its status, I wrote a script, which you can find here.

Recently, I decided to switch the Docker daemon to run in rootless mode. However, after making this change, I started receiving notifications indicating that the blog was frequently going offline.

Whenever this happens, I ssh into my Pi and run the command docker ps to list the running containers.


How I setup a new Macbook in 2023


I purchased my first MacBook Pro in 2013 prior to transitioning to remote work. In my job, we were using saltstack to build an automation tool. In order to delve deeper into Salt, I decided to configure my Macbook using it, and I documented the process here.

I also utilized this method to set up another Macbook for my older sister.

In 2018, due to work requirements, 8GB of memory proved insufficient to run Windows on VirtualBox, prompting me to acquire a second hand MacBook with 16GB of RAM.


A terminal UI for Taskwarrior


When I first started using Linux, I came across Taskwarrior, a command line tool for managing to-do lists. However, I never got around to using it extensively, mainly because there was no Android app available at the time, making it difficult to sync tasks from my phone.

I did experiment with taskwarrior-pomodoro but unfortunately, it wasn’t as effective as I had hoped.

Recently, though, I stumbled upon foreground, a new discovery that reignited my interest in Taskwarrior,


Load averages approximately 1000 on macOS?


Em “vợ” ra đời năm 2015, cưới về năm 2018, loa đã rè, pin đã chai.

Một ngày đẹp trời bật máy lên và không làm được gì. Load gần… 1000 (trong ảnh là sau khi đã restart, và hơn 30p sau mới gõ được w):

Load Averages 600

Mình thử khởi động lại thì mất khoảng 5-10p mới đến chỗ gõ password. Search thấy có bạn thay cable ổ cứng thì hết nhưng đời 2015 thì ổ cứng không có cable.


A simple terminal UI for ChatGPT


When I started learning Linux, I immediately fell in love with the terminal. I still remember the feeling of typing commands into the terminal, pressing Enter and seeing if I got the expected result. As a system administrator and DevOps engineer, I always wanted to do everything on the terminal.

The reasons are simple: it allowed me know what was happening behind the scenes, and it was faster than switching to other tools, and then back to the terminal to continue working.