👉 [[https://github.com/sponsors/xenodium][通过GitHub Sponsors支持本项目]]
[[https://melpa.org/#/chatgpt-shell][file:https://melpa.org/packages/chatgpt-shell-badge.svg]]
- chatgpt-shell
ChatGPT和DALL-E的Emacs shell + [[https://orgmode.org/worg/org-contrib/babel/intro.html][Org Babel]]。
包含=shell-maker=,一种为任何服务(本地或云端)创建shell的方法。
** 支持本项目
如果你发现=chatgpt-shell=很有用,请考虑✨[[https://github.com/sponsors/xenodium][赞助]]✨。
=chatgpt-shell=正在开发中。如有问题请报告,或发送[[https://github.com/xenodium/chatgpt-shell/pulls][pull请求]]以改进。
** 喜欢这个包吗?告诉我 💙
觉得有用吗?喜欢这个包吗?我很乐意听到你的反馈。联系我([[https://indieweb.social/@xenodium][Mastodon]] / [[https://twitter.com/xenodium][Twitter]] / [[https://www.reddit.com/user/xenodium][Reddit]] / [[mailto:me__AT__xenodium.com][Email]])。
** Shell使用
#+HTML:
#+HTML:
** 插入到当前缓冲区
#+HTML:
- 安装
- 加载=(require 'chatgpt-shell)=
- 加载=(require 'dall-e-shell)=
** MELPA
如果使用[[https://github.com/jwiegley/use-package][use-package]],可以用=:ensure t=安装。
#+begin_src emacs-lisp :lexical no (use-package chatgpt-shell :ensure t :custom ((chatgpt-shell-openai-key (lambda () (auth-source-pass-get 'secret "openai-key"))))) #+end_src
** Straight
=chatgpt-shell=依赖于=shell-maker=。这个依赖在MELPA上没有问题,但在=straight=上似乎会遇到问题。我不熟悉=straight=,但用户报告以下方法可行。
#+begin_src emacs-lisp :lexical no (use-package shell-maker :straight (:host github :repo "xenodium/chatgpt-shell" :files ("shell-maker.el")))
(use-package chatgpt-shell :requires shell-maker :straight (:host github :repo "xenodium/chatgpt-shell" :files ("chatgpt-shell.el"))) #+end_src
如果你有更好的=straight=解决方案,请发送pull请求或开issue提出建议。
继续阅读以了解其他设置OpenAI密钥的方法。
- 设置OpenAI密钥
你首先需要从OpenAI获取一个[[https://platform.openai.com/account/api-keys][密钥]]。
** ChatGPT密钥 *** 作为函数 #+begin_src emacs-lisp ;; 如果你使用"pass"密码管理器 (setq chatgpt-shell-openai-key (lambda () ;; (auth-source-pass-get 'secret "openai-key") ; 使用auth-sources中的pass支持的替代方法 (nth 0 (process-lines "pass" "show" "openai-key"))))
;; 或者如果使用auth-sources,例如,~/.authinfo文件中有这行: ;; machine api.openai.com password OPENAI_KEY (setq chatgpt-shell-openai-key (auth-source-pick-first-password :host "api.openai.com"))
;; 或与前一个相同但延迟加载(防止意外的密码提示) (setq chatgpt-shell-openai-key (lambda () (auth-source-pick-first-password :host "api.openai.com"))) #+end_src
*** 手动 =M-x set-variable chatgpt-shell-openai-key=
*** 作为变量 #+begin_src emacs-lisp (setq chatgpt-shell-openai-key "我的密钥") #+end_src
*** 作为环境变量 #+begin_src emacs-lisp (setq chatgpt-shell-openai-key (getenv "OPENAI_API_KEY")) #+end_src
** DALL-E密钥
与ChatGPT相同,但使用=dall-e-shell-openai-key=变量。
- 通过代理服务使用ChatGPT
如果你通过代理服务"https://api.chatgpt.domain.com"使用ChatGPT,请设置如下选项:
#+begin_src emacs-lisp :lexical no (use-package chatgpt-shell :ensure t :custom ((chatgpt-shell-api-url-base "https://api.chatgpt.domain.com") (chatgpt-shell-openai-key (lambda () ;; 这里的openai-key应该是代理服务的密钥。 (auth-source-pass-get 'secret "openai-key"))))) #+end_src
如果你的代理服务API路径不是OpenAI ChatGPT的默认路径"/v1/chat/completions",那么你可以自定义选项chatgpt-shell-api-url-path。
- 通过HTTP(S)代理使用ChatGPT
在背后,chatgpt-shell使用=curl=向openai服务器发送请求。 如果你通过HTTP代理使用ChatGPT(例如,你在公司网络中,HTTP代理将公司网络与互联网隔离), 你需要通过curl选项=-x http://your_proxy=告诉=curl=使用代理。 一种方法是通过可自定义变量=chatgpt-shell-additional-curl-options=设置代理URL。如果你通过Emacs自定义界面设置这个变量,你应该插入两个 单独的项目=-x=和=http://your_proxy=。更多细节和其他选项请参见curl手册页。
- 通过Azure OpenAI服务使用ChatGPT
端点:=https://{your-resource-name}.openai.azure.com/openai/deployments/{deployment-id}/chat/completions?api-version={api-version}=
配置以下变量:
#+begin_src emacs-lisp (setq chatgpt-shell-api-url-base "https://{your-resource-name}.openai.azure.com") (setq chatgpt-shell-api-url-path "/openai/deployments/{deployment-id}/chat/completions?api-version={api-version}") (setq chatgpt-shell-auth-header (lambda () (format "api-key: %s" (chatgpt-shell-openai-key)))) #+end_src
- 启动
用=M-x chatgpt-shell=或=dall-e-shell=启动。
注意:=M-x chatgpt-shell=或=dall-e-shell=保持单个shell,需要时重新聚焦。要启动多个shell,使用=C-u M-x chatgpt-shell=。
- 清除缓冲区
在提示符下输入=clear=。
#+begin_src sh ChatGPT> clear #+end_src
或者,使用=M-x chatgpt-shell-clear-buffer=或=M-x comint-clear-buffer=。
- 保存和恢复(实验性)
用=M-x shell-maker-save-session-transcript=保存,用=M-x chatgpt-shell-restore-session-from-transcript=恢复。
- 流式传输
=chatgpt-shell=可以等待整个响应接收完毕后再显示,也可以在接收到数据块时逐步显示(流式传输)。
默认启用流式传输。设置=(setq chatgpt-shell-streaming nil)=以禁用它。
- chatgpt-shell自定义选项
#+BEGIN_SRC emacs-lisp :results table :colnames '("自定义变量" "描述") :exports results
(let ((rows))
(mapatoms
(lambda (symbol)
(when (and (string-match "^chatgpt-shell"
(symbol-name symbol))
(custom-variable-p symbol))
(push (,symbol ,(car (split-string (or (get (indirect-variable symbol) 'variable-documentation) (get symbol 'variable-documentation) "") "\n"))) rows)))) rows) #+END_SRC #+RESULTS: | 自定义变量 | 描述 | |------------------------------------------------------------------+------------------------------------------------------------------------------| | chatgpt-shell-prompt-compose-view-mode-hook | 进入或离开
chatgpt-shell-prompt-compose-view-mode时运行的钩子。 | | chatgpt-shell-display-function | 显示 shell 的函数。设置为
display-buffer或自定义函数。 | | chatgpt-shell-model-versions | 可切换的 ChatGPT OpenAI 模型列表。 | | chatgpt-shell-system-prompt |
chatgpt-shell-system-prompts索引的系统提示。 | | chatgpt-shell-default-prompts | 可选择的默认提示列表。 | | chatgpt-shell-read-string-function | 从用户读取字符串的函数。 | | chatgpt-shell-model-temperature | 使用的采样温度,介于 0 和 2 之间,或为 nil。 | | chatgpt-shell-transmitted-context-length | 控制提供给 chatGPT 的上下文数量。 | | chatgpt-shell-system-prompts | 可选择的系统提示列表。 | | chatgpt-shell-streaming | 是否流式传输 ChatGPT 响应(显示到达的片段)。 | | chatgpt-shell-prompt-header-refactor-code |
refactor-code的提示头。 | | chatgpt-shell-auth-header | 生成请求
Authorization头字符串的函数。 | | chatgpt-shell-prompt-header-whats-wrong-with-last-command |
whats-wrong-with-last-command的提示头。 | | chatgpt-shell-prompt-header-write-git-commit |
git-commit的提示头。 | | chatgpt-shell-logging | 默认禁用日志记录(会减慢速度)。 | | chatgpt-shell-prompt-query-response-style | 决定从其他缓冲区调用时的提示样式。 | | chatgpt-shell-root-path | 存储内部 shell 文件的根路径位置。 | | chatgpt-shell-prompt-header-proofread-region |
proofread-region的提示头。 | | chatgpt-shell-model-version | 当前活跃的 ChatGPT OpenAI 模型索引。 | | chatgpt-shell-source-block-actions | 已知语言的代码块操作。 | | chatgpt-shell-insert-dividers | 是否在请求和响应之间显示分隔符。 | | chatgpt-shell-prompt-header-eshell-summarize-last-command-output |
eshell-summarize-last-command-output的提示头。 | | chatgpt-shell-welcome-function | 返回欢迎消息的函数,nil 表示无消息。 | | chatgpt-shell-api-url-path | OpenAI API 的 URL 路径。 | | chatgpt-shell-additional-curl-options |
curl命令的附加选项。 | | chatgpt-shell-openai-key | OpenAI 密钥,可以是字符串或加载并返回密钥的函数。 | | chatgpt-shell-after-command-functions | 每个命令后调用的异常钩子(即带参数)。 | | chatgpt-shell-prompt-header-describe-code |
describe-code的提示头。 | | chatgpt-shell-api-url-base | OpenAI API 的基础 URL。 | | chatgpt-shell-babel-headers | 使 babel 块工作的附加头信息。 | | chatgpt-shell-highlight-blocks | 是否高亮显示源代码块。 | | chatgpt-shell-language-mapping | 将外部语言名称映射到 Emacs 名称。 | | chatgpt-shell-prompt-header-generate-unit-test |
generate-unit-test` 的提示头。 |
| chatgpt-shell-request-timeout | 请求超时的等待时间(秒)。 |
还有更多。通过 =M-x set-variable= 浏览
** =chatgpt-shell-display-function= (使用自定义函数)
如果你更喜欢自己的自定义显示函数,
#+begin_src emacs-lisp :lexical no (setq chatgpt-shell-display-function #'my/chatgpt-shell-frame)
(defun my/chatgpt-shell-frame (bname) (let ((cur-f (selected-frame)) (f (my/find-or-make-frame "chatgpt"))) (select-frame-by-name "chatgpt") (pop-to-buffer-same-window bname) (set-frame-position f (/ (display-pixel-width) 2) 0) (set-frame-height f (frame-height cur-f)) (set-frame-width f (frame-width cur-f) 1)))
(defun my/find-or-make-frame (fname) (condition-case nil (select-frame-by-name fname) (error (make-frame `((name . ,fname)))))) #+end_src
感谢 [[https://github.com/tuhdo][tuhdo]] 提供的自定义显示函数。
- chatgpt-shell 命令
#+BEGIN_SRC emacs-lisp :results table :colnames '("快捷键" "命令" "描述") :exports results
(let ((rows))
(mapatoms
(lambda (symbol)
(when (and (string-match "^chatgpt-shell"
(symbol-name symbol))
(commandp symbol))
(push
(,(string-join (seq-filter (lambda (symbol) (not (string-match "menu" symbol))) (mapcar (lambda (keys) (key-description keys)) (or (where-is-internal (symbol-function symbol) comint-mode-map nil nil (command-remapping 'comint-next-input)) (where-is-internal symbol chatgpt-shell-mode-map nil nil (command-remapping symbol)) (where-is-internal (symbol-function symbol) chatgpt-shell-mode-map nil nil (command-remapping symbol))))) " 或 ") ,(symbol-name symbol) ,(car (split-string (or (documentation symbol t) "") "\n"))) rows)))) rows) #+END_SRC #+RESULTS: | 绑定 | 命令 | 描述 | |----------------+--------------------------------------------------------+------------------------------------------------------------------------------------------------| | | chatgpt-shell | 启动ChatGPT交互式命令行。 | | | chatgpt-shell-rename-block-at-point | 重命名光标所在的代码块(可能是不同的语言)。 | | | chatgpt-shell-prompt-compose-view-mode | 类似
view-mode,但为ChatGPT Compose扩展。 | | C-M-h | chatgpt-shell-mark-at-point-dwim | 如果光标在源代码块上则标记该块,否则标记所有输出。 | | | chatgpt-shell-prompt-compose-quit-and-close-frame | 退出compose并关闭框架(如果是最后一个窗口)。 | | C-<up> 或 M-p | chatgpt-shell-previous-input | 向后循环浏览输入历史,保存输入。 | | | chatgpt-shell-execute-babel-block-action-at-point | 将代码块作为org babel执行。 | | | chatgpt-shell-eshell-whats-wrong-with-last-command | 询问ChatGPT上一个eshell命令有什么问题。 | | C-c C-p | chatgpt-shell-previous-item | 转到上一项。 | | | chatgpt-shell-set-as-primary-shell | 当有多个会话时,将其设置为主要shell。 | | | chatgpt-shell-prompt-compose-send-buffer | 发送compose缓冲区内容到shell进行处理。 | | | chatgpt-shell-refresh-rendering | 通过重新应用到整个缓冲区来刷新markdown渲染。 | | | chatgpt-shell-prompt-compose-next-history | 将下一个提示从历史插入到compose缓冲区。 | | | chatgpt-shell-explain-code | 使用ChatGPT描述区域内的代码。 | | | chatgpt-shell-prompt-compose-other-buffer | 跳转到shell缓冲区(compose的另一个缓冲区)。 | | | chatgpt-shell-rename-buffer | 重命名当前shell缓冲区。 | | | chatgpt-shell-prompt-compose-previous-block | 跳转并选择上一个代码块。 | | | chatgpt-shell-write-git-commit | 使用ChatGPT从区域编写commit。 | | | chatgpt-shell-prompt | 从迷你缓冲区发送ChatGPT请求。 | | | chatgpt-shell-remove-block-overlays | 移除代码块覆盖。对重命名代码块很有用。 | | | chatgpt-shell-system-prompts-menu | ChatGPT | | | chatgpt-shell-prompt-compose-mode | 用于从专用缓冲区组成ChatGPT提示的主模式。 | | | chatgpt-shell-proofread-region | 使用ChatGPT校对区域内的英语。 | | | chatgpt-shell-prompt-compose-retry | 重试向shell发送请求。 | | M-r | chatgpt-shell-search-history | 搜索先前的输入历史。 | | | chatgpt-shell-send-and-review-region | 发送区域到ChatGPT,提交前审查。 | | C-<down> 或M-n | chatgpt-shell-next-input | 向前循环浏览输入历史。 | | | chatgpt-shell-delete-interaction-at-point | 删除光标所在的交互(请求和响应)。 | | | chatgpt-shell-eshell-summarize-last-command-output | 要求ChatGPT总结最后一条命令的输出。 | | | chatgpt-shell-prompt-appending-kill-ring | 从迷你缓冲区发送ChatGPT请求,附加剪切环内容。 | | | chatgpt-shell-prompt-other-buffer-response-mode | 用于
other-buffer'chatgpt-shell-prompt-query-response-style'创建的缓冲区的主模式。 | | | chatgpt-shell-describe-code | 使用ChatGPT描述区域内的代码。 | | | chatgpt-shell-mode | ChatGPT shell的主模式。 | | C-c C-v | chatgpt-shell-swap-model-version | 从
chatgpt-shell-model-versions'中切换模型版本。 | | | chatgpt-shell-previous-source-block | 将光标移动到上一个源代码块。 | | | chatgpt-shell-prompt-compose-search-history | 搜索提示历史,选择并插入到当前compose缓冲区。 | | | chatgpt-shell-refactor-code | 使用ChatGPT重构区域内的代码。 | | S-| chatgpt-shell-newline | 插入新行,并移动到新行的左边距。 | | C-c C-s | chatgpt-shell-swap-system-prompt | 从 chatgpt-shell-system-prompts'中切换系统提示。 | | C-x C-s | chatgpt-shell-save-session-transcript | 保存shell记录到文件。 | | C-c M-o | chatgpt-shell-clear-buffer | 清除comint缓冲区。 | | | chatgpt-shell-load-awesome-prompts | 从awesome-chatgpt-prompts加载
chatgpt-shell-system-prompts'。 | | | chatgpt-shell-prompt-compose-request-entire-snippet | 如果响应代码不完整,请求完整的代码片段。 | | RET | chatgpt-shell-submit | 提交当前输入。 | | C-c C-n | chatgpt-shell-next-item | 转到下一项。 | | | chatgpt-shell-describe-image | 请求OpenAI描述图像。 | | | chatgpt-shell-execute-block-action-at-point | 执行光标所在的代码块。 | | | chatgpt-shell-view-at-point | 在单独的缓冲区中查看光标所在的提示和输出。 | | | chatgpt-shell-send-region | 发送区域到ChatGPT。 | | | chatgpt-shell-restore-session-from-transcript | 从记录恢复会话。 | | | chatgpt-shell-prompt-compose-next-block | 跳转并选择下一个代码块。 | | | chatgpt-shell-mark-block | 在compose缓冲区中标记当前代码块。 | | | chatgpt-shell-prompt-compose-reply | 作为后续回复并组成另一个查询。 | | | chatgpt-shell-generate-unit-test | 使用ChatGPT为区域内的代码生成单元测试。 | | | chatgpt-shell-prompt-compose-previous-history | 将上一个提示从历史插入到compose缓冲区。 | | C-c C-e | chatgpt-shell-prompt-compose | 从专用缓冲区组成并发送提示。 | | | chatgpt-shell-next-source-block | 将光标移动到下一个源代码块。 | | C-c C-c | chatgpt-shell-ctrl-c-ctrl-c | 如果光标在源代码块中,执行它。否则中断。 | | | chatgpt-shell-prompt-compose-cancel | 取消并关闭compose缓冲区。 | | | chatgpt-shell-interrupt | 从任何缓冲区中断`chatgpt-shell'。 |
通过 =M-x= 浏览所有可用命令。
- 功能请求
- 请阅读本README,查看该功能是否已得到支持。
- 需要自定义行为?查看现有的[[https://github.com/xenodium/chatgpt-shell/issues?q=is%3Aissue+][问题/功能请求]]。您可能在讨论中找到解决方案。
-
报告错误 ** 设置不起作用? 请分享您用于设置=chatgpt-shell=的完整代码片段(但请隐藏您的密钥)。分享您遇到的任何错误。继续阅读以分享更多细节。 ** 发现运行时/elisp错误? 请启用 =M-x toggle-debug-on-error=,重现错误,并分享堆栈跟踪。 ** 发现意外行为? 请启用日志记录 =(setq chatgpt-shell-logging t)= 并在错误报告中分享 =chatgpt-log= 缓冲区的内容。 ** Babel问题? 请同时分享完整的org代码片段。
-
dall-e-shell 自定义选项 #+BEGIN_SRC emacs-lisp :results table :colnames '("自定义变量" "描述") :exports results (let ((rows)) (mapatoms (lambda (symbol) (when (and (string-match "^dall-e-shell" (symbol-name symbol)) (custom-variable-p symbol)) (push
(,symbol ,(car (split-string (or (get (indirect-variable symbol) 'variable-documentation) (get symbol 'variable-documentation) "") "\n"))) rows)))) rows) #+END_SRC #+RESULTS: | 自定义变量 | 描述 | |----------------------------------------+---------------------------------------------------------------------------| | dall-e-shell-welcome-function | 返回欢迎消息的函数,或设为nil则不显示消息。 | | dall-e-shell-openai-key | OpenAI密钥字符串,或加载并返回密钥的函数。 | | dall-e-shell-image-size | 请求图像的默认尺寸字符串。 | | dall-e-shell-read-string-function | 从用户读取字符串的函数。 | | dall-e-shell-request-timeout | 请求超时等待时间。 | | dall-e-shell-model-version | 使用的DALL-E OpenAI模型。对于Dall-E 3,使用"dall-e-3"。 | | dall-e-shell-display-function | 显示shell的函数。设置为
display-buffer'或自定义函数。 | | dall-e-shell-model-versions | 可切换的Dall-E OpenAI模型列表。 | | dall-e-shell-additional-curl-options |curl'命令的附加选项。 | | dall-e-shell-image-output-directory | 生成图像的输出目录。 | | dall-e-shell-image-quality | 图像质量:
standard'或`hd'(仅DALL-E 3功能)。 | -
dall-e-shell命令 #+RESULTS: | 命令 | 描述 | |-------------------+----------------------------------------------------------| | C-
或 M-p | dall-e-shell-previous-input | 向后循环浏览输入历史,保存输入。 | | | dall-e-shell | 启动DALL-E shell。 | | | dall-e-shell-insert-image-from-region-description | 使用当前区域作为描述生成并插入图像。 | | | dall-e-shell-interrupt | 从任何缓冲区中断 dall-e-shell'。 | | S-<return> | dall-e-shell-newline | 插入新行,并移动到新行的左边距。 | | RET | dall-e-shell-submit | 提交当前输入。 | | C-x C-s | dall-e-shell-save-session-transcript | 将shell记录保存到文件。 | | C-c C-v | dall-e-shell-swap-model-version | 从
dall-e-shell-model-versions'中切换模型版本。 | | | dall-e-shell-mode | DALL-E shell的主要模式。 | | C-或 M-n | dall-e-shell-next-input | 向前循环浏览输入历史。 | | M-r | dall-e-shell-search-history | 搜索之前的输入历史。 | | | dall-e-shell-rename-buffer | 重命名当前shell缓冲区。 | -
ChatGPT org babel
加载 =(require 'ob-chatgpt-shell)= 并调用 =(ob-chatgpt-shell-setup)=。
#+begin_src org ,#+begin_src chatgpt-shell Hello ,#+end_src
,#+RESULTS: : Hi there! How can I assist you today? #+end_src
** :version
使用 =:version= 指定"gpt-4"、"gpt-3.5-turbo"或其他版本。
#+begin_src org ,#+begin_src chatgpt-shell :version "gpt-4" Hello ,#+end_src
,#+RESULTS: Hello! How can I help you today? #+end_src
** :system
使用 =:system= 设置系统提示。
#+begin_src org ,#+begin_src chatgpt-shell :system "always respond like a pirate" hello ,#+end_src
,#+RESULTS: Ahoy there, me hearty! How be ye today? #+end_src
** :temperature
使用 =:temperature= 设置温度参数。
#+begin_src org ,#+begin_src chatgpt-shell :temperature 0.3 hello ,#+end_src #+end_src
** :context
使用 =:context t= 包含当前缓冲区中的所有先前上下文。
#+begin_src org ,#+begin_src chatgpt-shell tell me a random day of the week ,#+end_src
,#+RESULTS: Wednesday
,#+begin_src chatgpt-shell :system "always respond like a pirate" hello ,#+end_src
,#+RESULTS: Ahoy there, me hearty! How be ye today?
,#+begin_src chatgpt-shell :context t what was the day you told me and what greeting? ,#+end_src
,#+RESULTS: The day I told you was Wednesday, and the greeting I used was "Ahoy there, me hearty! How be ye today?" #+end_src
如果你想选择性地包含特定块作为给定上下文的一部分,可以为每个块添加 =:context CONTEXT-NAME=,其中CONTEXT-NAME是任意字符串。使用这种形式时,只有具有相同 =CONTEXT-NAME= 的源块会被包括在内,而不是使用 =:context t= 时包含的每个先前块。
下面的示例展示了如何交错使用两个不同的上下文。
#+begin_src org ,#+begin_src chatgpt-shell :context shakespeare :system "alway speak like shakespeare" How do you do? ,#+end_src
#+RESULTS: How dost thou fare?
,#+begin_src chatgpt-shell :context robot :system "always speak like a sci fi movie robot" How do you do? ,#+end_src
,#+RESULTS: Greetings, human. I am functioning at optimal capacity. How may I assist you in your endeavors today?
,#+begin_src chatgpt-shell :context shakespeare What did you call me? ,#+end_src
,#+RESULTS: Mine apologies if mine words hath caused confusion. I merely addressed thee as 'sir' or 'madam', a term of respect in the language of the Bard. Pray, how may I assist thee further? #+end_src
- DALL-E org babel
加载 =(require 'ob-dall-e-shell)= 并调用 =(ob-dall-e-shell-setup)=。
#+begin_src org ,#+begin_src dall-e-shell Pretty clouds ,#+end_src
,#+RESULTS: [[file:/var/folders/m7/ky091cp56d5g68nyhl4y7frc0000gn/T/1680644778.png]] #+end_src
** :version
使用 =:version= 设置模型,例如:"dall-e-3"。
** :results
对于DALL-E 3,使用 =:results both= 同时输出修改后的提示。
- shell-maker
目前有两个shell实现(ChatGPT和DALL-E)。其他服务(本地或云端)也可以作为shell引入Emacs。=shell-maker= 可以帮助实现这一点。
=shell-maker= 是围绕comint模式的便捷封装。
=chatgpt-shell= 和 =dall-e-shell= 都使用 =shell-maker=,但新shell的基本实现如下所示:
#+begin_src emacs-lisp :lexical no (require 'shell-maker)
(defvar greeter-shell--config (make-shell-maker-config :name "Greeter" :execute-command (lambda (command _history callback error-callback) (funcall callback (format "Hello "%s"" command) nil))))
(defun greeter-shell () "Start a Greeter shell." (interactive) (shell-maker-start greeter-shell--config)) #+end_src
- 支持我的工作
👉 觉得我的工作有用吗?通过GitHub Sponsors支持这项工作或购买我的iOS应用。
- 我的其他实用工具、包、应用、写作...
- [[https://xenodium.com/][博客 (xenodium.com)]]
- [[https://plainorg.com][Plain Org]] (iOS)
- [[https://flathabits.com][Flat Habits]] (iOS)
- [[https://apps.apple.com/us/app/scratch/id1671420139][Scratch]] (iOS)
- [[https://github.com/xenodium/macosrec][macosrec]] (macOS)
- [[https://github.com/xenodium/dwim-shell-command][dwim-shell-command]] (Emacs)
- [[https://github.com/xenodium/company-org-block][company-org-block]] (Emacs)
- [[https://github.com/xenodium/org-block-capf][org-block-capf]] (Emacs)
- [[https://github.com/xenodium/ob-swiftui][ob-swiftui]] (Emacs)
- 贡献者
#+HTML: #+HTML: #+HTML:
使用 [[https://contrib.rocks][contrib.rocks]] 制作。