{"id":22498664,"url":"https://github.com/LionyxML/emacs-solo","last_synced_at":"2025-08-03T06:31:11.863Z","repository":{"id":230342803,"uuid":"779125967","full_name":"LionyxML/emacs-solo","owner":"LionyxML","description":"A Pure Emacs (no external packages) IDE like configuration.","archived":false,"fork":false,"pushed_at":"2024-12-01T23:49:02.000Z","size":126,"stargazers_count":9,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-02T00:28:48.905Z","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":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LionyxML.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-29T05:10:06.000Z","updated_at":"2024-12-01T23:49:05.000Z","dependencies_parsed_at":"2024-04-07T02:35:14.651Z","dependency_job_id":"51ff960a-760e-4950-b58a-de94123324dc","html_url":"https://github.com/LionyxML/emacs-solo","commit_stats":null,"previous_names":["lionyxml/emacs-solo"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LionyxML%2Femacs-solo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LionyxML%2Femacs-solo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LionyxML%2Femacs-solo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LionyxML%2Femacs-solo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LionyxML","download_url":"https://codeload.github.com/LionyxML/emacs-solo/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228530248,"owners_count":17933262,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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-12-06T22:01:39.986Z","updated_at":"2025-08-03T06:31:11.843Z","avatar_url":"https://github.com/LionyxML.png","language":"Emacs Lisp","funding_links":[],"categories":["Emacs Lisp"],"sub_categories":[],"readme":"#+AUTHOR: Rahul Martim Juliato\n#+EMAIL: rahul.juliato@gmail.com\n#+OPTIONS: toc: nil\n\n#+HTML: \u003cp align=\"center\"\u003e\n#+HTML:   \u003cimg src=\"doc/emacs-solo-logo.png\" alt=\"Project Logo\" width=\"300\"/\u003e\n#+HTML:   \u003cbr/\u003e\n#+HTML:   \u003cimg src=\"https://img.shields.io/badge/Emacs-30%2B-green.svg\" alt=\"Emacs 30+\"/\u003e\n#+HTML:   \u003cimg src=\"https://img.shields.io/badge/License-GPLv3-blue.svg\" alt=\"GPLv3 License\"/\u003e\n#+HTML: \u003c/p\u003e\n\n#+HTML: \u003cp align=\"center\"\u003e\n#+HTML:   A \u003cem\u003efast\u003c/em\u003e, \u003cem\u003epowerful\u003c/em\u003e and \u003cem\u003emodular\u003c/em\u003e Emacs configuration that favors built-in functionality over third-party packages.\n#+HTML: \u003c/p\u003e\n\n#+HTML: \u003cp align=\"center\"\u003e\n#+HTML:   \u003ca href=\"#obligatory-screenshots\"\u003e\u003cstrong\u003eScreenshots\u003c/strong\u003e\u003c/a\u003e ·\n#+HTML:   \u003ca href=\"#as-seen-on-system-crafters\"\u003e\u003cstrong\u003eSystem Crafters Demo\u003c/strong\u003e\u003c/a\u003e ·\n#+HTML:   \u003ca href=\"#minimum-emacs-version\"\u003e\u003cstrong\u003eEmacs Version\u003c/strong\u003e\u003c/a\u003e ·\n#+HTML:   \u003ca href=\"#optional-dependencies\"\u003e\u003cstrong\u003eOptional Dependencies\u003c/strong\u003e\u003c/a\u003e ·\n#+HTML:   \u003ca href=\"#installation\"\u003e\u003cstrong\u003eInstallation\u003c/strong\u003e\u003c/a\u003e ·\n#+HTML:   \u003ca href=\"#disclaimer\"\u003e\u003cstrong\u003eDisclaimer\u003c/strong\u003e\u003c/a\u003e ·\n#+HTML:   \u003ca href=\"#how-do-i\"\u003e\u003cstrong\u003eFAQ\u003c/strong\u003e\u003c/a\u003e\n#+HTML: \u003c/p\u003e\n\n#+HTML: \u003chr /\u003e\n\n* Emacs Solo\n\nThis is what you see as soon as you start Emacs:\n\n\n#+BEGIN_SRC elisp\n  ███████╗███╗   ███╗ █████╗  ██████╗███████╗    ███████╗ ██████╗ ██╗      ██████╗\n  ██╔════╝████╗ ████║██╔══██╗██╔════╝██╔════╝    ██╔════╝██╔═══██╗██║     ██╔═══██╗\n  █████╗  ██╔████╔██║███████║██║     ███████╗    ███████╗██║   ██║██║     ██║   ██║\n  ██╔══╝  ██║╚██╔╝██║██╔══██║██║     ╚════██║    ╚════██║██║   ██║██║     ██║   ██║\n  ███████╗██║ ╚═╝ ██║██║  ██║╚██████╗███████║    ███████║╚██████╔╝███████╗╚██████╔╝\n  ╚══════╝╚═╝     ╚═╝╚═╝  ╚═╝ ╚═════╝╚══════╝    ╚══════╝ ╚═════╝ ╚══════╝ ╚═════╝\n\n    Loading time : 0.172725 seconds\n    Packages     : 0\n#+END_SRC\n\n\nEmacs Solo is a configuration I use when I want to go back to the\nroots and challenge myself by using Emacs with only built-in features.\n\n\nIt aims to be minimalist, at least in spirit. Yes, there are over 3000\nlines of code, but most of that comes from organizing things cleanly\nand building small, reusable modules. Compared to full-featured\ndistributions, it's still lean and focused.\n\n\nThe configuration favors Emacs built-ins, configured my way. But when\nsomething essential is missing (like margin git gutters), a small,\nhacky workaround is always added.\n\n** Obligatory Screenshots\n\n*** Overall View\n   [[file:doc/demo-01-overall.png]]\n\n#+html:\u003cdetails\u003e\n#+html:\u003csummary\u003e\u003ch3\u003eMore screenshots here...\u003c/h3\u003e\u003c/summary\u003e\n\n*** iComplete + Flymake + Gutter\n   [[file:doc/demo-02-icomplete-flymake-gutter.png]]\n\n*** Help Variable\n   [[file:doc/demo-03-help-var.png]]\n\n*** iComplete Vertical\n   [[file:doc/demo-04-icomplete-vertical.png]]\n\n*** Eshell\n   [[file:doc/demo-05-eshell.png]]\n\n*** Dired + Gutter\n   [[file:doc/demo-06-dired-with-gutter.png]]\n\n   [[file:doc/demo-07-dired-with-gutter-2.png]]\n\n*** Well behaved mode-line\n   [[file:doc/demo-08-mode-line.png]]\n\n#+html:\u003c/details\u003e\n\n** As seen on System Crafters!\n\nAlso, check out the full demo of =Emacs Solo= in action, as seen on\nthe System Crafters channel. In this video, David Wilson explores and\nlearns from the configuration, showing how different settings and\napproaches are applied to create a more efficient and personalized\nEmacs setup.\n\n[[https://www.youtube.com/live/j_2QkCcf8zE?si=e8qvIFdyuV9j7d_y\u0026t=1433][file:http://img.youtube.com/vi/j_2QkCcf8zE/0.jpg]]\n\n** Minimum Emacs Version\n\nEmacs Solo always requires the latest stable release of Emacs, which\nis currently: =30.1=\n\nHowever, some bleeding-edge features may be tested as well. For those,\nyou’ll need to compile Emacs from the master branch. I do my best to\nmark these features with the =Emacs 31= tag.\n\n** Optional Dependencies\n\nIt is recommended you have this programs in your system:\n\n- =ripgrep= (rg)\n\n  This provides quicker project grep and xref navigation.\n\n  If you opt to use regular =grep=, reset the customization of variable\n  =grep-command=.\n\n\n- =ghostscript=\n\n  This is necessary if you want to be able to use =doc-view= to see\n  documents like PDFs.\n\n\n- =gls=\n\n  MacOS comes with an implementation of =ls= that misses some nice\n  switches from the gnu implementation (=gls= on homebrew). If you opt\n  to use MacOS defaul =ls= you might need to change the\n  =dired-listing-switches= variable.\n\n\n- =curl=\n\n  Only needed if you'd like to upload text/images directly to 0x0.st\n  site from Emacs Solo, by using either =emacs-solo/0x0-upload-text= or\n  =emacs-solo/0x0-upload-file=.\n\n  Also used for =emacs-solo-weather=.\n\n\n- =mpv=\n\n  Only needed if you'd like to play videos directly from news in\n  =newsticker=, play music from dired with dired music player =C-c m=,\n  play something from a m3u file with =m3u-visualize-buffer= or\n  listen to online radio with =C-c r=.\n\n\n- =rsync=\n\n  Only needed if you'd like to use =emacs-solo/dired-rsync-copy=.\n\n\n- =ollama=\n\n  Only needed if you'd like to use =emacs-solo/ollama-run-model=.\n\n\nIn order to proper copy/paste from terminals (TUI), you need:\n\n- =pbcopy/pbpaste= (macos)\n- =wl-copy/wl-paste= (Linux with Wayland)\n- =xclip= (Linux with Xorg)\n\n\n** Installation\n\nClone this repository into a directory of your liking and run Emacs\nwith:\n\n#+BEGIN_SRC sh\n  emacs --init-directory=YOUR_DIR\n#+END_SRC\n\nYou can also simply copy *init.el* and *early-init.el* into any folder\nissue the same command as above\n\nAnd that's it, happy hacking! 🐂\n\n** Disclaimer\n\nI’m happy to share this configuration with a catchy name, and I’d be\ngenuinely delighted if you find it useful. 🙂\n\nHowever, this is *not* intended to be a distribution. This means I may\nnot cover every user's needs, nor will I accept every contribution\nthat pushes it in that direction. I use this configuration daily for\nboth personal and professional work, and like any custom setup, it\nreflects my own preferences.\n\nFor example, this config does not include Python-specific settings,\nwhether for Eglot or Tree-sitter. Since this is a real working setup\nand I’m not currently using Python, its absence might seem like an\noversight.\n\nIf you'd like to add your own modifications while staying up to date\nwith Emacs Solo, simply create a =private.el= file in the same directory\nas =init.el=. A hook is already in place to load this private file after\nEmacs initializes.\n\nOf course, you can also fork it! (please do 😊)\n\n** How do I...\nA FAQ like session of common questions of how to do X with only Emacs Solo.\n#+html:\u003cdetails\u003e\n#+html:\u003csummary\u003e\u003ch3\u003eSo, how do I...\u003c/h3\u003e\u003c/summary\u003e\n*** 1.) Copy the current word under cursor?\nThe usual answer is *M-b* to go back to the beginning of the\nword. *C-M-SPC* to expand the selection to the end of the word and *M-w*.\n\n*Custom Emacs Solo Solution*: Use the isearch way to search a word (it has\nbetter completion than C-M-SPC), like *M-s M-.* you can now just *M-w*.\n\n*** 2.) Edit multiple search entries at once?\n\n#+BEGIN_SRC text\n  Original problem: I usually consult-outline, then embark-collect and wgrep...\n#+END_SRC\n\nYou can start by using *occur*, or using *isearch* and than moving to occur.\n\nNext start the edit mode of the occur buffer with *e*.\n\nMake your changes, apply it with *C-c C-c*\n\nFrom Emacs 30.1 onward you can also use the combo:\n=replace-regexp-as-diff= for replacements in a single buffer,\n=multi-replace-regexp-as-diff= for multiple buffers, and\n=dired-do-replace-regexp-as-diff= to perform replace-regexp-as-diff\n\n*** 3.) Edit multiple search entries between several files at once?\n\n#+BEGIN_SRC text\n  Original problem: I usually consult-grep, then use embark collect and wgrep...\n#+END_SRC\n\nOpen dired on the root folder of where you search will happen. Mark\nsome files and or folders with *m*.\n\nUse =dired-do-query-replace-regexp= or in a dired buffer hit =Q=.\n\nConfirm it all or one by one, use *?* to check the options.\n\nFrom Emacs 30.1 onward you can also use the combo:\n=replace-regexp-as-diff= for replacements in a single buffer,\n=multi-replace-regexp-as-diff= for multiple buffers, and\n=dired-do-replace-regexp-as-diff= to perform replace-regexp-as-diff\n\n*** 4.) Read news, like with elfeed?\n\nYou have two built-in options on Emacs.\n- =M-x gnus=\n- =M-x newsticker-treeview=\n\n*** 5.) How do I see logs and their diffs?\n\n=C-x v L= on a file inside your version controlled file. And over the\nline you have the commit, press =d= for diffing.\n\nIf you wanna diff a range, mark the lines starting with =C-SPC= on the\nfirst line of the range, and again =C-SPC= in the last line of the range\n(the content of what you want must be selected, if ther cursor is on\nfirst column of the line it won't be included), now use =d= to diff.\n\n*** 6.) How do I revert a hunk?\n=C-x v == will open the diff panel for the current file, restrict it to\nthe hunk you'd like to revert with =r=, revert the direction of the diff\nwith =R= and apply the diff with =C-c C-a=.\n\nFrom Emacs 31, we also have =C-c M-r= (=diff-revert-and-kill=), when on\nbuffers generated by =C-x v == and =C-x v D=.\n\n*** 7.) Use (neo)vi(m) keybindings (aka Evil keybindings)?\n\nEmacs comes with =viper= which is a =vi= emulator. This means a lot of\nmodern editing capabilities are missing.\n\nTake a look at =use-package Emacs Solo-viper-extensions=, section of the\n=init.el= file. Emacs Solo extends viper mode to include a bunch of more\nmodern =evil-like= bindings.\n\nJust give it a try ;) =M-x viper-mode=\n\n*** 8.) Temporaraly highlight some word?\n\nUse the powers of =highlight-regexp=! Over a word you want to make\nhighlighted use =M-s h .=\n\nYou can repeat it to other words and Emacs will handle different\ncolors for you.\n\nTo remove a highlight use =M-s h u= and select the highlighted regexp on\nthe list.\n\nFind out about more options regarding highlighting with =M-s h ?=.\n\n*** 9.) Know what is changed when closing Emacs or several files?\n\nIt is a common thing trying to close Emacs with =C-x C-c= just to find\nout one of your buffers has some modification and now Emacs asks if\nyou'd like to save, override, etc.\n\nEmacs Solo provides the extra option =d=, which will generate a diff of\nthe current file being asked to take action, so you can see if saving\nis needed.\n\n*** 10.) Show/Hide (toggle) hidden files in Dired?\n\nUse =dired-omit-mode=, which you can toggle with =C-x M-o=. Notice that\nthis mode uses the regular expression defined in the =dired-omit-files=\nvariable. Emacs Solo already customizes this to ignore files matching\n=^\\\\.=\n\n*** 11.) Open multiple terms/shells?\n\nEver felt the need of some =multi-term= package on Emacs? Well, you\ndon't really need it, at least not with the internal implementations\nof terminals and =eshell=.\n\nJust use the =C-u= unversal argument command before calling your\nterm/shell, like: =C-u M-x eshell= or =C-u C-x p e= or =C-u M-x term=, and\nso on.\n\nNow you have another instance of your term to work with, repeat this\npattern if you need more instances.\n\n*** 12.) How do I select a single hunk out of many?\n\nFrom Emacs 31, we have after =C-x v == a new =C-c RET n=\n(=diff-delete-other-hunks=) option to do so.\n\n*** 13.) How do I edit commit messages?\n\nFrom =C-x v L=, you can press =e= and you'll be editing the commit\nmessage. This is available from Emacs 31 onward.\n\n*** 14.) How do I amend commits?\n\nFrom =C-x v v=, you can press =C-c C-e= and you'll be on 'amend' mode.\n\n#+html:\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FLionyxML%2Femacs-solo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FLionyxML%2Femacs-solo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FLionyxML%2Femacs-solo/lists"}