Expanding Linux

This is the linux configuration of Expanding Man.

I use Manjaro Linux wherever possible. As of writing, I do not have a specialized installer, I typically start with the i3 minimal install and add what I need from there.

I have separate repositories for the main components.

Details

window manager

I recently switched to the Qtile window manager. Previously I had used i3 exclusively. While the simplicity of i3 was quite appealing, I found it deficient mainly because of two reasons. First, the lack of "layouts", a feature of many of the more recent window managers made having 2\gtrsim 2 windows on a single screen simultaneously all but unmanageable. Obviously, this is a huge problem for a window manager, but because I usually have multiple screens anyway and so frequently would use i3's tabs, I did not find it prohibitive. Second, though i3's IPC allows a great deal of flexibility, lack of sophisticated scripting functionality was limiting.

The main reason for the choice of Qtile is that it is apparently the only window manager which supports both X11 and Wayland with practically no switching overhead. I've mostly been stuck on X11 becuase most of my machines have nvidia GPU's but I want to move everything over to Wayland whenever this becomes practical (hopefully by the next generation of video cards AMD will be strictly better).

I am not fond of Python, in which Qtile is written, though a window manager is an infinitely more sane application for the language than, say, scientific/numerical computing. I've been toying with the idea of writing a window manager in Julia, especially since the backend source code of qtile provides such an excellent starting point for writing a WM that supports both X11 and Wayland, but this has not yet proceeded past idle speculation.

terminal

I mostly use alacritty, it is very lightweight and fast and its rendering looks nice.

More recently I've been experimenting with wezterm and will likely switch, since it has some much coveted featurees (especially sixel support) but it still occasionally has some weird problems with window managers so I haven't fully switched over yet.

The shell I use is fish with starship prompt. My fish config kept in this repo. I have the ability to bootstrap into fish with reasonable defaults for bash and zsh, see below.

Text editing is done with neovim with a setup which is written entirely in Lua and which has its own repository.

colors and appearance

I use the dracula theme for pretty much everything, including this site. I landed on this after having used solarized dark for a while but ultimately being driven near nausea from the dull, faded colors. I enjoy neon color schemes, of which dracula is an example, though not necessarily the best.

My use of dracula everywhere may lead you to conclude that I am in love with this theme. This is not the case. However, after multiple disastrous attempts to construct my own color scheme, I have a deep appreciation for how incredibly hard it is to create a good color scheme, particularly one you intend to use for code highlighting. At some point I'd like to either create or obtain a neon colorscheme I like better but for now, dracula it is.

I use the JuliaMono font for all monospaced fonts. This font has impeccable unicode support and clearly distinguished delimiters. For non-monospace fonts, I use Computer Modern font (serif where possible) which is the LaTeX font.

julia

I make frequent use of my favorite programming language, Julia. Julia is a fast, garbage-collected language with a novel runtime. It is developed largely with scientific and numerical computing in mind, and as such takes mathematical abstraction delightfully seriously. Despite its scientific roots, it is a true general purpose language. I normally use the Julia REPL either alongside or within nvim, with Revise.jl.

the Great Shell Bootstrap

I use fish which is not installed by default on most systems, but I also ssh into other systems or use docker images relatively frequently. Not having a properly configured shell can be scary, so I maintain a configuration for bash and zsh. The shell configuration is stratified thusly:

Each strata sources the one below it. Additionally, I use quite a few command line tools written in rust which are not initially present on most systems, and my configuration ensures they are present before setting them as default. Therefore, I can quickly achieve a reasonable setup on most systems in bash. On Arch I typically install the rust tools via the systme package manager, on other distros it's usually better to use rustup and cargo.

installer

I have written an installer in Julia. You should enter the installer with install.sh. The installer will launch you into a Julia REPL with various functions available to facilitate installation of various programs. When run interactively, various prompts will be given so that you can safely install new configs with full control over what gets overwritten. You can see a list of programs the installer can install and configure with install(), or see the list here.

An increasingly large number of programs I make use of are written in rust and are most easily installed with cargo install. I typically install rust through pacman, but for non-Arch it can be bootstrapped through the installer by installing the rustup init script via install(Programs.rust).

NOTE: The installer is intended for installing configurations and programs that some form of special setup. In cases where the package manager is sufficient for installation, it is much preferred.

You can install Julia itself to /opt/julia with sudo ./install.sh julia