about summary refs log tree commit diff
AgeCommit message (Collapse)AuthorFilesLines
2020-02-18 Configure ssh preferencesWilliam Carroll2-3/+15
Every Tuesday I work from Google's 6PS office instead of BEL. I work from my laptop, which often requires that I ssh into the desktop work station in BEL. I have settled on a locally optimal workflow that I'd like to improve. To help seek higher ground, I'm planning on using ssh.el to configure tramp and define utility functions to lower my cost of exploring new workflows. - Defines a function, `ssh/desktop-cd-home` that helps me quickly open a dired buffer for my work station's home directory. - Documents some variables that I set weeks ago. - Requires ssh.el in init.el.
2020-02-18 Further configure notmuchWilliam Carroll1-0/+32
Until now my notmuch is usable but not almost always pleasurably so. For example, when I reply to messages, notmuch warns that "Insert failed:"; when I check Gmail, the reply sent... strange. After consulting with a fellow notmuch user and Emacs disciple, tazjin@, I borrowed some of his notmuch configuration. - notmuch is no longer warning about replies - Replies do not include noisy email signatures - I have an Emacs User-Agent header in my outgoing mail - All of this and more...
2020-02-18 Define KBD for find-file-at-point (i.e. ffap)William Carroll1-0/+5
I'm attempting to incorporate the beloved find-file-at-point function into my workflow.
2020-02-18 Further specify saved searches for tagsWilliam Carroll1-3/+3
Add tag:unread to: - direct - broadcast - systems Additionally: I added "and not tag:sent" for direct because oftentimes I send myself mail. Without that condition, my sent mail shows up in direct.
2020-02-17 Require keybindings.el after wpc-keybindings.elWilliam Carroll1-1/+1
keybindings.el calls (require 'evil-ex), which I introduced in this commit... 0456a1c4b4405da2681296b2250681454637d80f ...calling (require 'evil-ex) loads evil. When evil is loaded before evil-want-integration is set to nil, evil-collection writes to *Warnings* when Emacs initializes, which I find noisy. This commit ensures the evil-want-integration is set to nil before evil is loaded, which appeases evil-collection and thus removes the warning message. Bonus: If you git checkout the previous commit, and attempt to run the KBDs... - `SPC g s`: magit-status - `s h`: evil-window-vsplit ...from a buffer whose major-mode is dired-mode, you should notice that the above functions won't execute. Strangely though, if you look at this commit... 37f8ca04f29ea9bf988b2277c42f3e264d7a89e1 ...I fixed these issues. Well I introduced a regression when I added 0456a1c. My current guess is that when evil-collection complains about evil-want-integration, it is breaking the evaluation sequence of my init.el file. wpc-dired.el is downstream from wpc-keybindings.el, which requires evil-collection. Perhaps no modules required after wpc-keybindings.el are evaluated after evil-collection warns about evil-want-integration. Even if that assumption is wrong, what I do know is that this commit fixes the evil-collection warning and restores the KBDs for dired-mode-map. Here's to feeding two birds with one scone!
2020-02-17 Drop support for comptonWilliam Carroll4-46/+1
I'm finding myself running `pkill compton` offer. In the spirit of slimming down my configuration, I'm dropping support for compton.
2020-02-16 Alias systemctlWilliam Carroll1-0/+2
Support `systemctl` and `systemctl --user`.
2020-02-16 Support additional notmuch saved queriesWilliam Carroll1-9/+10
Today I setup declarative gmail filters using some Google internal tooling. I'm now adding labels to messages from Critique, Sphinx, Ganpati, "The Daily Insider", messages sent directly to me, and more. These labels are applied server-side. On the notmuch, client-side, I'm support saved queries for these newly created gmail labels.
2020-02-16 Support KBDs for labelling emailsWilliam Carroll1-1/+16
I can already tag emails with `+` and `-`. Here I'm defining KBDs for moving messages from my inbox into: action, review, and waiting. I'm also mutually excluding messages in action, review, and waiting from inbox and vice versa. I'm also supporting a "muted" tag for now; I'm still learning how to use notmuch with email threads, but I'm hoping the "muted" tag will prevent future messages in a thread from arriving in my inbox.
2020-02-14 Prefer newest-to-oldest sortingWilliam Carroll1-0/+3
The default sorting order of results from notmuch.el are in oldest-to-newest. This prefers the opposite.
2020-02-14 Enable lieer-google.timerWilliam Carroll1-0/+1
After running `systemctl --user enable lieer-google.timer`, systemctl created a symlink pointing from timers.target.wants -> ../lieer-google.timer. I'm not sure if tracking symlinks in a git repository is such a useful idea. This commit reminds me that I could and should be using Nix to better manage symlink creation and destruction.
2020-02-14 Define notmuch KBDsWilliam Carroll1-0/+44
Until I have more opinions about my workflow with notmuch, I will redefine the KBDs from Gmail that I'm comfortable with. While not many KBDs are defined here, evil-collection defines dozens, many of which I find reasonable; those that I disagree with, I've unbound in this commit. Composing emails in notmuch feels similar to writing a commit message with magit. I want to be able to type :x or :wq, but these commands don't DWIM. For magit, I'd like that behavior to be the same as `C-c C-c`; not surprisingly, for notmuch, I'd like the same. I've bound :x to do this for notmuch. I'd like to define a macro that can easily define buffer-local evil-ex commands for particular modes. This should lower the cost of defining evil-ex commands and hopefully convince me to support some of this desired behavior.
2020-02-14 Configure saved searches for notmuchWilliam Carroll1-1/+25
Mimmicking the "action", "review", and "waiting" labels that I had in Gmail using the equivalent labels as tags in notmuch.
2020-02-14 Support list/xs-distinct-by?William Carroll1-0/+5
Supporting a predicate to check that all elements in a list are distinct after applying a transformation function to them.
2020-02-13 Begin supporting notmuch in EmacsWilliam Carroll3-0/+22
I'm borrowing from @tazjin's dotfiles, which are stored in Git on Borg. When you call `nix-build ~/briefcase/mail`, result will output a systemd units, which you should move to ~/.config/systemd/user/. The path to `gmi`, which is Lieer's executable, exists in /nix/store, and you can read it from the systemd unit file (i.e. lieer-google.service). Lieer synchronizes notmuch with Gmail and Gmail with notmuch. Here's a general sequence of commands that I ran to set everything up. Special thank you to @tazjin for helping me with all of this. These steps are not certified as a tutorial; I'm recalling them from memory. When I set this up things didn't work as expected immediately and I had to troubleshoot. ```shell > mkdir -p ~/mail/account.google > cd ~/mail/account.google > nix-env -iA nixpkgs.notmuch > notmuch setup > nix-build ~/briefcase/mail > cp ./result/lieer-google.{service,timer} ~/.config/systemd/user > rm ./result > systemctl --user cat lieer-google ...copy the /nix/store path to gmi... > notmuch new > /nix/store/gmi init ...follow the OAuth login flow... > ``` Unknowns? - Do I need to call `systemctl --user start lieer-google` at startup? Or should I move these units to user/default.target.wants? - Can I send email from notmuch? - How do I use notmuch to delete email? To respond to emails? To do anything? Todo: - Once this configuration stabilizes, I should package everything with Nix.
2020-02-13 Solve merging-rangesWilliam Carroll2-1/+116
Write a function to merge meeting times. Added an in-place solution, which the "Bonus" section suggested attempting to solve. - Added some simple benchmarks to test the performance differences between the in-place and not-in-place variants. To my surprise, the in-place solution was consistently slower than the not-in-place solution.
2020-02-12 Prefer alias to abbrWilliam Carroll1-214/+83
After working with fish for a few weeks, I've decided that I prefer aliases to abbreviations. Why? When I reverse search through my command history, I search for the what I typed and not what it expanded to. Some of my aliases wrap existing tools encoding my preference for tool A if tool B isn't available. For example I alias vim to neovim. When nvim isn't available on $PATH, typing vim will expand to nvim, which will in turn fail.
2020-02-12 Disable auto pairing parens, brackets, quotesWilliam Carroll1-3/+0
I don't see much value in this tool for my workflow.
2020-02-12 Nixify simple_vim ideaWilliam Carroll2-0/+10
I previously had an alias defined as `simple_vim`, which would start an instance of Vim with a bare bones config. I had a to-do to Nixify it. That is now (mostly) to-done. When I try and install it with `nix-env -f ~/briefcase -iA tools.simple_vim`, Nix fails and says that pkgs.stdenv is undefined. I will need to fix this one day, but it is neither important nor urgent...
2020-02-12 Define briefcase alias to cd into my monorepoWilliam Carroll1-0/+3
Defining an alias in my config.fish makes me realize that I should prune many of my abbreviations and change the ones that remain into aliases.
2020-02-12 Tidy up structure of briefcaseWilliam Carroll89-41/+53
I had a spare fifteen minutes and decided that I should tidy up my monorepo. The work of tidying up is not finished; this is a small step in the right direction. TL;DR - Created a tools directory - Created a scratch directory (see README.md for more information) - Added README.md to third_party - Renamed delete_dotfile_symlinks -> symlinkManager - Packaged symlinkManager as an executable symlink-mgr using buildGo
2020-02-12 Complete InterviewCake reverse-string-in-placeWilliam Carroll2-6/+13
Wrote a function in TypeScript to reverse an array of characters mutatively.
2020-02-11 Move matrix-traversals -> ./miscWilliam Carroll1-0/+0
I'd like the top-level files in deepmind/part_two to correspond 1:1 with the TODOs in my org file tracking the work.
2020-02-11 Attempt to support TypeScript for coding challengesWilliam Carroll6-0/+107
I was a bit weaker than I expected to be in my most recent interview using TypeScript. To improve, I think I'd like to attempt solving some of the InterviewCake.com questions using TypeScript. If you've read the previous commits, the inspiration for `run` arose because I need to call `npx ts-code <file>`, which is easy enough to remember, but I'd still rather just call `run <file>`.
2020-02-11 Begin supporting runWilliam Carroll5-0/+104
I'd like to be able to just call `run file.py` and have a program DWIM. I'm working on run as a step in this direction. Define a simple configuration that maps file extensions to template strings where "$file" is replaced with the argv[1]. It basically works but there are outstanding TODOs. See the README and source code for more information.
2020-02-11 Support utils.Resolve/2William Carroll1-0/+39
Supporting a function that resolves a file name checking for the nearest occurrence of the file from the CWD until it traverses beyond the user's home directory, after which point it checks in backupPaths.
2020-02-11 Support utils.FileExists/1William Carroll1-0/+10
Support predicate for checking if a file exists on disk.
2020-02-11 Support utils.HomeDir/0William Carroll1-0/+10
Support function for returning the home directory of the current user.
2020-02-11 Encode InterviewCake.com questions as an org-mode listWilliam Carroll1-0/+77
This way I can track what I've done and what I need to do.
2020-02-11 Support cycling through display configurationsWilliam Carroll2-18/+31
Today when I opened my laptop, I wasn't sure if it was powered off or on because the display was blank. Thankfully the volume was muted and the LED indicator was on, which informed me that the laptop was powered on. This saved me from unnecessarily rebooting. What happened was that last night I was working from home and using my external monitor. Usually I enable my external display and disable my laptop display. But when I left for work this morning, I unplugged the HDMI cable from my laptop without disabling the external display or enabling the laptop display. I noticed a XF86 button on my laptop entitled XF86Display. I figured that this could be a nice place to bind a key to toggle my laptop display on or off. At the last minute, I had the idea to just cycle through all possible display configurations that I use; there are only three anyways. When dealing with more than two states, I realized I should use a cycle to model the configuration states. Now I'm thinking that I should be using cycles to model toggles as well - instead of just using a top-level variable that I `setq` over. I haven't refactored existing toggles to be cycles, but I am excited about this new keybinding. This commit additionally: - Moves keybindings out of display.el and into keybindings.el - Conditionally sets KBDs if using work laptop
2020-02-10 Preferring to start wpcarros-emacs with dbus-launchWilliam Carroll1-1/+1
When I ran `pass show some/password`, gpg, which uses pinentry would start its ncurses password prompt. For many this wouldn't be a problem but my current vterm version cannot send the <return> key to ncurses, so once that prompt appears, I cannot get rid of it without C-c and killing the shell. For a day or more I just opened suffered through this. Today I dug more into the issue and when I ran `pinentry --version` it warned that it couldn't connect to DBUS. After searching for more information on this, people with similar issues recommended starting their window managers with `dbus-launch`. I previously started Emacs with `dbus-launch`, but only because some i3 documentation told me to do so and I just copied them. Then I switched to EXWM and copied that pattern over. A friend of mine uses EXWM and starts his without calling `dbus-launch` but `exec emacs`. I mirrored this thinking that I no longer needed `dbus-launch`. What I didn't know, however, was that this friend was using a Nix-built Emacs (like me) except that his wrapped a native Emacs installation while mine doesn't. His natively wrapped Emacs installation has the proper variables set to interact with dbus and other important Linuxy things that I don't fully understand. Since I'm using a Nix-built Emacs, some of my variables are unset or set to different values than programs expect. This is why when I try and start `gnome-terminal` or `terminator`, they refuse to start and warn about many unset or incorrectly variables and not being able to bind to sockets, etc. This change reverts back to using `dbus-launch` until I have a better understanding of Linux, Nix, etc.
2020-02-10 Begin work on YNAB clientWilliam Carroll4-1/+70
After reading these docs https://api.youneedabudget.com/v1#/Transactions/createTransaction I successfully made a request to post a transaction to my YNAB account. Hastily created a client.go that doesn't contain much at the moment.
2020-02-10 Sort items in travel_hitlistWilliam Carroll1-2/+2
Grouping entries by country and sorting according to Done -> Todo. I should consider sorting the country groups alphabetically by the country name and then each entry alphabetically by its city name. Right now, however, this isn't a priority.
2020-02-10 Add Turkish cities to wish listWilliam Carroll1-0/+2
I would like to see Istanbul and Ankara one day.
2020-02-10 Add Grenoble and LyonsWilliam Carroll1-0/+2
In 2013, I lived in Grenoble with a host family. During that time, I visited Lyons, as well as a few other locations that aren't tracked by this document at the time of this writing.
2020-02-10 Lint the documentWilliam Carroll1-1/+1
Removing a trailing comma from Dubrovnik, Croatia.
2020-02-10 Adding a few cities that I visited in 2019William Carroll1-1/+5
I spent two weeks on the Spanish islands of Ibiza and Formentera over the summer. I went to Hamburg twice to visit Mimi's family - once in the summer; once for Christmas. In the Fall, I went to Bordeaux with Mimi where we stayed at a charming Airbnb. I spent New Years Eve in Amsterdam with Matty, Ryan, and Conor. I may be missing a few other places that I visited in 2019; it was an active year.
2020-02-10 Add 'travel_hitlist/' from commit 'a97002bb21425c4d36335e9d70a1ec8bad6b51f2'William Carroll1-0/+75
git-subtree-dir: travel_hitlist git-subtree-mainline: 3fa827681622dc9f20d5095a781e78dbaaa23791 git-subtree-split: a97002bb21425c4d36335e9d70a1ec8bad6b51f2
2020-02-10 Support C-k for upward movement in ivy-switch-buffer-mapWilliam Carroll1-1/+1
Without these KBDs, C-k kills buffers. As an evil-mode user, I expect C-k to move upwards. As such, adding the `ivy-switch-buffer-map` to my existing ivy KBDs that handle a similar use-case. Note: I'm unsure why the KBDs in evil-collection didn't cover this.
2020-02-10 Disable ido-modeWilliam Carroll1-2/+0
For awhile I had a mixture of ivy and ido. Disabling ido and preferring ivy for everything.
2020-02-10 Add ts.el to emacs/default.nixWilliam Carroll1-0/+1
I ran `M-x package-autoremove` that deleted `ts.el`, which wasn't listed in my default.nix. Adding it...
2020-02-10 Refactor token server initializationWilliam Carroll1-30/+42
- Move state "gen server" to the top of main/0 - Initialize it as empty - Ensure that persistTokens/2 is called whenever the state changes - Support setState/2 (similar in spirit to getState/0)
2020-02-10 Debug os.Signal handlingWilliam Carroll1-12/+11
Problem: When SIGINT signals we're sent to the token server, it would shut down without completing the shutdown procedure. The shutdown procedure would persist the application state (i.e. access and refresh tokens). This is problematic for the following sequence of events: t0. Access and refresh tokens retrieved from kv.json and used as app state. t1. Tokens are refreshed but not persisted. (I'm still unsure how this happens). Remember that this means the previous access and refresh tokens from t0 are now invalid. t2. User sends a SIGINT. t3. Token server shuts down. t4. Token server is restarted, kv.json is used as the app state even though its tokens are now invalid. t5. Tokens are attempted to refresh, Monzo API rejects the tokens because they're invalid. Now we need to provide the token server with valid access and refresh tokens otherwise we will repeat the loop described above. This means going through the client authorization flow again or copying and pasting the tokens logged from the token server into kv.json. Either scenario is more manual than I'd prefer. Solution: Use a buffered channel to receive the os.Signal. I got this idea after reading these docs: https://golang.org/pkg/os/signal/#Notify and I debugged this issue shortly thereafter. I also rearranged the order of operations in main/0 to ensure that handleInterrupts/0, which registers the event listeners, occurs before scheduleTokenRefresh/2 is called. This allows the token server to gracefully shutdown even if it's in the middle of the scheduleTokenRefresh/2 call.
2020-02-10 Sketch Monzo clientWilliam Carroll1-0/+52
None of this code is functional at the moment. I'm just writing some ideas of how I'd like to work.
2020-02-10 Consume auth libraryWilliam Carroll1-58/+102
Consume the newly relocated auth package. Additionally: - Debugged error where JSON was properly decoding but not populating the refreshTokenResponse struct, so my application was signaling false positive messages about token refresh events. - Logging more often and more data to help my troubleshooting - Refreshing tokens as soon as the app starts just to be safe - Clean up the code in general
2020-02-10 Move authorization logic into separate packageWilliam Carroll3-146/+115
Relocated the logic for authorizing clients into a separate package that the tokens server now depends on. Moving this helped me separate concerns. I removed a few top-level variables and tried to write more pure versions of the authorization functions to avoid leaking Monzo-specific details.
2020-02-10 Support utils.Debug{Request,Response}William Carroll1-5/+16
Exposing functions to print HTTP request and response structs.
2020-02-10 Ignore kv.jsonWilliam Carroll1-0/+1
I'm writing sensitive data here, so I'd like to ignore it instead of encrypting it and publishing it. Perhaps later on, I can extend the key-value store to handle encryption and decryption but that feels like overkill for now.
2020-02-10 Gracefully shutdown serverWilliam Carroll1-0/+33
Listen for SIGINT and SIGTERM signals and write the current state to the key-value store before shutting down.
2020-02-10 Read tokens from store when server startsWilliam Carroll1-3/+14
Attempting to read the persisted tokens from the key-value store when the server begins. The server currently fails when those values are empty. TODO - Consider adding logic for knowing if the cached tokens are expired and prompt the user to reauthorize the client using a web browser.