{"id":16664204,"url":"https://github.com/jmitchell/birdnest","last_synced_at":"2026-04-01T17:02:43.640Z","repository":{"id":31082880,"uuid":"34641897","full_name":"jmitchell/BirdNest","owner":"jmitchell","description":"personal Emacs configuration","archived":false,"fork":false,"pushed_at":"2016-04-06T06:31:03.000Z","size":16,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-27T23:42:16.434Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jmitchell.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-04-27T02:31:11.000Z","updated_at":"2016-04-06T06:31:04.000Z","dependencies_parsed_at":"2022-07-22T11:02:23.486Z","dependency_job_id":null,"html_url":"https://github.com/jmitchell/BirdNest","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jmitchell/BirdNest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmitchell%2FBirdNest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmitchell%2FBirdNest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmitchell%2FBirdNest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmitchell%2FBirdNest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jmitchell","download_url":"https://codeload.github.com/jmitchell/BirdNest/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmitchell%2FBirdNest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31290538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-12T10:44:15.868Z","updated_at":"2026-04-01T17:02:43.610Z","avatar_url":"https://github.com/jmitchell.png","language":"Emacs Lisp","funding_links":[],"categories":[],"sub_categories":[],"readme":"* Bird Nest\nI've declared [[http://www.emacswiki.org/emacs/DotEmacsBankruptcy][Emacs init bankruptcy]] a few times, and I want that to\nstop. Bird Nest is my attempt to build a satisfying and maintainable\nEmacs configuration from scratch.\n** Objectives and Strategy\n- learn and use the abstractions provided by Emacs/elisp\n  - reading the Emacs Lisp Intro info doc helped immensely (and I\n    imagine the other info pages will too)\n- track questions, pain points, and nice-to-haves\n- work well on Linux, OS X, and Windows\n- avoid the \"would I regret changing/removing this?\" conundrum\n  - use version control\n  - record notes about decisions and concerns\n  - cite sources to retain context\n** Why not use configuration X?\nFor the past 6 months or so I was happily using a personal fork of\nSteve Purcell's [[https://github.com/purcell/emacs.d][emacs.d repo]]. Sometimes I added new packages and\nconfigured them to my liking, and other times I made minor tweaks to\nSteve's elisp. This worked well enough. The elisp was divided into\nmodular files and used clear conventions to wire everything\ntogether. I admit I didn't fully understand how every function worked,\nbut it helped me see how a multi-faceted elisp project could be\norganized.\n\nRecently, whenever I saved a file Emacs was automatically doing\nsomething extra to be helpful. Generally this behavior was indeed\nhelpful, but in this case it was a little /too/ helpful. I just wanted\nit to stop. As an elisp newbie I didn't know how to see what Emacs was\nactually doing.\n\nI narrowed the problem down by restarting Emacs with the =-q= flag to\nbypass my/Steve's configuration. The problematic behavior stopped, so\nI knew it had to be coming from the elaborate init config. Next I\nopened a terminal (outside of Emacs) and grepped =~/.emacs.d= for\nterms I thought might be relevant to the behavior. I opened a few\npromising matches in Emacs and iteratively commented out customization\nuntil the behavior finally stopped.\n\nIt worked, but I was sure Emacs could have made this\neasier...somehow. I regularly use =C-h k= to look up what command is\nbound to the given keybinding and =C-h f= to see a function's\ndocumentation. Figuring out what elisp function Emacs invokes when I\npress =C-x C-s= was easy, but what then? It would be obvious if I knew\nhow to do any of the following:\n\n- quickly find an elisp function's definition\n- step through elisp using a debugger\n- generate a trace log of elisp calls and search it\n- inspect a list of hooks triggered, directly or indirectly, by a\n  function\n\n...but I didn't know how to do any of that. I was stuck doing an\niterative divide-and-conquer search without the help of Emacs or\nelisp. That bothered me. I decided at this point that Steve's\nconfiguration, while excellent, was serving as a crutch.\n\nEmacs promises to be hackable and extensible. That promise is the main\nreason I've used it as long as I have. But what good is a promise like\nthat if I don't know how to leverage it when opportunity arises? I've\nseen other people hack solutions and benefitted from their work, but\nhaven't taken the time really learn how to hack Emacs myself. The best\nway I know of to start is to work on my own nest.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmitchell%2Fbirdnest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjmitchell%2Fbirdnest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmitchell%2Fbirdnest/lists"}