my linux nerd toolbox August 29, 2017

Geeks! Some of you asked for it, and I'm not –yet 😄– web-famous enough to be on usesthis, so here's a blog about my setup! Hope you find useful bits 🙂.

Without further ado: 🔥 🎆 🎇 my linux nerd toolbox 🎇 🎆 🔥 .

Hardware

As admirably summed up by Peter Welch, tech jobs rarely involve a "4700-hour week digging a tunnel under Mordor with a screwdriver", but damaging ourselves as little as possible doesn't seem like premature optimization. So,

  • TypeMatrix keyboards don't suck: narrow (thus bringing the mouse within closer reach), orthogonal, Enter + Backspace in the middle (thus accessible to both hands). Oh, and their blank (label-less) version helped forced me learn to touch-type, which you should totally do. Not sure about the orthogonal layout? Fine, but really, do yourself a service and buy a narrow/compact keyboard without numeric keypad, it makes for a more natural mouse position.
    • On the software side of keyboards, I roll with a custom xkb layout. No Dvorak for me, it's a vanilla US layout (for a. commonness and b. uncrazy brackets placement), spruced up with frequent-for-me characters behind the Alt dead key: local ones (French â é ê ô ù ), conveniences (→ ↔ ← ≠ ≥ © – —), and common emojis (👍 🙂 😄 😕). As to why a dead key making Alt+e into é is any better than, say, a US International layout converting 'e to é, it's because this 'e logic gets in my way when I need to type let animal = 'elk'. See that gist; it's a bit similar to that European layout.
  • A vertical Evoluent mouse that doesn't twist my wrist. Say that again? Friends don't let friends twist their wrist.
  • A big screen and beefed up font sizes in apps where I read a lot (email client, code editor, etc). I'm myopic, and can't help to occasionally bend my neck to get closer to the text. Getting a 27" screen at work accidentally solved a years-long shoulder/neck pain; I thought I had good ergonomics & posture, but it turns out I frequently unconsciously sat in terrible bent-forwards posture.
    • Also, no multi-monitor, it's a recipe for potentially long sessions with the head skewed towards a non-centered screen. I get along just fine on one fat monitor thanks to simple window/splits management and efficient window switching (read below about marathon).
  • Desk at a height that lets my forearms rest, monitors centered and just below my eyes (computer ergo 101).
  • Chair? At work, I thought I liked Aeron chairs, until I realized a simple sturdy & cushion-less chair supports my lower back even better. At home, a DIY standing desk. The sitting at work / standing at home yo-yo is 👍.

OS

Code

  • A general-purpose language to get things done: Python 3 is carried by a respectful community, pleasant, and featureful thanks to exhaustive stdlib and package selection accessed through the pip package manager.
    • I'm enjoying modern nodejs / TypeScript too, and am dabbling in Rust because the tech & community & attitude are giant balls of light. Babbled with löve, Unity and Godot for gamedev attempts, and will babble again.
    • Before inflicting a shell script upon earth, I reach for ShellCheck's help through a plugin for my $EDITOR.
    • Regular expressions are cool. Play with them on regex101.
  • REPL: Python → bpython/ptpython, node → Quokka.
  • These days, for an almost-IDE-like experience but lighter and more bendable, I like VS Code, with a few common extensions.
  • When $EDITOR wants ctags, I reach for universal-ctags, "a maintained ctags implementation".
  • The vvvery full-featured DBeaver helps me SQL.
  • To build interwebs, my framework of choice is—WHOA WAIT. This would be a worthless piece of information, as these things change faster than a request-response round-trip these days. I'll quietly pass by the flamewar, muttering that when I don't want to start a web project with (choices ✕ more choiceshey, other choices), my rules of thumb are to:
    • Pick popular-and-stable.js for good StackOverflow factor.
    • Roll with static when I can. This blog is built with obscure-but-oh-so-cute-and-hackable chisel. But ignore this and just pick the most popular static site generator for your favorite language.
    • Barf HTTP with vscode REST Client > Insomnia > httpie > cURL.

Short feedback loops everywhere

... or I go crazy. Things like automatically running tests/rebuilds on file changes (with entr or full-blown incrond), js Hot Reloading, or serving static HTML from the devd live-reloading http server.

Shell

The fish shell is {smart, full-featured, friendly} by default, and I spruce it up with fisherman plugins fisherman/fzf decors/fish-colored-man fisherman/anicode. That being said, out of the interactive shell I don't like the exoticism of fish as a scripting language; I keep preferring shebanged & shellchecked scripts, they're a stable and portable evil I know.

  • I like to run taoup on interactive shell startup.
  • Git: a few human aliases to interact with the borg, tig for a nice interactive text interface, diff-so-fancy for human-friendly diffs, and git bisect makes me cry tears of joy each time it lets me isolate the occasional case of hey-here's-this-regression-compared-to-our-last-version-published-six-months-ago-can-you-fix-it-now.
  • sudo-globally-installing python/node command-line tools invariably ends up in divorce with your package manager, so I install those locally:
    • python: pip install --user foo
    • node: npm i -g foo with export npm_config_prefix="$HOME/.node_modules"
    • ... then expose local binaries with export PATH="$HOME/.local/bin:$HOME/.node_modules/bin:$PATH").
  • Vanilla grep/find/cat are good, but ripgrep/fd/bat are I CANNOT EVEN.
  • manpages are good but tldrpages are terser.
  • After too much profanity towards the vanilla vi in a ssh-ed server, I mount a pseudo-local folder using sshfs, grin, and enjoy my local toolshed.
  • rsync for backup/deploy chores. Pronounced à la française: ère-cinq.
  • Shell used to happen in gnome-terminal + tmux, whose configuration and scrollback watness made me look a long time for a replacement. I wanted to love Tilix, but lack of scriptability and keyboard-friendliness made me look further, until I found the powerful and almost sane-by-default Kitty.
  • grc helps me colorize unhelpfully-white text.

Interwebs

Through Firefox, because Mozilla cares about the web & me more than The Goog. Nightly channel, to get features in my grubby hands 12 weeks earlier, at the cost of the occasional crash that I happily report to the fine folks at Mozilla.

Routers run OpenWrt and its awesome DNS-based ad/abuse domain blocking package, as baseline interjunk condom in vanilla browsers and mobile apps.

The tech interwebs I like are RSS through Feedly Pro (here's my diet), and HN. Then, to cut down on aimless FOMO addicto-HN-browsing, I enjoy the weekly/monthly newsletter format. For me it's hackernewsletter, Exponential View, Schneier, Frontend Focus, Pycoders Weekly, JS Weekly, but look at a selection and pick your poison. Real World News™ reaches me through the radio, which is 👌 while cooking or doing housework.

Desktop Environment

Is GNOME, for the simplicity and continued refinement, at the cost of designers occasionally sawing a UX branch I was sitting on.

  • Alt+Tab-ing, or clicking buttons on a bar, or using (gosh) an Activities menu are inefficient and distracting. I focus windows (usually full-screen or half-split) using my own little marathon which lets me bind keyboard shortcuts to focus/launch apps.
  • Shell's Super + {Left, Right} keyboard shortcuts makes for dead-simple window splits without going all the tiling-WM way.
  • Theme nits; Ctrl+Shift+I in any GTK3 app started with GTK_DEBUG=interactive to pop the inspector. Persist changes in ~/.config/gtk-3.0/gtk.css.
  • Nautilus scripts are nice to automate common file-contextual tasks.
  • Autokey for text expansion and simple X scripting.
  • A few UI changes with GNOME Tweaks, and a few GNOME extensions: Better OSD, Clipboard Indicator, Emoji Selector, Frippery Move Clock, GTK Title Bar, Impatience, K/AppIndicator Support, Mailnag, OpenWeather, Pomodoro.
  • Fonts? In my terminal & editor I like Ubuntu Mono, and for graphical I like Ubuntu Regular, whose thickness makes things super readable, or Droid Sans for horizontal compacity.
    • Hideous Arial, Verdana, Calibri and, gah, Courier New still used by many sites make my eyes bleed, so a fontconfig replace rule fixes that. Also, fontconfig emoji tweaks. Also, you want to set sexy default fonts in Firefox prefs.

Miscellaneous

  • Non-code creation:
  • Miscellaneousmiscellaneous :
    • Clementine is the only featureful-yet-suckless graphical Linux media player I tolerate (hail foobar in Windows-land). MUBI sells an awesome movie selection for CHEAP per month, and I get subtitles for the occasional illegal flick in seconds from VLC's VLSub extension.
    • When I want to bundle/isolate a heavy or privacy-intrusive webapp, nativefier behaves like I want. That is, opens links in my $BROWSER.
    • I help mom with TeamViewer.
    • Wine runs the occasional Windows app. Steam gaming happens on a dedicated Windows box, where an nvidia GPU doesn't mean death-by-driver-induced-madness.
    • Calibre to manage ebooks.
    • gcalcli to quickly add to my Google Calendar from the terminal.
    • To prune a full hard drive, (graphical) qdirstat or (term) ncdu.

Phew! Got one more magic trick to suggest? Please do, via twitter/email.

Lastly, writing this waaaay-too-long collection brought back to mind Ryan Dahl's "I hate almost all software" rant. So, a reminder (which I address to myself too): stay curious about craft & tools, but then move on and do stuff with them 🙂.


EDIT 2018-01-24 following discussion on r/Arch: added guetzli, dbeaver, fd, gcalcli, universal-ctags, qdirstat / ncdu.

EDIT 2018-04-14: moved from zsh to fish shell.

EDIT 2018-05-10: added Refined GitHub and grc. Added bat, discovered on Ask HN: What are your favorite terminal programs?

EDIT 2018-09-22: added offline Google Fonts.

EDIT 2018-09-25: replaced tmux + gnome-term with Kitty.

EDIT 2018-10-12: added fontconfig-based font replacement and fontconfig emoji tweaks.

EDIT 2018-11-02: replaced Shutter with my homebrew maim + zenity + inkscape screenshot script.

EDIT 2018-11-20: added arch-wiki-docs and arch-wiki-lite.

EDIT 2018-12-03: added yourduskquibbles/webannoyances list to the Firefox / uBlock section.

EDIT 2018-12-25: added a few Firefox addons: Pin Unpin Tab, Copy selection as Markdown, Redirector, Simple Tab Groups.

EDIT 2019-01-02: added OpenWrt & its adblock package.

EDIT 2019-01-08: added diff-so-fancy.

EDIT 2019-03-14: added Giflossy.

EDIT 2019-04-23: updated GNOME Shell extensions.

EDIT 2019-04-30: added taoup.

Comments and feedback welcome @ronjouch or by email.