关于common lisp补全的问题

最近开始学习lisp,由于刚开始学习,小程序联体量很小,多敲几下键盘倒没什么,就是会记不清或是偶尔敲错比较麻烦,补全的提示和减少错误倒是很有帮助,但是目前lisp的补全还是没有搞定。 操作系统是win10,emacs版本27.1,安装了slime,使用auto-complete插件,配置如下: (use-package auto-complete :ensure t :config (add-to-list 'ac-modes 'lisp-mode) (add-hook 'ac-modes 'lisp-mode) (add-hook 'lisp-mode-hook 'auto-complete-mode) ) 没有任何效果,查看了论坛相关问题和网上的一些资料,也没有找到很好的解决办法。特来向论坛的老鸟们请教一下,有没有办法可以在lisp-mode中实现补全操作。

要设置 Common Lisp 实现的安装位置的,比如你使用的是 sbcl,安装位置是 /usr/bin/sbcl,配置可以这样写

(setq inferior-lisp-program "/usr/bin/sbcl")

补全插件的话个人建议使用 company,现在基本上主流都是这个。 个人参考配置

(use-package company
  :hook (after-init . global-company-mode)
  :custom
  (company-minimum-prefix-length 2)
  (company-idle-delay 0))

打开 Common Lisp 的文件后 M-x 后输入 slime 即可。

我用的是 sly,slime 的一个 fork 个人参考配置

(use-package sly
  :defer t
  :config
  (setq inferior-lisp-program "/usr/bin/sbcl"
        sly-complete-symbol-function 'sly-simple-completions))

sly 默认补全是模糊匹配个人不太喜欢,如果你喜欢的话配置这样写就可以了。

(use-package sly
  :defer t
  :config
  (setq inferior-lisp-program "/usr/bin/sbcl"))

搭配 yasnippet 后的 company(也是在论坛里抄的)

(use-package company
  :hook (after-init . global-company-mode)
  :custom
  (company-minimum-prefix-length 2)
  (company-idle-delay 0)
  :config
  (defun my-company-yasnippet-disable-inline (fun command &optional arg &rest _ignore)
    "Enable yasnippet but disable it inline."
    (if (eq command 'prefix)
        (when-let ((prefix (funcall fun 'prefix)))
          (unless (memq (char-before (- (point) (length prefix))) '(?. ?> ?\())
            prefix))
      (funcall fun command arg)))
  (advice-add #'company-yasnippet :around #'my-company-yasnippet-disable-inline))
2 个赞

谢谢回复,你这个方法之前我试过了,配置也相同,只是在执行完slime后仍然木有任何补全提示,惆怅

再次感谢,我将slime换成sly后一切正常。真是奇了怪了