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 editor to smoothen things out. While I ran into the same indent-region snag after selecting an e...| xenodium.com @alvaro
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 changes, but that only tells me about the text modified. I wanted to know which of my functions ...| xenodium.com @alvaro
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 isn't so much about Ready Player and more about a recent dired experience. I had a directory with a h...| xenodium.com @alvaro
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 Crush spices, mix, and apply the rub generously all over the surface of the brisket, pressing gentl...| xenodium.com @alvaro
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 covered. Set chatgpt-shell-show-model-icons to nil. Make it all sustainable Is chatgpt-shell useful...| xenodium.com @alvaro
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 all the things I wanted it to, so… Me: I made it play music how I wanted it to. Me: Control my ...| xenodium.com @alvaro
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 ti...| xenodium.com
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 sh...| xenodium.com
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 changes affecting macOS-related code (typically Objective-C code with .m file extensions). This led m...| xenodium.com @alvaro
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 features are powered by a versatile markup. Kinda like Markdown but on steroids. When starting with O...| xenodium.com @alvaro
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 mark a handful of image files via dired and easily join them into a single file. The problem is tha...| xenodium.com @alvaro
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 needed. For example, I recently wanted to patch src/nsterm.m to see if I could fix a macOS dictation...| xenodium.com @alvaro
UPDATE: has evolved a bit and is now on MELPA. I had been meaning to give ChatGPT a good try, preferably from Emacs. As an eshell fan, ChatGPT seeme...| xenodium.com
As a beginner learner of Japanese, I still need regular practice reading Kana (Hiragana and Katakana). Rather than using one of the countless existing...| xenodium.com
I typically like my macOS desktop free from distractions, which includes hiding the status bar. Having said that, I don't want to lose track of time,...| xenodium.com
When Journelly launched, I asked users to get in touch if they were interested in Markdown support. Since then, Markdown has by far been the most requested feature. Today, I’m excited to share that Journelly beta builds now include initial Markdown support! If you’ve been in touch, you likely already have access. If not, let me know you’re interested. Journelly still defaults to Org as its preferred markup, but you can now switch to Markdown from the welcome screen or the menu. While Or...| xenodium.com @alvaro
What's new? Journelly v1.2 focuses exclusively on improving app accessibility. In particular: Improved VoiceOver navigation and general app experience. Improved edit layout when "Settings > Accessibility > Display & Text Size > Button Shapes" is enabled. Huge thanks to Yvonne Thompson for all her help shaping this release. VoiceOver support is in way better shape as a result. Journelly 1.2 available on the App Store What is Journelly? Journelly feels like tweeting but for your eyes only. A fr...| xenodium.com @alvaro
With a handful of apps on the App Store, I like to keep an eye on their rankings and user reviews from around the world. I don't need much. Just a quick glance. A few of weeks ago, it just dawned on me that my Mac's status bar is likely the perfect place to keep this glanceable information handy. And with that, I built Ranking Officer. A little utility to do just that. I wasn't too sure if this app would make it to the App Store. To my delight, Apple reviewed and accepted on its first submiss...| xenodium.com @alvaro
Update: Added macOS Trash integration. While GNU/Linux had been my operating system of choice for many years, these days I'm primarily on macOS. Luck...| xenodium.com
In addition to including user content, Journelly entries typically bundle a few extra details like timestamp, location, and weather information, which...| xenodium.com
Journelly 1.1 available on the App Store What is Journelly? Journelly feels like tweeting but for your eyes only. A fresh take on frictionless note-taking for iOS, powered by Org plain text. 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 lists. Document your travels. Lots more… Check out journelly.com for details. What's new? Journelly v1.1 is the first release...| xenodium.com @alvaro
When it comes to programming LLM tools, I've seen modes of interaction in the form of code completion, patch application, improvement suggestions, and...| xenodium.com
JTR recently posted an interesting question in response to Irreal's post wondering why he feels the need to use something that is not Emacs for quick notes? While I'm in no position to speak on behalf of Irreal, I am the Ramírez building this Journelly app JTR speaks of ;-) From my perspective as the author, I'm building this app to fill a void I have, complementing my org-mode usage. In my opinion, it's not a question of whether to use Journelly over Emacs. I freakin' love Emacs org. I don'...| xenodium.com @alvaro
The Mac Observer is showcasing Monday App Finder: Journelly, a Twitter-Like Journal for iOS. #+ATTR_HTML: :width 70% Bemfica de Oliva does a wonderful rundown of Journelly's features and capabilities, much better than anything else I've posted before. They even mentioned Org markup and Emacs text editor, for those who want to drop down to its plain text storage. A nice treat, as these aren't typically showcased in the space. If you're curious about what Journelly can do, check out Bemfica's p...| xenodium.com @alvaro
I've reignited Journelly, my note-taking/journaling project. The iOS app is coming along nicely. I've been using Journelly daily. The best I can describe the experience is: "kinda like tweeting but for my eyes only". Journelly automatically includes date and time in your entries. Optionally, it'll also include location and weather details. For now, your entries can include text, images, checkboxes, bullets, and links. While entering items orally isn't yet possible as per Irreal's post, you ca...| xenodium.com @alvaro
Back in November, I announced the chatgpt-shell Emacs package going offline. In real terms, it meant adding Ollama support after chatgpt-shell went multi-model. Since then, support for a handful of providers and models has been added. While DeepSeek is the latest joinee, Open Router (thank you djr7C4), Kagi summarizer, and Perplexity are also a model-swap away. chatgpt-shell is nearing 30K MELPA downloads. Are you a happy user? Consider making this project sustainable by ✨sponsoring✨.| xenodium.com @alvaro
After resetting my Keychron K3 Pro, my F1 to F12 keys were no longer my default macOS keys. The entire row was defaulting to macOS's special keys (i.e. Mission Control, Launch Pad, Volume, etc). At first, I thought I may just need to revisit the macOS setting "Use F1, F2, etc keys as standard function keys", yet toggling the setting made no difference. Turns out, I had remapped those keys long ago and simply forgot about it. Factory resetting my keyboard got rid of this customization. This po...| xenodium.com @alvaro
cPiArtFrame. DIY E-Ink clock update with more faces, github repo & full youtube tutorial. Show HN: E-Paper 7-color display showing the current weather | Hacker News.| xenodium.com @alvaro
Reading crumbs structure: fermentation. Todays loaf and some advice after making 100+ loaves over 6 years.| xenodium.com @alvaro
Buns 150 ml milk 2 tsp instant yeast (2.25 tsp active-dry yeast, 17.5g fresh yeast) 1 large egg 1 egg yolk 50 grams sugar 1/2 tsp vanilla extract 1/2 tsp ground cardamom 1/2 tsp salt 375 grams all-purpose or bread flour 57 grams unsalted butter, softened Filling 71 grams unsalted butter, softened 65 grams brown sugar 1.5 tsp ground cardamom Pinch of salt| xenodium.com @alvaro
Ready Player Mode, which began as a tiny media-viewing experiment, has now become my daily music player. Along the way, I moved from regular daily streaming to buying and playing music offline, relying on the odd streaming service exclusively for discovery. This setup's been working great so far. I get unrestricted playback (for life) with the occasional discovery session whenever I see fit. Setup Ready Player Mode runs in Emacs. You install it, enable its minor mode (for media recognition), ...| xenodium.com @alvaro
Emacs users may be known for bringing in all sorts of diverse workflows into their beloved text editor. From the outside, I get how odd this may seem. We often treat our text editor as a platform of sorts to do our email, web browsing, calendars, project management, chat… the list goes on. Take email, as an example. Back in 2018 I thought "managing email from Emacs… surely that's crazy-talk", yet I gave it a try just in case. 7 years later and I never looked back. I still use the excellen...| xenodium.com @alvaro
Happy New Year! If you follow my blog, you may have noticed that I've been hosting it on lmno.lol for a while now, a blogging service I built (invitation-only until now). Why build a blogging platform There's been a resurgence in blogging of sorts. Wonderful in itself, but the popular platforms are fairly erm unfriendly to their readers. These days, search results might lead you to an interesting blog post, but you're greeted with messages like: “The author made this story available to ^^^^...| xenodium.com @alvaro
Some time ago, I wrote about adding multiple cursor support to symbol-overlay by gluing the two packages together. If you're keen to learn how to bend Emacs to your way, have a look at that post. Later on, in a "Multiple cursors - how and why?" Reddit post, I showcased the overlay usage. Peter Oliver asked if the package could be submitted to MELPA. To my delight, he also volunteered to take on the submission. Unfortunately, I had failed to check back on the MELPA submission until today. I'm ...| xenodium.com @alvaro
A few days ago, Sacha Chua mentioned how cool it would be to have an Emacs video index like Ruby Video. I mentioned how I had similarly considered a low-tech solution, maybe powered by plain text (bonus points for org mode of course). A little later, Sacha shared a preliminary video feed dump, in org! With that, I wrote the first experiment to render the org feed and emacs.tv was born. emacs.tv is merely a few days old. Powered by an org feed (rendered client-side), but we can fetch and rende...| xenodium.com @alvaro
These days, my LLM interactions primarily take place via chatgpt-shell's compose UX. I've grown fond of this hybrid style of interaction. On sharing the latest incarnation, jllw asked about the possibility to port to comint shells. With jllw's great idea in mind, I set out to prototype an eshell pager, my preferred shell. The initial results ain't too shabby: While you can easily flip through all eshell commands and outputs (via single-character n/p bindings), you can also compose and fire of...| xenodium.com @alvaro
LLM chats are often handy for refining answers to a question or task, part of a bigger goal. Navigating the chat transcript, copying and pasting, can be a frequent operation in the bigger goal. If we can do it more efficiently, the better. While chatgpt-shell offered chatgpt-shell-next-item and chatgpt-shell-previous-item commands, it had a few rough edges which prevented me from fully adopting. The default bindings C-c C-n and C-c C-p didn't exactly help either, making repeated navigation fa...| xenodium.com @alvaro
A few days ago, redditor gollyned asked about best practices: developing on top of modern elisp packages. It reminded of my modern Emacs lisp libraries post, which I shared with them. While my post is roughly 4.5 years old, these days I continue to reach out to the likes of seq.el, map.el, subr-x.el and let-alist.el on a regular basis. My post also shared some great third party options. Maybe my post could use an update? Happy to take suggestions. A few days later, I ran into awesome-elisp, w...| xenodium.com @alvaro
A week ago, I announced chatgpt-shell going multi-model. What I failed to mention is that because ob-chatgpt-shell (its org babel Emacs cousin) relies on chatgpt-shell, this babel package has now gone multi-model also. ob-chatgpt-shell follows the familiar babel form. To swap models, use the existing :version param as follows. #+begin_src chatgpt-shell :results output :version gpt-4o Who built you? #+end_src #+RESULTS: : I was developed by OpenAI, a research organization focused on creating a...| xenodium.com @alvaro
chatgpt-shell includes a couple of mechanisms to operate on an Emacs buffer region. That is, select a region and ask the LLM robots to modify it for us. Until now, both of these mechanisms didn't quite close the loop. They could either modify current region or iterate on a separate solution, but never both. M-x chatgpt-shell-quick-insert While chatgpt-shell's quick insert mechanism already enabled selecting a region and requesting changes, it was more of a "I'm feeling lucky" situation. If th...| xenodium.com @alvaro
I'm a fan of macOS's auto-hide menu bar setting. Unless I'm reaching out to a menu item, I don't typically need to have a visible menu bar, so I set auto-hide to "Always". On rare occasions, I turn this setting off (say for a screen grab). While reaching out to macOS Control Center is OK, I wanted to quickly toggle it from the comfort of Emacs via M-x fuzzy search. We can leverage AppleScript to toggle the setting on and off. In the past, I would write shell scripts for this kinda thing and i...| xenodium.com @alvaro
Since chatgpt-shell going multi-model, it was only a matter of time until we added support for local/offline models. As of version 2.0.6, chatgpt-shell has a basic Ollama implementation (llama3.2 for now). chatgpt-shell is more than a shell. Check out the demos in the previous post. For anyone keen on keeping all their LLM interactions offline, Ollama seems like a great option. I'm an Ollama noobie myself and already looking forward to getting acquainted. Having an offline LLM available at my...| xenodium.com @alvaro
Over the last few months, I've been chipping at implementing chatgpt-shell's most requested and biggest feature: multi-model support. Today, I get to unveil the first two implementations: Anthropic's Claude and Google's Gemini. Changing course In the past, I envisioned a different path for multi-model support. By isolating shell logic into a new package (shell-maker), folks could use it as a building block to create new shells (adding support for their favourite LLM). While each shell-maker-b...| xenodium.com @alvaro
The chatgpt-shell package started as an experiment glueing the ChatGPT API to an Emacs comint buffer. Over time, it grew into several packages within the same repository: shell-maker, ob-chatgpt-shell, dall-e-shell, ob-dall-e-shell, and of course chatgpt-shell itself. I'm splitting the repository as a first step in reworking chatgpt-shell to enable multi-model support (i.e. Gemini, Claude, and others), a popular feature request. Want multi-model support? Go 👍 the feature request and ✨spo...| xenodium.com @alvaro
It's been 5 years since I talked about showing/hiding Emacs dired details in style, a short post showcasing hide-details-mode (built-in) and diredfl (third-party). While my dired usage increased over the years, my dired config remained largely unchanged. Today, I'll show a new dired tweak. As you likely suspect by now, I'm a big fan of hide-details-mode. It gives me super clean and minimalistic view of my files. If I need more details, it's one toggle away using my trusty C-( binding. Now thi...| xenodium.com @alvaro
My significant other needed to share proof of address by providing a number of bank statements for a period of time. That's easy enough to download as pdfs from the bank, but statements typically provide more personal information than the recipient requires. For a proof of address, the first page is more than enough. macOS's Preview app can easily delete pages from a pdf by selecting undesired pages and hitting the delete key. This is fine for one pdf but for a handful of them, I figured ther...| xenodium.com @alvaro
From time to time, I want to grab a source code viewport of sorts and feed to an LLM for questioning. From Emacs, I normally use chatgpt-shell's chatgpt-shell-prompt-compose, which automatically grabs the active region. This led me to explore a few options to select a region, or maybe even roll my own. I should also mention, these regions don't typically require compilable/complete structures. In most of these instances, I just reach out to one of my region favourites like expand-region, mark...| xenodium.com @alvaro
Well-ingrained into every Emacs user is the echo area, a one-stop shop to receive any kind of message from the editor, located at the bottom of the frame. Posting messages to this area from elisp couldn't be simpler: (message "Hello world") If we want to get a little fancier, we can propertize the text to add some styling. (message (propertize "hello " 'face '(:foreground "#C3E88D")) (propertize "world" 'face '(:foreground "#FF5370"))) With this in mind, I set out to add a tiny command to rea...| xenodium.com @alvaro
A couple of months ago, I introduced Ready Player Mode, an Emacs major mode used to peek at media files from my beloved text editor. The goal was simple. Treat opening media files like any other file, that is, open and go. The initial implementation served me well while reviewing lots of tiny audio files I used to practice learning a new language. At this point, I started thinking, could I use ready-player for regular music consumption? The thing is, long ago I had stopped buying music and re...| xenodium.com @alvaro
Adding flashcards to your digital garden (with org-roam and Anki) - doubleloop. Anki Decks with Orgmode. anki-editor: Emacs minor mode for making Anki cards with Org. emacs-od2ae: Convert org-drill entries to anki-editor. GitHub - l3kn/org-fc: Spaced Repetition System for Emacs org-mode. org-anki: Sync org notes to Anki via AnkiConnect. org-drill.el - flashcards and spaced repetition for org-mode. org-fc: Spaced Repetition System for Emacs org-mode. Power up Anki with Emacs, Org mode, anki-ed...| xenodium.com @alvaro
It's been some time since the last release of *scratch* for iOS. If you haven't heard about *scratch*, it's a tiny app I built (part of the org bundle). *scratch* enables writing things on the go as quickly as possible. No need to create a new note. No need to bring keyboard up. Just open and write. Bonus: Basic Emacs org markup ;-) v1.3 (and yesterday's v1.2) are now available on the App Store. They are minor releases bringing: A monospaced font. A layout fix for "Settings > Display & Bright...| xenodium.com @alvaro
I recently wrote about image-mode's next/previous item navigation, a feature I wanted to bring to ready player mode. I was curious to see how image-mode resolved next and previous files, so I checked the associated keybinding (n) via helpful-key (my preferred alternative to describe-key), and landed on image-next-file. While this function only takes care of high-level routing, it led me to image-mode--next-file, which is where the actual next/previous file resolution happens: (defun image-mod...| xenodium.com @alvaro
For some years now, I've enjoyed macOS Ctrl-n/p movement everywhere. I sometimes forget I need Karabiner Elements to reach certain macOS corners. macOS supports many Emacs bindings (out of the box). Ctrl-n and Ctrl-p are some of my favourites. Not only can I use these to move the cursor up and down while editing text, but in many cases, for list selections too. Out of the box, list selection, in particular, is more miss than hit. Spotlight and web drop boxes are the biggest pet peeves. Withou...| xenodium.com @alvaro
Update: Doh! I was wrong. There's a better way. So, I totally missed the macOS native emoji picker is actually supported out of the box 😭. Thanks to redditor u/hrabannixlisp who pointed me in the right direction. ns-do-show-character-palette is bound to C-s-SPC by default, which didn't work for me as I use (setq mac-command-modifier 'meta), that is, ⌘ as meta modifier. While I won't be giving up (setq mac-command-modifier 'meta), I can certainly use ns-do-show-character-palette via M-x o...| xenodium.com @alvaro
Back in April, I introduced Fresh Eyes: a tiny macOS utility helping me take care of my eyes. I spend a bunch of time in front of a computer screen and Fresh Eyes has been helping me stick with the often recommended 20-20-20 rule. Fresh Eyes 1.7 ships a handful of improvements suggested by users: Postpone Fresh Eyes for 1 hour, 2 hours, 3 hours, or until the next day. Revamped notification. Revamped countdown screen. Reorganized menu. New keyboard shortcuts. Fresh Eyes is now translated to Ge...| xenodium.com @alvaro
A few weeks ago, I announced Ready Player Mode's availability on GitHub. As of today, you can find it on MELPA. Ready Player Mode is a lightweight major mode to open media (audio/video) files in an Emacs buffer. Install, enable via M-x ready-player-mode and you should be good to go. Open and preview media files (audio + video) like other files. If in repeat mode, ready-player attempts to play other files in the current directory. Track playback from the corresponding dired buffer. Playback is...| xenodium.com @alvaro
I've written about macosrec before. A tiny macOS command line utility I built to take screenshots or videos of my macOS windows. Sure, there are a gazillion utilities out there, but I wanted my own, so I could bend and integrate with Emacs buffers as needed. If you've seen me post a screenshot or gif after April 2023, it was likely taken with macosrec. As of macosrec v0.7.3, OCR was added to the mix. I've also added a couple of dwim-shell-commands (dwim-shell-commands-macos-ocr-text-from-desk...| xenodium.com @alvaro
I've written before, once you learn a little elisp, Emacs becomes this hyper malleable editor/platform. A live playground of sorts, where almost everything is up for grabs. You can inspect and tweak behaviour of just about anything to your liking. While the compounding benefits of using your favourite Emacs utilities are evident over time, learning elisp takes the compounding effect to another level. It empowers you to have those aha moments like "if I could just wire this awesome utility wit...| xenodium.com @alvaro
As an Emacs user, I eventually made the leap over to dired as my file manager of choice. Dired has magical things like wdired. But this post isn't so much about dired and more about the occasional need to peek at media files (images, audio, and video) from Emacs (including dired). To view images in Emacs, there's image mode, a fantastic major mode for taking a quick look without leaving your editor. Image mode strikes a great balance. You can get in quickly and out. The q keyboard binding is ...| xenodium.com @alvaro
While most of my Emacs workflows are typically keyboard-driven, I'm fairly pragmatic about mouse usage. My MacBook's trackpad is great for just kicking back to read and scroll through text. There are brief times, however, when that keyboard-driven muscle memory overlaps my mouse usage, resulting in a buffer catastrophe. I joke of course. What I'm actually referring to is nothing more than a slight annoyance. There are times when I inadvertently trigger <C-wheel-up> or <C-wheel-down> events (b...| xenodium.com @alvaro
Emacs wdired is a beautiful thing. You turn a directory representation into an editable buffer and you can do some magic. By magic, I mean you can apply your favourite text-editing commands to a directory and do some file management. Take, for example, batch-renaming. Turn wdired on via dired-toggle-read-only, use something like Magnar's multiple-cursors (or built-in keyboard macros) and commit via wdired-finish-edit (using the often-familar C-c C-c binding). You've now renamed multiple files...| xenodium.com @alvaro
A couple of days ago, I introduced Fresh Eyes, a little macOS utility to help me practice the 20-20-20 rule and take better care of my vision while on the computer. Today, Fresh Eyes was approved and is now available on the macOS App Store.| xenodium.com @alvaro
I've been lucky to have enjoyed healthy vision throughout my life. That is, until recently. Nothing major, I'll need glasses for some activities. I also learned from the optometrist I should follow the 20-20-20 rule to reduce eye strain. The 20-20-20 rule is simple: Take a break from looking at your computer screen every 20 minutes and look away at something roughly 20 feet away (6 metres) for 20 seconds. While there are no shortages of macOS timer apps available, I figured it'd be fun to bui...| xenodium.com @alvaro
It was only last week when I upgraded to Emacs 29.2. Yup, I was late to the party. This week, we have a new release. Emacs 29.3 is an emergency bugfix release, so this time I've upgraded promptly. I'm on macOS using the great Emacs Plus so upgraded via Homebrew using: brew reinstall emacs-plus@29 --with-imagemagick --with-no-frame-refocus --with-native-comp --with-savchenkovaleriy-big-sur-3d-icon --with-poll ps. Like this splash screen? Check out the Emacs eye candy post.| xenodium.com @alvaro
By default, Emacs typically displays curly arrows when wrapping lines. While likely a handy feature to some, I didn't really find much use for it. At the same time, I never looked into their removal until now. Turns out, there's a continuation entry in fringe-indicator-alist variable that handles this. Removing this entry also removes the curly arrows. (setq-default fringe-indicator-alist (delq (assq 'continuation fringe-indicator-alist) fringe-indicator-alist)) Alternatively, one could write...| xenodium.com @alvaro
I have three apps on the App Store: Plain Org, Flat Habits, and scratch. Plain Org / plainorg.com My more generic solution to access org files on the go and away from Emacs. Flat Habits / flathabits.com My take on frictionless habit tracking truly respecting user privacy and their time (absolutely no distractions). *scratch* / App Store Sure, we have tons of note-taking apps but most require more steps than desirable to write something down ASAP. Launch the app and you're good to write. No ne...| xenodium.com @alvaro
Emacs 29 introduced the handy sqlite-mode. Soon after, I tried a couple of experiments here and there to bring additional functionality. Folks reached out. The additions seemed useful to them and were keen on upstreaming or pushing to MELPA. While I can't commit to upstreaming at this moment, I can happily meet halfway on MELPA. As of a couple of days, you can find sqlite-mode-extras on MELPA and GitHub. Contributions totally welcome. While I haven't heard of issues, please continue treating ...| xenodium.com @alvaro
Lately, I've been slightly obsessed with Som Tam, a magnificent salad packing both crunch and flavour. I didn't have all the right ingredients for the full-blown salad at home, so I set out to experiment with the dressing's punchy flavours. While I've gone a little rogue here, I mean no disrespect to the faithful recipe and all its glory. Luckily, I did have fish sauce at home, which I considered the core ingredient, and made do with everything else I could find. This is where I landed: 2 clo...| xenodium.com @alvaro
I followed The easiest no knead bread recipe (video). No-knead method Dough 1 1/4 cups (300g) lukewarm water 2 teaspoons (8g) salt 1 teaspoon (3.5g) yeast 3 cups (420g) all purpose flour Mix thoroughly (I like to use Ciro's spoon mixing method from this video), cover and rest for 6 hours. Stretch and fold if the dough collapsed on itself to rescue. Bake Preheat oven (and dutch oven) at 230°C. Flour. I didn't have a dutch oven, but my oven-proof saucepans (with lid) did just fine. Carefully t...| xenodium.com @alvaro
I've made this seafood stew a handful of times and it's always delivered. Garlic almond paste 1/8 cup of olive oil. 8 cloves of garlic chopped. 1/4 cup almond meal (flour). Cook garlic in low-medium heat until softened. Add almond meal and cook 3-4 mins or until golden. Set aside to cool. 1 large handful of parsley. Blend the almond mixture to make a paste. Set aside. Spices 1 large onion halved and sliced. In a large pan, cook onion until softened. 1/8 cup of olive oil. 1 large red chilli fi...| xenodium.com @alvaro
o______________o | Hello world! | o--------------o \ ^__^ \ (oo)_______ (__)\ )\/\ ||----w | || || Keen to get started with your Hello World Cloudflare Worker? Skip to the setup section. A little background The vast majority of my software development experience has been centered around client-side software. The few times I've needed a server-side component for a hobby project, I've historically provisioned a linux virtual machine somewhere and ran whatever services I needed. I have to admit ...| xenodium.com @alvaro
It's been roughly 9 months since I experimented with wiring the ChatGPT API to an Emacs comint buffer in chatgpt-shell. ChatGPT's request-response nature maps fairly well to a shell's mode of interaction. In the past, I've also talked about blurring the lines between shell and editor. That is, using Emacs as your shell (eshell being my favourite) enables compounding goodies from both shell and editor when both are used from the same app. Keeping interactions within the same app also cuts down...| xenodium.com @alvaro
I've enjoyed watching A Murder at the End of the World. The show may resonate with folks following the tech world. Won't say much more than that… What I can maybe say is, the shows features Reddit, Brave browser, terminal usage (ifconfig, nmap, hydra, responder), and a reference to the good 'ol Vi vs Emacs rivalry, which I hope folks these days don't take further than friendly teasing between dear cousins. In any case, being an Emacs nut, the scene gave me a good tickle. It's a great show, ...| xenodium.com @alvaro
Needed a VPN to test an API from a different location. Gave Mullvad a try. Pretty neat, you can generate an account number without providing an email address. You can also pre-pay with a ton of options, including cash, crypto, credit cards, PayPal, wire transfers… After seeing your account credited, one can download a generated WireGuard configuration. Also a WireGuard noob, so took this opportunity to give it a try. The WireGuard macOS app has an "Import Tunnel(s) from File…" option wher...| xenodium.com @alvaro
I've been experimenting with building a rich text editing component for iOS, powered by org markup. The idea is to offer a mobile-friendly editing experience, backed by our beloved plain text format. To make things a little more interesting, I'm introducing a new org-based app to help anyone with regular journaling. 👉 Meet ✨Journelly✨ Plain text is the serialization format. No conversion/import/export needed. Though it's early days, it's fairly functional. Been using it daily for some ...| xenodium.com @alvaro
✨sponsor✨ this content I've been toying with the idea of managing browser bookmarks from you know where. Maybe dump a bunch of links into an org file and use that as a quick and dirty bookmark manager. We'll start with a flat list plus fuzzy searching and see how far that gets us. The org file would look a little something like this: ::: captioned-content ::: caption bookmarks.org ::: My bookmarks - [[https://lobste.rs/t/emacs][Emacs editor (Lobsters)]] - [[https://emacs.stackexchange.com...| xenodium.com @alvaro
Once you learn a little elisp, Emacs becomes this hyper malleable editor/platform. A live playground of sorts, where almost everything is up for grabs at runtime. Throw some elisp at it, and you can customize or extend almost anything to your heart's content. I say almost, as there's a comparatively small native core, that would typically require recompiling if you wanted to make further (native) mods. But that isn't entirely true. Emacs 25 enabled us to further extend things by loading nativ...| xenodium.com @alvaro
Note to self, I needed to migrate/re-encrypt someone's password store (aka pass). Straightforward: Get the new key, probably already in gpg key chain. Try listing it: gpg --list-keys To re-encrypt, pass init with new key is enough. It'll prompt for old pass key. cd path/to/.password-store pass init NEW-GPG-KEY| xenodium.com @alvaro
I'm neither a burger expert nor a connoisseur of any kind, yet I sure have a lot of fun smashing burgers at home. Needless to say, I shamelessly enjoy gobbling them too! my smash burgerI'll share details on how I smash my burgers, but here's a quick ingredient list, if that's all you need. Mince beef (20%-30% fat). Streaky bacon. Brioche burger buns. American cheese slices (cheddar individual slices work too). Lettuce. Tomatoes. Onions. Pickles. Jalapeños. Garlic. Chipotle powder. Mayonnaise...| xenodium.com @alvaro
I live mostly in Emacs. I say mostly 'cause well, I'm fairly pragmatic about it. If there's a workflow elsewhere that's more appropriate for my needs, I'll happily use that instead. While I'd love to do my web browsing from my beloved editor, Firefox ticks the right boxes for me. I do most of my iOS coding in Emacs. It's a hybrid of sorts between Emacs and Xcode. If I need to use the debugger, Xcode is a clear winner for me. If I happen to be visiting a Swift file in an Emacs buffer, I typica...| xenodium.com @alvaro
A quick one… I recently wanted to trim the black borders around a video screenshot. While I could use an image editor to manually select and trim, I wondered if there was an imagemagick trick somewhere out there for such a thing… and of course there was: magick convert -fuzz 3% -define trim:percent-background=0% -trim +repage path/to/input.png path/to/output.png Pretty neat. It does the job, but I won't remember it next time. May as well make another dwim-shell-command function out of it ...| xenodium.com @alvaro
A benefit of running Emacs as a GUI app, is that you can view images from your beloved editor. This is super handy to take a quick peek at any image. Sometimes, I'd like a little more than just viewing the image. I'd like to see basic image details like type, dimensions, and file size. The imagemagickidentify utility is pretty handy for that. identify -format "%m %wx%h %b" path/to/image.png I could easily invoke shell-command for this or even create a dwim-shell-command function (maybe I will...| xenodium.com @alvaro
UPDATE: This method no longer works for creating iCloud accounts. I'd love to know if you find an alternative. Please let me know. I wanted an additional @icloud.com account for myself. My first thought was to head over to https://developer.apple.com and create a new account, but that requires an existing email address. I wanted an actual @icloud.com email address. My next thought was to create a new account using the iOS simulator, but that complained about creating too many accounts already...| xenodium.com @alvaro
colima: Container runtimes on macOS (and Linux) with minima…. finch: The Finch CLI an open source client for container development. lima VM - Linux Virtual Machines On macOS - Earthly Blog. lima: A nice way to run Linux VMs on Mac | Hacker News. lima: Linux virtual machines. macpine: Lightweight Linux VMs on MacOS. OrbStack · Fast, light, simple Docker & Linux on macOS. tart: macOS and Linux VMs on Apple Silicon to use in CI a…. Virtualisation on Apple silicon – The Eclectic Light Comp...| xenodium.com @alvaro
My Emacs (v29.1) was hanging when saving changes to .authinfo.gpg. Turns out, I ran into a known issue with a workaround. Downgrading gnupgp to a version older than 2.4.1 sorts things out. I'm on macOS. Downgraded by downloading the 2.4.0 Homebrew formula at https://raw.githubusercontent.com/Homebrew/homebrew-core/59edfe598541186430d49cc34f42671e849e2fc9/Formula/gnupg.rb and installing with: brew unlink gnupg brew install ~/Downloads/gnupg.rb| xenodium.com @alvaro
As I was getting ready to take an Emacs screenshot in the previous post, I figured I may want to redact email addresses before moving forward. I had a quick look for existing options and found redacted.el, built-in toggle-rot13-mode, and unpackaged/lorem-ipsum-overlay. All great options. I wanted a solution I could feed a single regular expression to obscure matches. I also wanted toggling capabilities, so I had a quick go at it… I also wanted the ability to redact the entire buffer content...| xenodium.com @alvaro
While on Mastodon, I spotted @summeremacs looking into sending Emacs text selections to a Kindle via email. This sparked my interest as I previously looked into sending pdfs to my Kindle via mu4e. Kindle offers a neat service where you can email a file to your @kindle.com address and it automatically shows up in your Kindle library. I already do email from my beloved editor, and like most Emacs things, it's powered by elisp. In other words, it's basically up for grabs if you'd like to glue it...| xenodium.com @alvaro
From time to time, I need to generate a SHA-256 hash from a file hosted on some server. For me, this flow typically goes something along the lines of: Copy the file URL from browser. Drop to Emacs eshell. Change current directory. Type "curl -o file" Paste the file URL. Run curl command. Type "shasum -a 256 file". Run shasum command. Copy the generated hash. Maybe delete the downloaded file? We can maybe shave some steps off by downloading directly from the browser, though that may also bring...| xenodium.com @alvaro
Artur Malabarba's Debugging Elisp Part 1: Earn your independence is nearly a decade old, yet it rings just as true today. Learning to Edebug really "is the right decision for anyone who doesn't know how to Edebug." Why, you may ask? He best puts it as "running into errors is not only a consequence of tinkering with your editor, it is the only road to graduating in Emacs." For me personally, it earned me that independence to bend Emacs my way. Don't like how something works? Pull up the debugg...| xenodium.com @alvaro
I've continued poking at Emacs 29's sqlite-mode. Since my last post on extensions, I've experimented a little with adding a handful of interactive functions: sqlite-mode-extras-compose-and-execute: Compose and execute a query. sqlite-mode-extras-execute: Execute a query. sqlite-mode-extras-add-row: Add row to table at point. sqlite-mode-extras-delete-row-dwim: Similar to sqlite-mode-delete but also enables deleting range in region. sqlite-mode-extras-refresh: Refreshes the buffer re-querying ...| xenodium.com @alvaro
My significant other and I had two plastic Tesco Clubcards. I lost mine, so I took a picture of hers. I was fairly certain a barcode photo would scan just as well at self-checkout, and it did. This got me thinking about Apple's Wallet pkpasses. I don't really know much about them. Could I potentially create my own .pkpass? If I could just include the same barcode as in the photo, it should do the job just fine. Now I should mention, Tesco does have an app on the App Store. If you just want th...| xenodium.com @alvaro
I recently wrote about Emacs 29's new sqlite-mode, which enables you to browse sqlite databases from your beloved editor. Out of the box, it supports the following browsing features: sqlite-mode-list-data: List the data from the table under point. sqlite-mode-list-column: List the columns of the table under point. sqlite-mode-list-tables: Re-list the tables from the currently selected database. On the editing side of things it supports row deletion: sqlite-mode-delete: Delete the row under po...| xenodium.com @alvaro
I've jumped on the Emacs 29 bandwagon! Mickey Petersen has a great rundown of What's New in Emacs 29.1. Now every so often, I need to take a quick peek at an sqlite3 table. Emacs 29.1 ships sqlite-mode, which can help with that. Use sqlite-mode-open-file to open a database. Pressing RET on a table shows its content via sqlite-mode-list-data. DEL does as you'd expect and delete a row via sqlite-mode-delete.| xenodium.com @alvaro
Another day, another tool brought to my Emacs fingertips. A while ago, I wrote about easily copying text from desktop to mobile via QR codes. Later on, I brought it under dwim-shell-command as dwim-shell-commands-clipboard-to-qr. This time around, I needed the opposite: to scan a code from an image file. This is where zbar's zbarimg comes in. These days, I'm mostly on macOS, so I installed via Homebrew: $ brew install zbar There's really nothing to the command. You feed it an image, and it ou...| xenodium.com @alvaro
It's been roughly a decade since I wrote any significant amount of JavaScript. Back then, I primarily relied on the Google Closure Compiler, now maybe an archaeological artefact? These days, it's hard not to bump into any JavaScript project that doesn't rely on npm, along with many other tools like the Typescript compiler, ESLint, Prettier… There are a ton of available frameworks too. I was somewhat put off (or maybe just lazy?) by the initial ramp-up to reenter the JavaScript world. I gues...| xenodium.com @alvaro
Emacs is a part-time job. A multi-language development environment. A lisp machine. An email client. A web browser. A zettelkasten. A spreadsheet. A mastodon client. A shell. A ledger. A super agenda. An operating system. Some say it sends ripples into the atmosphere or plays tetris for you. It may even warm your place up during the winter. Can meme with you. It's an ultra-malleable editor with endless possibilities, powered by your life-long customizations. Oh man, no wonder we need to chat ...| xenodium.com @alvaro
Back in April, I shared chatgpt-shell updates, showcasing chatgpt-shell features. It's been a little while, so here's an update with the latest additions. Like this project? Consider ✨sponsoring✨. Multi-session support You can run multiple shell instances independently configured to use different versions or system prompts. This was biggest recent change. Please report issues. Display system prompt and version The current shell's version and system prompt are now displayed more prominentl...| xenodium.com @alvaro
James Dyer has a nice post sharing his frequent dired need to duplicate files. He offers a solution using a custom interactive command. His use-case resonated with me. Similarly, James' recommendation to bind his file-duplicating command to C-c d [^1] sent a signal to my brain triggering Bozhidar Batsov's crux-duplicate-current-line-or-region. crux-duplicate-current-line-or-region is part of a "collection of Ridiculously useful extensions for Emacs" (yeah that's crux). The command itself does...| xenodium.com @alvaro
I recently wanted a few images stitched together. A perfect job for ImageMagick. A quick search yielded the magical incantation: convert image1.jpg image2.jpg image3.jpg +append joined.jpg Great, now I know, but I'll rarely use it and will soon forget it. I may as well add it to my repository of DWIM command line utilities, wrapped in a convenient Emacs function, applicable from different contexts… know what I mean? 🙃 I built dwim-shell-command for this purpose. You can take the above co...| xenodium.com @alvaro
While Org babel's noweb isn't something I've frequently used for literate programming, its simplicity makes it rather versatile to glue all sorts of babel things I hadn't previously considered. The idea is simple. Add a placeholder like <<other-block>> to an org babel source block, and it will be automatically replaced (verbatim) with the content (or result) of referred block before execution. You'll also need the :noweb yes header argument. #+NAME: other-block #+begin_src swift print("Hello ...| xenodium.com @alvaro