TL;DR:
Problem: I ran into a bug where my computer wallpaper was changing every five
seconds whenever my init.el file was open and I was typing in it.
Short-term solution: Disable flycheck.
Long-term solution: Disable flycheck just for Elisp or just for init.el in
Elisp.
Post Mortem:
Warning: If you have flycheck-emacs-lisp-initialize-packages set to auto or
really anything other than nil, than the emacs-lisp flycheck-checker will spin
up a new Emacs instance, and evaluate all of the Elisp in init.el.
Why does this matter? Well, if like me, you have code anywhere in your
init.el (and any files downstream from init.el), that code will get evaluated
not just twice. But countless times... tens, hundreds, w/e. So... while you
might think you have code that is just running at startup this code will be
called incessantly.
As a dramatic, contrived example, if you had something like...
```elisp
(bank/send :amount 100 :to "wpcarro@gmail.com")
```
...anywhere in that your init.el would evaluate, you may end up sending
wpcarro@gmail.com millions of dollars. To make debugging this problem a bit more
complicated is that because this runs in a separate Emacs instance, you can't do
something like...
```elisp
(defvar already-evaluated? nil)
(unless already-evaluated? (bank/send :amount 100 :to "wpcarro@gmail.com"))
(setq already-evaluated? t)
```
...since the `already-evaluated?` variable will be local to the Emacs
instance. So if you needed a mechanism to ensure code like this runs only once,
you would need a way to share this semaphore across Emacs instances --
e.g. writing to and reading from disk.
I'm sure that there is a fish package that supports git aliases or
abbreviations. This time, I'm preferring to write my own.
Side note: The more that I use fish's abbreviations, the less that I like them
-- at least for the way in which I'm using them.
Google-related files should eventually be moved out of GitHub hosting and onto
Google infrastructure (e.g. Git on Borg).
When I do this, I should run:
```fish
> git grep --ignore-case google (git rev-list --all)
```
To assess the reference I've introduced into this repository.
Other tools that should come in handy when I do this are:
- git filter-branch
- BFG repo-cleaner
For now, my lack of understanding of purpose results in purpose getting in my
way. One day, I may reinvestigate this. For now, I'm attempting to learn Prolog
and Nix, which is occupying most of my tolerance for new technology.
It took me awhile to install evil-magit because I believed that evil-collection
supported it. My grasp of Emacs bindings was enough to tolerate the strangely
"inconsistent" KBD support of in magit. Eventually though my tolerance waned,
and I verified that evil-collection does *not* support magit, and suggests that
users seek evil-magit. I did that. I do not regret it.
Installing Wilfred's refine.el, which is a lovely package for interactively
editing data structures. Go LISP!
Support functions for ensuring the existence of directories and files. These
functions represent the type of small ergonomic wins that I believe libraries
should support.
In a moment of strong opinions against variadic functions, I defined
maybe/somes? and redefined maybe/some? to be non-variadic. I'm not sure if I
feel as strongly about that change as I did when I made it. Either way, the
change remains and math.el is broken unless it consumes maybe/somes?, so... this
does that!
I provided the wrong usage example in my documentation. This goes to show how
critical generated documentation is to the goal of documentation reliability,
which itself bolsters the goal of documentation in general.
TODO: It may be preferable to augment my git history to remove the traces of
these files ever existing. For now, since I value a precise git history over a
pristine git history and my tendancy to maintain the former is sometimes at odds
with my goal of the latter, I'm saving this work for a later date.
After some back-and-forth, I'm trialing fish shell instead of zsh as my default
shell. For now, I'm porting the aliases.zsh into config.fish -- defining them as
abbreviations instead of aliases; this preference may change. See the commentary
in config.fish for more information.
A spent a lot of time in zsh and built much configuration, so supporting fish
may take considerable time. Here's some work that remains:
TODO:
- Port functions.zsh
- Port variables.zsh
- Port zle.zsh
After attempting to package some of my Elisp libraries using Nix, I exposed
circular dependencies between modules that has existed for awhile.
I'm temporarily disabling this code since I do not have time to refactor
everything. When I get around to packaging everything, I'll need to resolve
these issues.
For now, I must carry on.
Currently paying the price of months of non-diligent git usage.
Here's what has changed.
- Theming support in Gvcci and wpgtk
- Dropping support for i3
- Supporting EXWM
- Many Elisp modules
- Collapsed redundant directories in ./configs
I had `tbz`, which toggles between a project directory and it's associated
blaze-bin.
I added three functions which support navigating to blaze-bin, blaze-genfiles,
and to the project root.
I'd like to regain control of my browsing bookmarks with a simpler solution
using `dmenu`, `i3`, and a text file.
TODO: drop support for Chrome bookmarks by porting all remaining bookmarks to
bookmarks.txt
NOTE: maybe change bookmarks.txt to bookmarks.json to support nesting. Could be
simply with `jq`.
Useful since helpful aliases and functions around creating sandboxed REPL
environments for languages like, Elixir, Haskell are on the way. Other languages
that might be interesting to support would be Clojure.
The `jshell` alias currently imports libs like guava and jOOL into the `jshell`,
which is nice for experimenting.
Experimenting with keeping some helpful `.jars` in `~/programming/jars`. This
may be a bad idea, and there may exist a more idiomatic way to do this instead
of wrapping `jshell` in an alias, but for now, I need to move on.
Also documents some abbreviations for applications. `jv` will be necessary so
that I don't conflict with `j` or `js` for javascript. Eventually I'll need to
be more organized to avoid naming collisions, but this is okay for now.
This allows me to take advantage of the --app=<URL> flag that google-chrome
supports, which is nice for a version of cider that bleeds all the way to the
window's edges. It makes Cider feel more like a native application experience.
This comes with the default configuration on i3. I removed this KBD originally
because I was hoping to use the $mod+{,Shift+}t KBDs frequently. I still do, but
as I get more comfortable with i3, splits, parent containers, etc. I may prefer
to create terminals this way. We'll see...
NOTE: consider migrating from GH private repo to Google's Git on Borg. This is
preferable since GH gets hacked and private repos can be exposed. While a path
to a Google 3 repo like SpeWall may not pose a large security risk, it certainly
isn't optimal. Imagine a path to a repository whose name leaked a secret
project. Two options:
1. embrace encryption options like Mozilla's `sops` and remain on GH private
2. switch wholesale from private GH to GoB
3. classify "sensitve" parts of dotfiles as such and move those to GoB and keep
everything else on private GH
One added perk of switching to GoB is saving the $7 monthly fee to support
private GH repos.
The nohup.out file was creating a bunch of noise and polluting my FS. It may
have been the correct thing to add, but if it was, I'm unsure why. Removing it
for now since it's been bothering me quite a bit.
Wraps the existing `prodaccess` executable and displays a quote from Google
ENG's fortune db.
Fortune is a GNU tool intended to support random quote compilation, display,
etc. It's pretty interesting.
NOTE: the `prodcertstatus` executable that this function is using as a guard
looks like it might be useful moving forward.
We already have `gcan`... looks like `gca` was already defined by some ZSH git
extension. This further weakens my dependency on that extension, which I think
is a good things.
May need to find a better KBD for `snip_it`, since I really enjoy Tmux's M-s to
switch sessions.
Learned about i3's "edge" concept. Re-supported KBDs for settings split
directions. Also adjusted theme colors.
Also adjusts the formatting of the timezone information to show GMT as LON, EST
as NYC, and Pacific as MTV.
I originally dropped support for these because I wanted to imitate OSX's
screenshot KBDs, which were mod+Shift+{3,4}. I'm not sure I want to imitate OSX
now that I don't have any Apple hardware besides my iPhone. I'm getting more
forgetting those KBDs. At the moment, however, I cannot find a better KBD for my
snip_it function. Stay tuned...
I must not have tested this before adding it to the repository; otherwise, I
would have found this. Oh well... it worked like a charm when copying the GPG
information from my desktop to my laptop.
I used `light` on my MBP running NixOS. I got `xbacklight` working on my Dell
Precision running gLinux. It wasn't easy, and I still don't fully understand the
integration story. Thankfully I'm not alone and the documentation from the Arch
Linux came to rescue (per usual).
In my quest to learn more about terminals, I added a function to output ten
emojis. Technically this tests the same thing as test_unicode.
Unfortunately I couldn't get `st` to output any colored emojis. This is a bit of
a buzzkill for my grand plans to create a terminal-based chat client that
supports emojis.
Defines functions for creating, deleting, renaming files.
Defines functions for encrypting/decrypting files.
Defines functions for archiving/unarchiving files.
Adds TODOs for wishlist items.
Adds `help` function to view `lf` documentation.
TODO: write generic explanation of desire to share KBDs between Emacs, Vim,
other programs that I can link to in documentation to avoid repeating myself.
I'm unsure if this is idiomatic POSIX shell scripting or not, but I generally
prefer function calls to variables. Thankfully things like Haskell don't
differentiate between the two. In other cold and hostile environments like shell
scripting, us programmers must take care to prefer functions to variables where
it makes sense.
If you're going to install things and support that with an aliases, might as
well support the removals of packages with an aliases. Better to keep systems
lean -- especially if entropy is the tendancy.
Separated i3/configuration since some of my devices support XFree86 keysyms
while others do not. This introduced some cascading changes.
- Removed ~/.config/i3/config from this repo. Since I will be switching between
devices semi-regularly and that file will be generated each time I switch to a
different device running an X session, I don't want the i3/config to spam my
`gst` and `gd` when I haven't changed configuration in either config.shared or
config.device.
- Update aliases, variables, etc. to point to config.shared instead of the
generated file.
- Ensure that X sessions generate the i3/config file.
- Ensure that i3 reload and restart command generate the i3/config file.
This seems to resemble Atom's One Dark theme that I'm using in Vim, Emacs,
wallpaper already. Would be nice to keep everything consistent. I should update
the i3 Status Bar and Chrome to support One Dark themes as well.
This change affects:
- alias e
- i3 KBDs
- .xsessionrc
It will be interesting to see how this works over SSH. In theory, the
ALTERNATE_EDITOR variable should kick in and `vim` should be used. Time will
tell if this is the preferred setup. Until then...
See the comment for an explanation about this revision.
- we want to support to GUI
- it's difficult to reuse GUI windows elegantly unless the server is started
from the GUI itself
- consider starting the emacs GUI when X initializes
`company-mode' can be pretty noisy in some modes. In fact, I'm writing this in
`fundamental-mode', which is proving to be equally as noisy as the
auto-completion in `markdown-mode'. Stay tuned for an update that disables
`company-mode' in fundamental mode.
This is intended to be an i3 status bar integration eventually. As long as the
monzo_creds file stays encrypted and out of a public GH repository, this should
be fairly secure.
This is a bit of a workaround since ideally wpc/ensure-kbds and wpc/kbds minor
mode should eclipse the major-mode's KBDs. I couldn't fully debug the issue, and
in the interest of getting on with things, I resolved to just unbind those keys.
It appears that (auto-fill-mode 1) may be buffer-local. Adding a hook to
fundamental-mode to ensure auto-fill-mode is enabled for most buffers. Stay
tuned, because this may need to be setup for prog-mode-hook as well. Or
neither... we'll see what works.
Sometimes just capturing what I want to buy is as satisfying as actually buying
the item. These org-capture templates really alleviate a lot of the anxiety I
associate with trying to remember many things.