让ai写了个小函数

各位是如何解决这个问题的?有更好的办法么?

在claude code cli,或者其他cli编码工具中引用一段代码的时候,需要在输入框中输入 @file 12-123行。然后再写提示词指令…这就要在cli编码工具和编辑器之间来回切换,先切换到编辑器记住代码行号范围,再切换到cli编码工具写行号。比较麻烦。如果能在编辑器中选中一段代码,然后直接把选中的代码段转换成 @file 12-123行这样的描述,就可以一次性粘贴到cli编码工具的输入框。

(defun ai-ref-copy-region ()
  "Copy the selected code reference to clipboard in format: @project/file start-end"
  (interactive)
  (if (use-region-p)
      (let* ((start (region-beginning))
             (end (region-end))
             (file-path (buffer-file-name))
             ;; Try to find project root using projectile or vc
             (project-root (or (and (fboundp 'projectile-project-root)
                                    (projectile-project-root))
                               (and (fboundp 'vc-root-dir)
                                    (vc-root-dir))))
             (path-to-use (if project-root
                              (let ((root-parent (file-name-directory (directory-file-name project-root))))
                                (file-relative-name file-path root-parent))
                            file-path))
             (start-line (line-number-at-pos start))
             (end-line (line-number-at-pos end))
             (ref-string (format "@%s %d-%d" path-to-use start-line end-line)))
        (kill-new ref-string)
        (message "Copied reference: %s" ref-string))
    (message "No region selected")))
(define-key global-map (kbd "C-x @") 'ai-ref-copy-region)
1 个赞

不自量力宣传一下目前在开发和维护的包: ai-code-interface.el: GitHub - tninja/ai-code-interface.el: Unified emacs interface supporting Claude Code, Gemini CLI, OpenAI Codex and GitHub Copilot CLI, and more, 可以在emacs里选中某个区域, 然后要求code change / ask question, 选中区域包括行号会自动作为context发给ai coding tool让它去参考相应区域.

这个包主要想解决的问题之一就是把编辑上下文, 比如当前window中的文件, 光标下的函数, 选中区域等等发给AI coding tool来让AI针对性的解决某些局部问题. 它可以一键切换各种ai coding cli.

行号是会经常变的,应该没法自动更新吧,ai cli不支持指定代码开始和结束范围的标记吗,我在代码里模仿org-mode的#+:来对文件分区域,比如#+main-text:,后面的内容就归属于main-text,未指定结束符号时,遇到下一个#+:号的行开头就自动结束

如果使用的语言不支持把#号后的内容视为注释,那就只能换个写法了

https://github.com/manzaltu/claude-code-ide.el

这个包可以满足这个需求

类似的,有个集成ai编码工具的 agent-shell

这个就是提问的时候用一次,类似cursor 中选中一行代码后,后添加到会话。

看着不错。和agent-shell有点类似。它也是在emacs中运行claude code?我比较希望emacs只和ai编码工具claude code之类通信,不太想在emacs会话中“运行”claude code。

目前个人感受最好用的包

我看到这个包很久了。但一直没安装试用。我想找一个这样的包: claude code/codex之类仍然跑在term中,emacs通过协议和cc/codex通信。cc/codex不在emacs中运行。

这样的包应该是可以实现的。cc中现在就有/ide命令和vscode的插件交互。codex也有app server模式和其他编辑器交互。

cc 最大的问题是,token的使用不明确,不太清楚他会向大模型发送哪些输入。相比之下aider更可控。

一个 agent agnostic 的办法,不依赖任何 agent cli 是否实现了自己的 rpc 通信方法的办法:

把 claudecode 运行在 zellij 或者 tmux 这样的 multiplexer 里,这样就可以用 zellij send 或者 tmux send 之类的命令发送过去。

这有点奇技淫巧。 现在很多agent像cc codex都实现了acp协议。它们也都可以和vscode ide的插件配合。emacs只缺一个对应vscode上的插件就可以。

你如果要用 acp 的话不是已经有 agent-shell.el 可以用了吗。不过 codex/claude-code 可是没有官方 acp 支持,都是第三方实现的。但是 codex 是开源的,他的 jspnrpc 的文档也都写好了的,在 app-server 文件夹底下。

但是不管你是用 acp 还是用 codex 自己官方的 jsonrpc 协议,都是开一个 subprocess 然后用 stdin 交互的。都和你想要在另一个单独的 terminal 里运行一个 agent 然后交互不一样的。

是的,目前比较合适的就是agent-shell。但对我来说也就是引用个函数,代码段。其他功能用的并不多。所以我就让ai写了个上面的函数用。我没安装agent-shell。