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 源代码的本地克隆已通过以下方式编译这些说明。
这允许完成导入模块中包含的任何内容,并且还修复定义查找。但仍然没有完成哪些模块可用。