Historically, I've only ever known two great ways of focusing Emacs windows: the built-in other-window command, which cycles through all the available windows, and the ace-window package, offering random window access. It's not that there aren't more or better ways, I just didn't look any further as these were enough for my needs. While I really wanted to make ace-window my default choice, for…
Another month, another agent-shell update. If you missed the last one, have a look at the 0.63 update . While this post showcases the latest highlights, the full list of changes is far chunkier than what we'll cover. What's agent-shell ? agent-shell is a native Emacs mode to interact with AI agents powered by ACP ( Agent Client Protocol ). agent-shell enters the chat Since inception in September…
It's been a little over a month since the 0.55 update , but plenty has landed since. Let's go through the highlights as of v0.63. What's agent-shell ? agent-shell is a native Emacs mode to interact with AI agents powered by ACP ( Agent Client Protocol ). Supported agents The roster continues to grow. This time we get two new agents supported: Oh My Pi ( omp ), #631 by @tychoish . Grok Build (xAI),…
I've been a happy ready-player user for some time now. I consider the Emacs package fairly feature-complete, for my needs anyway. Well almost. While I've successfully migrated most of my music-listening to offline playback, there are the odd times when I enjoy streaming YouTube audio. I've pondered extending ready-player for this use case, but its current approach is fairly file-driven. For…
It's been a little while since my last agent-shell update , so let's go through the latest highlights as of v0.55. What's agent-shell ? agent-shell is a native Emacs mode to interact with AI agents powered by ACP ( Agent Client Protocol ). Picking up where I left off If you noticed slower project activity in April, this is why . I'm getting better at the new 24-hour job , so I've resumed working…
The other day, my partner and I went into the hospital as two and came out as three. This week, I became a father. From the second I cuddled this little fella, I felt like I'd known him my entire life. I love him so much. Since going indie dev full-time, I've enjoyed a great degree of flexibility to work on personal projects. This has enabled me to share more via blog posts and YouTube videos ,…
We got quite a few agent-shell additions since the last post , so let's go through the highlights as of v0.47.1 . What's agent-shell ? Agent shell is a native Emacs mode to interact with LLM agents powered by ACP ( Agent Client Protocol ). Your employer can make a difference agent-shell has been attracting quite a few users. Many of you are working in tech where employers are happily paying for…
Time for a new Bending Emacs episode. This one is a follow-up to Episode 12 , where we explored Claude Skills as emacs-skills . Bending Emacs Episode 13: agent-shell + Claude Skills + Charts This time around, we look at inline image rendering in agent-shell and how it opens the door to charting. I added a handful of new charting skills to emacs-skills : /gnuplot , /mermaid , /d2 , and /plantuml .…
Time for a new Bending Emacs episode. This one is a follow-up to Episode 10 , where we introduced agent-shell . Bending Emacs Episode 12: agent-shell + Claude Skills This time around, we explore Claude Skills and how to use them to teach agents Emacs tricks. I built a handful of skills packaged as a Claude Code plugin at github.com/xenodium/emacs-skills . The skills use emacsclient --eval under…
At times, even purchased music excludes album covers in track metadata. For those instances, ready-player-mode offers M-x ready-player-download-album-artwork , which does as it says on the tin. The interactive command offers a couple of fetching providers (iTunes vs Internet Archive / MusicBrainz) to grab the album cover. The thing is, I often found myself trying one or the other provider,…
I recently built a little package to flash Emacs windows as you switch through them, so I might as well showcase it in a new Bending Emacs episode, so here it goes: Bending Emacs Episode 11: winpulse In addition to showcasing winpulse , we showed some of the built-in window-managing commands like: C-x 3 split-window-right C-x 2 split-window-below C-x 0 delete-window C-x ^ enlarge-window C-x }…
Hard to say officially, but I've been primarily using Emacs for roughly a couple of decades. Maybe my eyesight isn't what it used to be, or maybe I've just been wanting a stronger visual signal as I navigate through Emacs windows. Either way, today's the day I finally did something about it… I asked around to see if a package already existed for this purpose. Folks shared a handful of great…
I've been somewhat chaotically "bookmarking" things to watch for some time. The info typically goes straight to an Emacs org file primarily via Journelly . I'm fairly forgiving in my input form. I often link to Reddit discussions, IMDB / Letterboxd links, or at times simply write movie or director names. The only real requirement is to sprinkle some hashtags (#film or #series or #watch) for…
Back in 2023, I toyed with the relevant iOS dev tools needed to create a custom Tesco Clubcard pkpass , and even showed how to scan a QR code from our beloved Emacs (of course). Neither my friend Vaarnan nor I are strangers to the iOS ecosystem, yet we both agreed the above approach wasn't very practical (for neither devs nor the average iOS user). So we figured we should have a crack at it. While…
I've just uploaded a new Bending Emacs episode: Bending Emacs Episode 10: agent-shell You may have seen some of my previous posts on agent-shell , a package I built offering a uniform user experience across a diverse set of agents. In this video, I showcase the main agent-shell features. I had lots to cover, so the video is on the longer side of things. I've showcased much of the content in…
A new year, a new Bending Emacs episode, so here it goes: Bending Emacs Episode 9: Time around the world Emacs comes with a built-in world clock: M-x world-clock To customize displayed timezones, use: (setq world-clock-list '(("America/New_York" "New York") ("America/Caracas" "Caracas") ("Europe/London" "London") ("Asia/Tokyo" "Tokyo"))) Each entry requires a valid timezone string (as per entries…
In 2024, I took the leap to go indie full-time. By 2025, that shift enabled me to focus exclusively on building tools I care about, from a blogging platform, iOS apps, and macOS utilities, to Emacs packages. It also gave me the space to write regularly, covering topics like Emacs tips, development tutorials for macOS and iOS, a few cooking detours, and even launching a new YouTube channel . The…
Journelly 1.3 available on the App Store What is Journelly? Journelly feels like tweeting but for your eyes only. A fresh take on frictionless note-taking or journaling for iOS, powered by plain text (Markdown + Org). Save cooking recipes, movies, music, restaurants, coffee shops… Jot down your thoughts. Save your favorite quotes. Use it as a journal, memo book, or notes. Write your shopping…
It's been a little while since the last agent-shell blog post detailing changes , so we're naturally due another one detailing the latest features. What's agent-shell ? A native Emacs shell to interact with any LLM agent powered by ACP ( Agent Client Protocol ). ✨ Sponsor agent-shell ✨ So what's new? Let's go through the latest changes… Viewport/compose (experimental) The biggest change is the new…
Nearly a couple of weeks since the last Bending Emacs episode, so here's a new episode: Bending Emacs Episode 8: completing-read In this video, we take a look at the humble but mighty completing-read function. We can use it to craft our purpose-built tools, whether in pure elisp or to interact with command-line utilities. Of interest, I also highlighted the great elisp-demos package, which extends…
While in the mood to goof around with Emacs, CLI, and image rendering , I've revised an idea to generate some sort of art from your codebase (or any text really). That is, given an image, generate a textual representation, potentially using source code as input. With that, here's one : a utility to transform images into character art using text from your codebase. Rather than tell you more about…
With my recent rinku post and Bending Emacs episode 6 both fresh in mind, I figured I may as well make another Bending Emacs episode, so here we are: Bending Emacs Episode 7: Eshell built-in commands Check out the rinku post for a rundown of things covered in the video. Want more videos? Liked the video? Please let me know. Got feedback? Leave me some comments . Please go like my video , share…
In my last Bending Emacs episode, I talked about overlays and used them to render link previews in an Emacs buffer. While the overlays merely render an image, the actual link preview image is generated by rinku , a tiny command line utility I built recently. Rinku leverages macOS APIs to do the actual heavy lifting, rendering/capturing a view off screen, and saving to disk. Similarly, it can fetch…
The Bending Emacs series continues with a new a new episode. Bending Emacs Episode 6: Overlays Today we had a quick intro to overlays. Here's the snippet I used for adding snippets: (save-excursion (goto-char (point-min)) (when (search-forward "Hello World" nil t) (let* ((start (match-beginning 0)) (end (match-end 0)) (ov (make-overlay start end))) (overlay-put ov 'face '(:box (:line-width 1…
While there are plenty of messaging alternatives out there, for better or worse, WhatsApp remains a necessity for some of us. With that in mind, I looked for ways to bring WhatsApp messaging to the comfort of my beloved text editor. As mentioned in my initial findings , WhatsApp on Emacs is totally doable with the help of wuzapi and whatsmeow , which offer a huge leg up. Wasabi joins the chat…
Like it or not, WhatsApp is a necessity for some of us. I wish it weren't the case, but here we are. Given the circumstances, I wish I could use WhatsApp a little more on my terms. And by that, I mean from an Emacs client, of course. Surely I'm not the only one who feels this way, right? Right?! Fortunately, I'm not alone . With that in mind, I've been hard at work prototyping, exploring what's…
I'm now a bit over a month into my Emacs video-making journey. Today I bring a new episode. Bending Emacs Episode 5: Ready Player Mode Having migrated to mostly playing offline music, in this episode I show how to use Ready Player Mode (a package I built) for this purpose. This is what my Ready Player configuration mostly looks like: (use-package ready-player :ensure t :custom…
While it's only been a few weeks since the last agent-shell post , there are plenty of new updates to share. What's agent-shell again? A native Emacs shell to interact with any LLM agent powered by ACP ( Agent Client Protocol ). Thank you sponsors Before getting to the latest and greatest, I'd like to say thank you to new and existing sponsors backing my projects. While the work going in remains…
A little over a week ago, I introduced time-zones , an Emacs utility to easily check city times around the world. Today, I'm happy to report, the package has been accepted into MELPA . It's been wonderful to see how well time-zones was received on Reddit . ✓ You asked for MELPA publishing and I delivered . ✓ You asked for DST display and I delivered . ✓ You asked for a UTC picker and I delivered .…
I'm now a few weeks into my Bending Emacs series. Today I share a new episode. Bending Emacs Episode 4: Batch renaming files In this video, I show a few ways of batch renaming files. The covered flows are: Dired editable buffers . Multiple cursors using region-bindings-mode to insert numbers via # (I had a tiny blog entry on this). We can batch rename using Keyboard Macros too and insert numbers…
Emacs ships with a perfectly functional world clock, available via M-x world-clock . Having said that, there are two things I wish it had: A quick way to interactively add any city (bonus points for fuzzy search). An easy way to shift the time back and forth. As far as I can tell, these are neither available nor possible on the built-in world-clock (please correct me if otherwise), so when my…
Continuing on the Bending Emacs series, today I share a new episode. Bending Emacs Episode 03: Git clone (the lazy way) In this video, I show my latest iteration on an expedited git clone flow. If this topic sounds familiar, I covered it back in 2020 with my clone git repo from clipboard post. My git clone flow consists of copying a git repo URL to the clipboard and subsequently invoking M-x…
While it's only been a few weeks since introducing Emacs agent-shell , we've landed nearly 100 commits and enough improvements to warrant a new blog post. More agents agent-shell now includes support for two additional ACP-capable agents: Claude Code Codex via codex-acp (new) Gemini CLI Goose (new) Unified entry point In addition to starting new shells via agent-specific commands, we now have a…
While still finding my footing making Emacs videos, today I'm sharing my second video. Bending Emacs Episode 02: From vanilla to your flavor The video is a little longer than I intended at 14:37, so plan accordingly. In this video, I show some of my favorite UI customizations, with additional tips and tricks along the way. Like my first video, I'm hoping you find unexpected goodies in there…
While most of the content I share is typically covered in blog posts, I'm trying something new. Today, I'll share my first episode of Bending Emacs. This video focuses on how I like to apply (or batch-apply) command line utilities. While the video focuses on applying command line utilities, here's a list of all the things I used: Org mode for the presentation itself. ffmpeg does the heavy lifting…
Not long ago, I introduced acp.el , an Emacs lisp implementation of ACP ( Agent Client Protocol ), the agent protocol developed between Zed and Google folks . While I've been happily accessing LLMs from my beloved text editor via chatgpt-shell (a multi-model package I built), I've been fairly slow on the AI agents uptake. Probably a severe case of old-man-shouts-at-cloud sorta thing, but hey I…
I recently shared my early Emacs experiments with ACP , the Agent Client Protocol now supported by Gemini CLI and Claude Code LLM agents. While we can already run these agents from Emacs with the likes of vterm , I'm keen to offer an Emacs-native alternative to drive them. To do that, I'm working an a new package: agent-shell (more on this to be shared soon). While this new Emacs agent shell has…
Last week, I was delighted to see the Zed editor shipping beta support for their Claude Code integration . Being an Emacs enthusiast, you may wonder about my excitement. In their demo, the Zed team mentioned the integration is now possible thanks to Agent Client Protocol (ACP) , which they developed in collaboration with Google. This is great news for Emacs users, as it opens the possibilities for…
James Dyer and I both ran into the same workflow snag when fixing source indentation . He explains it best: You’re working in a file with inconsistent indentation You want to fix the entire buffer’s formatting You run C-x h (select all) followed by M-x indent-region Your mark is now at the beginning of the buffer, disrupting your workflow Naturally, this is Emacs and were both able to patch our…
I had an annoying chatgpt-shell bug where sometimes the compose buffer's svg header would disappear while text was streaming into the Emacs buffer. There are a number of things that could have gone rogue when streaming and post-processing buffer text, so I wasn't quite sure where to start narrowing things down. I had a feeling I could maybe use something like after-change-functions hook to monitor…
It's been well over a year now since I've moved most of my music consumption away from streaming. I started purchasing music again, just so I can play offline at any time (and on my terms). That's not so say I don't stream, but that's now purely reserved for discovery. Most playback happens via Ready Player Mode , a little Emacs player I built when I decided to take playback offline. This post…
On a whim, after seeing a random brisket picture online, I decided today was the day to make my first brisket. Ingredients 15g Kosher salt (coarse) 15g Black pepper (coarsely ground) 10g Smoked paprika 5g Chipotle powder 5g Onion granules 5g Garlic granules 2g Cumin seeds, toasted and ground 2g S&B hot mustard powder 5g Brown sugar Clean Rinse and pat dry. Sear Salt both sides and sear. Dry rub…
A little while ago, I added an info header to chatgpt-shell 's compose buffer. It displays the current model's icon, using the lovely Lobe Icons 🥨 . With that in place, it was only a matter of time until M-x chatgpt-shell-swap-model got a similar upgrade in my Emacs package. As of chatgpt-shell v2.30.1, you can get the upgrade too. If you prefer to keep graphics out of model-picking, I got you…
Me: Have you heard of Emacs? Me: On the surface, it looks like a text editor… Me: But really, it's more like a gateway to a world moulded to your needs. Me: Emacs ships with an RPN calculator and even a doctor . Me: Naturally, it doesn't do everything I want it to do nor how I want it to. Me: Luckily, I can throw elisp at it and make it do things my way. Stranger: Huh?? Me: Emacs didn't quite do…
Marcin ‘mbork’ Borkowski has a nice post showing us how he trims video clips from our beloved editor . Trimming clips is something I do from time to time, specially when posting a screencast of sorts. Since I don't need much, I typically resort to QuickTime Player's trimming functionality that ships with macOS. While it does the job, ever since I added a "graphical" seeker to Ready Player Mode , I…
macOS apps typically benefit from built-in voice dictation input (included as a macOS freebie), with little to no additional work required from app developers. Emacs had supported this capability until relatively recently, when we began seeing reports that dictation was no longer available as of Emacs 30 . While I have no direct experience with macOS dictation-related APIs, I bisected Emacs 30…
While I missed Emacs Carnival 's Take two , with this month's prompt being Writing Experience , I figured I may have a thing or two to share about my Org adoption. Org mode is often regarded as one of the indispensable Emacs features. A Swiss army of sorts enabling outlining, presentations, task management, agenda, note-taking, blogging, literate programming, the list goes on… At its core, Org…
Redditor sauntcartas offers a nice solution for getting Emacs dired filenames in an arbitrary order . I have to say, while relatively rare, this is something I need from time to time. You see, I like to apply batch file operations from the comfort of dired buffers (via dwim-shell-command ). Take, for example, M-x dwim-shell-commands-join-images-horizontally . It does what it says on the tin. I can…
Patching and building Emacs from source on macOS is fairly straightforward, but what if I'd like to patch my Emacs Plus Homebrew builds? Let's cover both ways of patching our favourite editor… Patching Emacs upstream sources If you'd like to build from the master branch, you can check its sources out like so: git clone git://git.sv.gnu.org/emacs.git cd emacs Next, we'll patch Emacs source as…
Back in February, I asked folks on the Fediverse if I should try to contribute native macOS sharing to Emacs upstream . While folks were keen on the sharing feature, there were reservations about whether or not a macOS-only patch would be welcome upstream. While my chances of success sounded fairly low, I figured I had to at least try before giving up… and I have to say, I'm glad I gave it a…