June 27th 2026 - Things I Worked On

Added local environments to Hith

Hith now has local environments so scoping can be added.

If a symbol isn't found in the current environment then we recursively check the parent environment until we find the symbol. If we reach the top-most environment and the symbol still isn't found we return None. In the future we should return a descriptive error message.

class Env:

    def __init__(self, variables, parent):
        self.variables = variables
        self.parent = parent

    def symbol_value(self, symbol):
        if symbol.startswith("'"):
            symbol = symbol[1:]

      if symbol in self.variables.data:
          return self.variables.data[symbol]
      elif self.parent:
          return self.parent.symbol_value(symbol)
      else:
          return None

    def defvar(self, name, value):
        self.variables.data[name] = value
        return name

    def clear_variables(self):
        self.variables.clear()

Qutebrowser

Qutebrowser is a keyboard-driven, chrome-based, web browser. I heard about it at an org-meetup event. I wanted to build it from source and try configuring it. Here's my journey.

Building and running Qutebrowser from source:

Git clone the repo:

git@github.com:qutebrowser/qutebrowser.git

Run this to create the python environment:

python3 scripts/mkvenv.py

Run qutebrowser:

.venv/bin/python3 -m qutebrowser

Generate documentation:

.venv/bin/python3 scripts/asciidoc2html.py

My configuration so far:

import doom_one_theme

config.load_autoconfig(False)

def config_bindings():
    config.bind("Meta-shift-r", "config-source", mode="normal")


def editor():
    # This doesn't work and I don't know why yet
    c.editor.command = ["vim", "-f", "{file}", "-c" "normal {line}G{column0}l"]

def theme():
    doom_one_theme.setup(c, {
        "spacing": {
            "vertical": 5,
            "horizontal": 5
        }
    })

    c.colors.webpage.darkmode.enabled = True


def command():
    config.bind("<Meta-x>", "cmd-set-text :", mode="normal")


def tabs():
    config.unbind("K",              mode="normal")
    config.unbind("J",              mode="normal")
    config.unbind("d",              mode="normal")
    config.unbind("u",              mode="normal")
    config.unbind("<Ctrl-Shift-t>", mode="normal")
    config.unbind("O",              mode="normal")

    config.bind("<Meta-Alt-left>",  "tab-prev",  mode="normal")
    config.bind("<Meta-Alt-right>", "tab-next",  mode="normal")
    config.bind("<Meta-w>",         "tab-close", mode="normal")
    config.bind("<Meta-Shift-t>",   "undo",      mode="normal")
    config.bind("<Meta-t>",         "open -t",   mode="normal")


def navigation():
    config.unbind("H", mode="normal")
    config.unbind("L", mode="normal")

    config.bind("<Meta-left>",  "back",    mode="normal")
    config.bind("<Meta-right>", "forward", mode="normal")


config_bindings()
editor()
theme()
command()
tabs()
navigation()

Added browsing to elfeed entry article link

(defun my/elfeed-open-entry-in-browser ()
  "Open the current entry in default browser."
  (interactive)
  (if (derived-mode-p 'elfeed-show-mode)
      (elfeed-show-visit)
    (user-error "Can't open entry in browser because not in elfeed-show-mode")))

(evil-leader/set-key
  "e b" 'my/elfeed-open-entry-in-browser)