Posts tagged: cli

All posts with the tag "cli"

97 posts latest post 2026-05-24
Publishing rhythm
May 2026 | 1 posts
The default keybinding for copy-mode <prefix>-[ is one that is just so awkward for me to hit that I end up not using it at all. I was on a call with my buddy Nic this week and saw him just fluidly jump into copy-mode in an effortless fashion, so I had to ask him for his keybinding and it just made sense. Enter, that’s it. So I have addedt his to my ~/.tmux.conf along with one for alt-enter and have found myself using it way more so far. Setting copy-mode to enter # [1] To do this I just popped open my ~/.tmux.conf and added the following. Now I can get to copy-mode with <prefix>-Enter which is control-b Enter, or alt-enter. bind Enter copy-mode bind -n M-Enter copy-mode More on copy-mode # [2] I have a full video on copy-mode you can find here. tmux copy-mode [3] References: [1]: #setting-copy-mode-to-enter [2]: #more-on-copy-mode [3]: /tmux-copy-mode/
A super useful tool when doing PR’s or checking your own work during a big refactor is the silver searcher. Its a super fast command line based searching tool. You just run ag "<search term>" to search for your search term. This will list out every line of every file in any directory under your current working directory that contains a match. Ahead/Behind # [1] It’s often useful to need some extra context around the change. I recently reviewed a bunch of PR’s that moved schema from save_args to the root of the dataset in all yaml configs. To ensure they all made it to the top level DataSet configuraion, and not underneath save_args. I can do a search for all the schemas, and ensure that none of them are under save_args anymore. ag "schema: " -A 12 -B 12 References: [1]: #aheadbehind
Creating a minimal config specifically for git [1] commits has made running git commit much more pleasant. It starts up Much faster, and has all of the parts of my config that I use while making a git commit. The one thing that I often use is autocomplete, for things coming from elsewhere in the tmux session. For this cmpe-tmux specifically is super helpful. The other thing that is engrained into my muscle memory is jj for escape. For that I went agead and added my settings and keymap with no noticable performance hit. Here is the config that has taken ~/.config/nvim/init-git.vim source ~/.config/nvim/settings.vim source ~/.config/nvim/keymap.vim source ~/.config/nvim/git-plugins.vim lua require'waylonwalker.cmp' ~/.config/nvim/git-plugins.vim call plug#begin('~/.local/share/nvim/plugged') " cmp Plug 'hrsh7th/nvim-cmp' Plug 'hrsh7th/cmp-nvim-lsp' Plug 'hrsh7th/cmp-buffer' Plug 'hrsh7th/cmp-path' Plug 'hrsh7th/cmp-calc' Plug 'andersevenrud/compe-tmux', { 'branch': 'cmp' } call plug#end() ~/.gitconfig [core] editor = nvim -u ~/.config/nvim/init-git.vim References: [1]: /glossary/git/
Today I discovered a sweet new cli for compressing images. squoosh cli [1] is a wasm powered cli that supports a bunch of formats that I would want to convert my website images to. from the future > Unfortunately, due to a few people leaving the team, and staffing issues resulting from the current economic climate (ugh), I’m deprecating the CLI and libsquoosh parts of Squoosh. The web app will continue to be supported and improved. I know that sucks, but there simply isn’t the time & people to work on this. If anyone from the community wants to fork it, you have my blessing. https://github.com/GoogleChromeLabs/squoosh/pull/1321 Web App # [2] First the main feature of squoosh is a web app [3] that makes your images smaller right in the browser, using the same wasm. It’s sweet! There is a really cool swiper to compare the output image with the original, and graphical dials to change your settings. CLI # [4] What is even cooler is that once you have settings you are happy with and are really cutting down those kb’s on your images, there is a copy cli command button! If you have npx (which you should if you have nodejs and npm) already installed it just works without instal...
One of the first things I noticed broken in my terminal based workflow moving from Windows wsl to ubuntu was that my clipboard was all messed up and not working with my terminal apps. Luckily setting tmux and neovim to work with the system clipboard was much easier than it was on windows. First off you need to get xclip if you don’t already have it provided by your distro. I found it in the apt repositories. I have used it between Ubuntu 18.04 and 21.10 and they all work flawlessly for me. I have tmux setup to automatically copy any selection I make to the clipboard by setting the following in my ~/.tmux.conf. While I have neovim open I need to be in insert mode for this to pick up. # ~/tmux.conf bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xclip -i -f -selection primary | xclip -i -selection clipboard" bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i" To get my yanks to go to the system clipboard in neovim, I just added unnamedplus to my existing clipboard variable. # ~/.config/nvim/init.vim set clipboard+=unnamedplus If you need to copy something right from the terminal you can use xclip directly. ...
With the latest version of minecraft it requires a very new, possibly the latest, version of java. Lately we have been getting into modded minecraft and I maintain the server for us. It’s been tricky to say the least. One hurdle I recently hit involves having the wrong version of java. I was getting this error trying to get a 1.12.2 forge server running. Caused by: java.lang.ClassCastException: class jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to class java.net.URLClassLoader (jdk.internal.loader.ClassLoaders$AppClassLoader and java.net.URLClassLoader are in module java.base of loader ‘bootstrap’) In researching our errors, I found this on a forum. Pre-1.13 Forge only works with Java 8. I don’t write java, or really know how to manage different versions of java, but I have nixpkgs installed and it has a ton of odd stuff like this readily available, so searching nixpkgs [1] landed me with this. nix-env -iA nixpkgs.jdk8 once I had this installed I then just changed out java for the full path to my new nixpkgs.jdk8 java and it worked. /home/walkers/.nix-profile/bin/java -server -Xms${MIN_RAM} -Xmx${MAX_RAM} ${JAVA_PARAMETERS} -jar ${SERVER_JAR} nogui I don...
cli
I have added a hotkey to my copier template setup to quickly access all my templates at any time from tmux. At any point I can hit <c-b><c-b>, thats holding control and hitting bb, and I will get a popup list of all of my templates directory names. Its an fzf list, which means that I can fuzzy search through it for the template I want, or arrow key to the one I want if I am feeling insane. I even setup it up so that the preview is a list of the files that come with the template in tree view. bind-key c-b popup -E -w 80% -d '#{pane_current_path}' "\ pipx run copier copy ~/.copier-templates/`ls ~/.copier-templates |\ fzf --header $(pwd) --preview='tree ~/.copier-templates/{} |\ lolcat'` . \ " I’ve had this on my systems for a few weeks now and I am constantly using it for my tils [1], blogs [2], and my .envrc file that goes into all of my projects to make sure that I have a virtual environment [3] installed and running any time I open it. [4] References: [1]: https://waylonwalker.com/til/ [2]: https://waylonwalker.com/archive/ [3]: /virtual-environment/ [4]: https://images.waylonwalker.com/copier-templates-tmux-popup.png
I often pop into my blog from neovim with the intent to look at just a single series of posts, til, gratitude, or just see todays posts. Markata [1] has a great way of mapping over posts and returning their path that is designe exactly for this use case. [2] To tie these into a Telescope picker you add the command as the find_command, and comma separate the words of the command, with no spaces. I did also --sort,date,--reverse in there so that the newest posts are closest to the cursor. nnoremap geit <cmd>Telescope find_files find_command=markata,list,--map,path,--filter,date==today<cr> nnoremap geil <cmd>Telescope find_files find_command=markata,list,--map,path,--filter,templateKey=='til',--sort,date,--reverse<cr> nnoremap geig <cmd>Telescope find_files find_command=markata,list,--map,path,--filter,templateKey=='gratitude',--sort,date,--reverse<cr> NOTE telescope treates each word as a string, do not wrap an extra layer of quotes around your words, it gets messy. [3] References: [1]: https://markata.dev/ [2]: https://images.waylonwalker.com/markta-list-todays-posts.png [3]: https://images.waylonwalker.com/markata-list-telescope-picker.png
Copier allows you to run post render tasks, just like cookiecutter. These are defined as a list of tasks in your copier.yml. They are simply shell commands to run. The example I have below runs an update-gratitude bash script after the copier template has been rendered. # copier.yml num: 128 _answers_file: .gratitude-copier-answers.yml _tasks: - "update-gratitude" I have put the script in ~/.local/bin so that I know it’s always on my $PATH. It will reach back into the copier.yml and update the default number. #!/bin/bash # ~/.local/bin/update-gratitude current=`awk '{print $2}' ~/.copier-templates/gratitude/copier.yml | head -n 1` new=`expr $current + 1` echo $current echo $new sed -i "s/$current/$new/g" ~/.copier-templates/gratitude/copier.yml
I really appreciate that in linux anything can be scripted, including setting the wallpaper. So everytime I disconnect a monitor I can just rerun my script and fix my wallpaper without digging deep into the ui and fussing through a bunch of settings. feh --bg-scale ~/.config/awesome/wallpaper/my_wallpaper.png I set my default wallpaper with feh using the command above. Leaning in on feh, we can use fzf to pick a wallpaper from a directory full of wallpapers with very few keystrokes. alias wallpaper='ls ~/.config/awesome/wallpaper | fzf --preview="feh --bg-scale ~/.config/awesome/wallpaper/{}" | xargs -I {} feh --bg-scale ~/.config/awesome/wallpaper/{}' I have mine alias’d to wallpaper so that I can quickly run it from my terminal.
Converting markdown posts to pdf on ubuntu takes a few packages from the standard repos. I had to go through a few stack overflow posts, and nothing seemed to have all the fonts and packages that I needed to convert markdown, but this is what ended up working for me. Installing all the packages # [1] sudo apt install \ pandoc \ texlive-latex-base \ texlive-fonts-recommended \ texlive-extra-utils \ texlive-latex-extra \ texlive-xetex Using pandoc to convert markdown to a pdf # [2] # older versions of pandoc, I needed this one on ubuntu 18.04 pandoc pages/til/convert-markdown-pdf-linux.md -o convert-markdown-pdf.pdf --latex-engine=xelatex # newer versions of pandoc, I needed this one on ubuntu 21.04 pandoc pages/til/convert-markdown-pdf-linux.md -o convert-markdown-pdf.pdf --pdf-engine=xelatex [3] Here is an image of what converting this article over to a pdf looks like. The raw markdown is here [4]. References: [1]: #installing-all-the-packages [2]: #using-pandoc-to-convert-markdown-to-a-pdf [3]: https://images.waylonwalker.com/convert-markdown-pdf-linux-result.png [4]: https://waylonwalker.com/convert-markdown-pdf-linux.md
I recently paired up with another dev running windows with Ubuntu running in wsl, and we had a bit of a stuggle to get our project off the ground because they were missing com system dependencies to get going. Straight in the terminal # [1] Open up a terminal and get your required system dependencies using the apt package manager and the standard ubuntu repos. sudo apt update sudo apt upgrade sudo apt install \ python3-dev \ python3-pip \ python3-venv \ python3-virtualenv pip install pipx Using an Ansible-Playbook # [2] I like running things like this through an ansible-playbook as it give me some extra control and repeatability next time I have a new machine to setup. - hosts: localhost gather_facts: true become: true become_user: "{{ lookup('env', 'USER') }}" pre_tasks: - name: update repositories apt: update_cache=yes become_user: root changed_when: False vars: user: "{{ ansible_user_id }}" tasks: - name: Install System Packages 1 (terminal) become_user: root apt: name: - build-essential - python3-dev - python3-pip - python3-venv - python3-virtualenv - name: check is pipx installed shell: command -v pipx register: pipx_exists ignore_errors: y...
Stow is an incredible way to manage your dotfiles. It works by managing symlinks between your dotfiles directory and the rest of the system. You can then make your dotfiles directory a git [1] repo and have it version controlled. In my honest opinion, when I was trying to get started the docs straight into deep detail of things I frankly don’t really care about and jumped right over how to use it. When using stow its easiest to keep your dotfiles directory (you may name it what you want) in your home directory, with application directories inside of it. Then each application directory should reflet the same diretory structure as you want in your home directory. zsh # [2] Here is a simple example with my zshrc. mkdir ~/dotfiles cd ~/dotfiles mkdir zsh mv ~/.zshrc zsh stow --simulate zsh You can pass in the –simulate if you wish, it will tell you if there are going to be any more errors or not, but it wont give much more than that. WARNING: in simulation mode so not modifying filesystem. Once your ready you can stow your zsh application. stow zsh nvim # [3] A slightly more complicated example is neovim since its diretory structure does not put configuration files directl...
The copier answers file is a key component to making your templates re-runnable. Let’s look at the example for my setup.py. ❯ tree ~/.copier-templates/setup.py /home/walkers/.copier-templates/setup.py ├── [[ _copier_conf.answers_file ]].tmpl ├── copier.yml ├── setup.cfg └── setup.py.tmpl 0 directories, 4 files Inside of my [[ _copier_conf.answers_file ]].tmpl file is this, a message not to muck around with it, and the ansers in yaml form. The first line is just a helper for the blog post. # ~/.copier-templates/setup.py/\[\[\ _copier_conf.answers_file\ \]\].tmpl # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY [[_copier_answers|to_nice_yaml]] Inside my copier.yml I have setup my _answers_file to point to a special file. This is because this is not a whole projet template, but one just for a single file. # copier.yml # ... _answers_file: .setup-py-copier-answers.yml Once I change the _answers_file I was incredibly stuck Run it # [1] I’m making a library of personal copier templates in my ~/.copier-templates directory and I am going to run it from there. copier copy ~/.copier-templates/setup.py Results # [2] After rendering the template we have the followi...
Once you have made your sick looking cli apps with rich, eventually you are going to want to add some keybindings to them. Currently Textual, also written by [1]@willmcgugan [2], does this extremely well. Fair Warning it is in super beta mode and expected to change a bunch. So take it easy with hopping on the train so fast. Get the things # [3] Install them from the command line. pip install textual pip install rich Import make a .py file and import them in it. from textual.app import App from textual.widget import Widget from rich.panel import Panel Make what you have a widget # [4] If you return your rich renderable out of class that inherits from textual.widget.Widget, you can then dock this inside of an app class inheriting from textual.app.App. class MyWidget(Widget): def render(self): my_renderable = Panel("press q to quit") return my_renderable class MyApp(App): async def on_mount(self) -> None: await self.view.dock(MyWidget(), edge="top") await self.bind("q", "quit") run it # [5] You’ve made a TUI (text user interface). Run the classmethod run to display the it in its full screen glory. MyApp.run(log="textual.log") Final result # [6] At this point It prob...

pipx examples

count lines of code # [1] pipx run pygount markata pipx run pygount markata --format=summary pipx run pygount markata --suffix=cfg,py,yml References: [1]: #count-lines-of-code
tmux popups can be sized how you like based on the % width of the terminal on creation by using the flags (h, w, x, y) for height, width, and position. # normal popup tmux popup figlet "Hello" # fullscreen popup tmux popup -h 100% -w 100% figlet "Hello" # 75% centered popup tmux popup -h 100% -w 75% figlet "Hello" # 75% popup on left side tmux popup -h 100% -w 75% -x 0% figlet "Hello" Sorry, your browser doesn't support embedded videos. example running these commands
I was completely stuck for awhile. copier was not replacing my template variables. I found out that adding all these _endops fixed it. Now It will support all of these types of variable wrappers # copier.yml _templates_suffix: .jinja _envops: block_end_string: "%}" block_start_string: "{%" comment_end_string: "#}" comment_start_string: "{#" keep_trailing_newline: true variable_end_string: "}}" variable_start_string: "{{" !RTFM: Later I read the docs and realized that copier defaults to using [[ and ]] for its templates unlike other tools like cookiecutter.