Efrit: A native elisp coding agent running in Emacs

(github.com)

127 points | by simonpure 16 hours ago ago

23 comments

  • totetsu 5 minutes ago

    Once emacs starts modifying its own lisp haven’t we unleashed agi?

  • tiu 2 hours ago

    Off topic but without going RTFM, is there a guide that goes through setting up emacs 'with the modern way'? I have done it before but in a mish-mash way where I want something that tells how to go from configuring comp-speed, elpaca, eglot, auto treesitter etc

    • kreyenborgi an hour ago

      One way is to start with bedrock https://git.sr.ht/~ashton314/emacs-bedrock You will understand your config. Packages like elpaca and auto treesitter, just follow their readme's.

      Or if you don't feel like learning the details, go with doom.

    • zzygan an hour ago

      There is a few solid prepackaged systems around now. Doom emacs is very comprehensive. Similar systems also exist rather than starting from nothing.

      Elisp is a programming language that supports many ways to do things so there is lots of ways people do things.

    • skydhash 2 hours ago

      What is the modern way? Emacs is self documented like vim. Vim has the :help command, emacs have the Control + h prefix (or <f1> for an overview). You can start with a minimal config like Emacs Bedrock or Prelude, and then learn about those options first.

      But the manual is very well written and worth the read. Emacs has its own culture, and the sooner you learn the conventions, the smoother your path will be.

      • setopt 32 minutes ago

        > What is the modern way?

        Pretty sure they mean something that at least involves use-package, vertico/consult/etc. or equivalent, company or corfu, project.el or projectile, and magit.

        > You can start with a minimal config like Emacs Bedrock or Prelude, and then learn about those options first.

        Prelude seems nice but I wouldn’t call it minimal unless you’re comparing to Doom and Spacemacs.

  • defanor 6 hours ago

    It appears to have a feature overlap with gptel; would be nice to highlight the differences.

    • 3036e4 3 hours ago

      Looks like efrit requires an Anthropic API Key, or at least that is what the README says, while gptel works with several different remote or local backends?

  • Bilal_io 14 hours ago

    Clever name. For thos curious Efrit is Genie in Arabic and possibly the same in neighboring languages such as Persian and Turkish..

    • dragonwriter 14 hours ago

      > For thos curious Efrit is Genie in Arabi

      More precisely, as I understand it, “genie" is an anglicization of its Arabic equivalent, “jinn"; Efrit is a specific kind of jinn.

    • wging 12 hours ago

      I think it might be 'e' for 'emacs' (there's precedent: eglot, eldoc, eshell, erc, emms) combined with 'ifrit', since "efrit" is a much less common spelling.

      • _steve_yegge_ 11 hours ago

        Yes, that's exactly why I chose it. It starts with an 'e' and it's not a super common spelling, so it wasn't taken.

      • onehair 11 hours ago

        Countries of origin kind of affect what's common. Where I'm from will write it efrit

  • jwmcq 13 hours ago

    I wonder if this could be updated to use OpenRouter in a similar way to Emigo[1] was aiming to do.

    (I use the past tense, because Emigo has not been updated in a quarter of a year, which seems as if it may as well be decades in the timeline of this sort of stuff.)

    [1] https://github.com/MatthewZMD/emigo

  • foobarqux 14 hours ago

    I managed to get this working with gemini by using a proxy [1] and the following config (I used quelpa)

        (use-package efrit
        :quelpa (efrit :fetcher git :repo "steveyegge/efrit")
        :init
        (setq efrit-model "gemini-2.5-pro")
        ;; (setq efrit-api-url "https://generativelanguage.googleapis.com/v1beta/opena
        (setq efrit-api-url "http://127.0.0.1:8089/v1/messages")
        :config (defun efrit--get-api-key () (key-from-file "~/.keys/gemini.txt")) ; this isn't needed, it's set by the proxy
        :ensure t)
    
    I needed to remove the uvicorn version constraint when importing the project to uv to get it to find a version solution.

    Initially I thought you could send it directly to Gemini but apparently you need to proxy and translate the responses.

    [1] Seems sketchy, use at your risk: https://github.com/coffeegrind123/gemini-for-claude-code

    • _steve_yegge_ 11 hours ago

      Congrats on getting it running! This thing is a huge POC (and arguably a POS) so be careful with it.

      It's terrible at multi-step tasks right now. I'm evolving it to work more like claude code.

  • xrd 11 hours ago

    I'm fascinated by this and the recent claude-code-ide package: https://github.com/manzaltu/claude-code-ide.el

    But, I cannot seem to get past this error when I run claude-code-ide: "Symbol’s function definition is void: project-root" I know this is defined in project.el, but claude has been surprisingly unhelpful at fixing this issue.

    I'm feeling a bit frustrated by the state of emacs packages lately. I've used emacs for 30 years and it feels like things are getting worse.

    • _steve_yegge_ 11 hours ago

      I'm sorry it's not working. I've used emacs for almost 40 years and I'm definitely contributing to it being worse, by uploading efrit in its current state. But people were asking me for it. Damned if you do and all that.

      I'm more than happy to work with you to get it working, with the caveat that it actually kind of sucks right now. It's no Claude Code. But I am quickly evolving it in that direction.

    • xrd 11 hours ago

      This project does not work for me either. Drat.

        This is turn 4. Focus on any remaining tasks that haven't been completed yet.   Don't repeat work that was already done in previous turns.
        Assistant: I notice from the context that we're in a directory that might be related to a xxx project. Let me try to find and open the yyyy.ts file.                                                               
        [Result: Error: Unknown tool 'resolve_path']
      • _steve_yegge_ 11 hours ago

        Yeah it really kind of sucks right now, it's more of a proof of concept.

        I'm working on evolving it into something that's not so transactional -- it will work more like claude code. Didn't realize it was going to hit the front page today. I'll poke at it this weekend and send an update.

        • xrd 11 hours ago

          Ok, I might have to frame this comment. I'm a big fan.

          After reading your wikipedia page, I didn't realize we were both at UWash CS at the same time. Small world.

  • cmrdporcupine 15 hours ago

    Neat. As a Claude Code plan user can I use this ? I've never tried the API access method.

    Claude is remarkably effective at writing elisp I surprisingly found. I had it whip up a mode today for something today (Notation3/N3 RDF triples) complete with etags support, etc. and it just... did it.