我的 Emacs 配置

我的 Emacs 配置

Guix官方文档描述了完美的设置用于 Guix 上的黑客攻击。我按照此描述并按照描述设置了所有内容,但 Geiser 仍然无法完全工作。我认为这应该赋予我完成功能并让我能够转到事物的定义。我可以转到某些事物的定义,但只有极少数。大多数事情都是不可能的。完成似乎仅基于当前缓冲区中的文本。

我的 Emacs 配置

(use-package geiser
  :ensure t
  :custom
  (geiser-default-implementation 'guile)
  (geiser-active-implementations '(guile))
  (geiser-implementations-alist '(((regexp "\\.scm$") guile))))

(use-package geiser-guile
  :ensure t
  :config
  (add-to-list 'geiser-guile-load-path "/home/lars/code/forks/guix")
  (add-to-list 'geiser-guile-load-path "/home/lars/code/guix/modules")
  (add-to-list 'geiser-guile-load-path "/home/lars/code/guix"))

(with-eval-after-load "geiser-guile" 
  (add-to-list 'geiser-guile-load-path "/home/lars/code/forks/guix")
  (add-to-list 'geiser-guile-load-path "/home/lars/code/guix/modules")
  (add-to-list 'geiser-guile-load-path "/home/lars/code/guix"))

REPL

M-x geiser-guile我在 Emacs 中使用或调用 Geiser REPL M-x geiser

Geiser REPL 中的输出如下所示:

GNU Guile 3.0.9
Copyright (C) 1995-2023 Free Software Foundation, Inc.

Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.

Enter `,help' for help.
scheme@(guile-user)> 

注意提示是这样说的guile-user,但我觉得应该这么说guix-user

guix repl但是,如果我通过在终端中运行来启动 Guix REPL,输出将如下所示:

GNU Guile 3.0.9
Copyright (C) 1995-2023 Free Software Foundation, Inc.

Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.

Enter `,help' for help.
scheme@(guix-user)>

请注意,这里说的是guix-user

guix当尝试在 Geiser REPL 中“使用”模块时:

,use (guix)
;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0
;;;       or pass the --no-auto-compile argument to disable.
;;; compiling /home/lars/code/forks/guix/guix.scm
;;; compiling /home/lars/code/forks/guix/guix/packages.scm
;;; compiling /home/lars/code/forks/guix/guix/utils.scm
;;; WARNING: compilation of /home/lars/code/forks/guix/guix/utils.scm failed:
;;; no code for module (guix config)
;;; WARNING: compilation of /home/lars/code/forks/guix/guix/packages.scm failed:
;;; no code for module (guix config)
;;; compiling /home/lars/code/forks/guix/guix/store.scm
;;; WARNING: compilation of /home/lars/code/forks/guix/guix/store.scm failed:
;;; no code for module (guix config)
;;; WARNING: compilation of /home/lars/code/forks/guix/guix.scm failed:
;;; no code for module (guix config)
;;; compiling /home/lars/code/forks/guix/guix/derivations.scm
;;; compiling /home/lars/code/forks/guix/guix/diagnostics.scm
;;; WARNING: compilation of /home/lars/code/forks/guix/guix/diagnostics.scm failed:
;;; Unbound variable: trivial-format-string?
;;; WARNING: compilation of /home/lars/code/forks/guix/guix/derivations.scm failed:
;;; no code for module (gcrypt hash)
While executing meta-command:
no code for module (gcrypt hash)
scheme@(guile-user)>

在 Guix REPL 中执行相同的操作效果很好:

scheme@(guix-user)> ,use (guix)
scheme@(guix-user)>

转到定义

转到定义在某些地方有效,例如在下面的行中:

(gnu home services)

这将我正确地带到了 gnu home 服务的来源。

但是,尝试转到包的定义是行不通的:

 (packages (list
            htop
            git
            alacritty
            tmux))

尝试转到包列表中任何包的定义是行不通的。

完成

我希望能够通过键入包名称的开头来完成模块和包(除其他外),但什么也没有出现。有时我会根据同一缓冲区中的随机文本获得一些随机完成,但大多数时候甚至不是这样。

答案1

我通过以下解决方法设法让 Geiser 大部分工作。

创建一个包装脚本:

#!/bin/bash
guix repl -L ~/code/guix -L ~/code/forks/guix "$@"

将变量设置geiser-guile-binary为指向此脚本。评估当前缓冲区中的 Guile 代码,尤其是(use-modules ...)提取必要的命名空间的部分。

我还必须确保我的 Guix 源代码的本地克隆已通过以下方式编译这些说明

这允许完成导入模块中包含的任何内容,并且还修复定义查找。但仍然没有完成哪些模块可用。

相关内容