不谈Spacemacs,只谈Centaur Emacs

这里这个用lambda定义的是一个新的函数了,而add-hook默认是加载最前面的,也就是说,你的流程是先执行了custom-post.el加入的hook,隐藏了行号,然后才会执行custom.el加入的hook,显示行号,所以你的配置相当于是先隐藏了行号,然后又显示行号,最终当然就是显示行号了

1 个赞

多谢你的回答

如下例:

(add-hook 'prog-mode-hook (lambda() (... ;A lambda)))
(add-hook 'prog-mode-hook (lambda() (... ;B lambda)))

" add-hook 默认是加载最前面的",我对你这一段话的理解,"B lambda"会被"A lambda"覆盖掉,理解是否有误?

我对add-hook的加载先后顺序还不是太清楚,这两天有时间我再仔细看一下。

不是默认加载最前面的,加入到hook里面的函数都会执行的

只是add-hook默认是把最后的加到hook的最前面,像你上面那个例子,在prog-mode-hook里面,A lambda在hook中是在B lambda后面的

所以,B lambda会比A lambda先执行

你可以在执行了add-hook后,用C-h v看下prog-mode-hook的值,应该就比较清楚了

1 个赞

好的,谢谢!也就是相当于(car A list)(car B list),B在头部,从头至尾的执行的话,B先执行。

对头,就是这个意思

多谢!:grinning:

ありがとうございます!:grinning:

Centaur里,go语言不能智能提示吗?

我自己的go配置智能提示如图:

33

能,请参考lsp-mode或者gocode的配置,目前建议用bingo。

我就是把下面这段代码加到custom-post.el里的,这段代码在我自己的.emacs.d的环境里没问题。切换到Centaur里就没反应了。不知哪里冲突了?

(use-package go-projectile :ensure t)
(use-package go-errcheck :ensure t)
(use-package lsp-go :ensure t)

(use-package go-mode
  :ensure t
  :mode (("\\.go\\'" . go-mode))
  :hook ((before-save . gofmt-before-save))
  :config
  (setq gofmt-command "goimports")
  (use-package company-go
    :ensure t
    :config
    (add-hook 'go-mode-hook
              (lambda()
                (add-to-list (make-local-variable 'company-backends)
                             '(company-go company-files company-yasnippet company-capf company-dabbrev))
                (local-set-key (kbd "C-c c") 'go-errcheck)
                (setq ac-sources '(ac-source-go ac-source-abbrev ac-source-dictionary))
                #'flycheck-mode
                #'lsp-go-enable
                #'company-mode-on
                (company-mode))))
  (use-package go-eldoc
    :ensure t
    :hook
    (go-mode . go-eldoc-setup)
    )
  (use-package go-guru
    :ensure t
    :config
    (add-hook 'go-mode-hook #'go-guru-hl-identifier-mode)
    )
  )

(set-variable 'gofmt-command "goimports")

(when (memq window-system '(mac ns))
  (exec-path-from-shell-copy-env "GOPATH"))

(use-package go-autocomplete :ensure t)
(ac-config-default)

centaur本来就支持go,不需要额外配置。

我看到你的go配置,format之类的都可以,但不清楚为什么不能智能提示。emacs之外还要配置什么吗?按理说我的.emacs.d能智能提示,说明外部环境应该没问题。你的配置是不是有其他的要求。能帮抓个图吗?我看一下你的智能提示是什么样的

你没有安装lsp,请参考lsp-mode配置。

刚才网站似乎崩了?

如果你不用 LSP,请在custom.el中设置

(setq centaur-lsp nil) ; Set LSP client: lsp-mode, eglot or nil

我的效果如下(使用bingo+lsp-mode):

好的,谢谢!我看一下github上的lsp-mode的说明。关于lsp,若不是最近配emacs,我都不了解,我在网上搜搜相关资料去。若有好的资料网址,也帮推荐一下。:blush:

我现在看的是github上的language-server-protocol,官方网址,写的比较清楚

作为R用户,我认为RStudio作为IDE是优秀的,但是对Emacs风格的快捷键支持非常不友好,各种Alt-*都变成调出菜单栏了,更大的问题是在Linux下他还不支持输入中文。所以有些时候我还是在Emacs中写一点R文档或运行R(类似ipython)。

ESS的文档以及我的elisp水平并不足以支持我解决目前遇到的问题,想请 @seagle0128 加强一下对R的支持。

配置好ESS(Emacs Speak Statistics)后,M-x R,弹出的是跟popup一样大的窗口,我用hook的方式解决不了; 运行的是交互界面(类似ipython),此时按键无反应,需要C-g,但光标随后会跳到window的开头位置,不知道是何原因,我试了Doom中也会出现同样的问题; 加载一些包后,提示信息会显示e[31m✖e[39m这样的符号(其中e看起来同^[),31这些对应的是shell中的颜色。

交互对应的major-mode是inferior-ess-(r-)mode,而ess-r-mode(类似filename.py)的一些特性,比如对语法高亮等支持更好,却不在inferior中体现。不知道是不是少了什么hook我才没有加载成功。

其实在spacemacs还是doom中的inferior-ess-r-mode下是可以自动补全的,但我在Centaur下也没有折腾成功,抄以前的配置不行。找到了下面lsp的配置,也没反应:

;; lsp for R
(lsp-define-stdio-client lsp-R "R"
                         (lambda () default-directory)
                         '("R" "--slave" "-e" "languageserver::run()"))
(add-hook 'R-mode-hook #'lsp-R-enable)

谢谢!

了解 LSP 官方网址里的已经足够了,MS 网站上也有详细介绍。 如果要说使用,直接参考 GitHub - emacs-lsp/lsp-mode: Emacs client/library for the Language Server Protocol ,写的很详细。有问题可以直接 file issue。

由于个人没有使用 R,所以 Centaur 中没有集成。不过原理是一样的,如果要采用 LSP,直接注册 client 应该就可以了。注意,新版 lsp-mode 里使用的是lsp-register-client。你贴出来的是 legacy 方式,已经不用了,所以才没有效果。只是我注意到 lsp-client 中没有内置 R,需要你自己写一个才行。要不你直接提个 request给 lsp-mode?

参考:GitHub - emacs-lsp/lsp-mode: Emacs client/library for the Language Server Protocol

(lsp-register-client
 (make-lsp-client :new-connection (lsp-stdio-connection "pyls")
                  :major-modes '(python-mode)
                  :server-id 'pyls))
2 个赞

这是REditorSupport上给的配置,我看最后修改距离现在也就20几天,就比着写了。其他R配置更久远了,有些以前的函数都没有了,可能RStudio发展强大在Emacs上用的人越来越少了吧。

lsp的问题上午已经解决了。

现在有个新的问题,当我给GOPATH指定多个路径时,LSP就不工作了,报如下错误提示:

Error from the Language Server: no packages found for .../xxx.go (Unknown error)

GOPATH只指定一个路径时,没问题。指定一个路径的话,下载的工程和自己开发的工程都在同一个$GOPATH/src下,很不爽。

另外,因为我比较喜欢用fish,所以指定的GOPATH是空格隔开的,直接这么用,lsp启动不了,所以我在emacs重新用冒号隔开,go的lsp可以启动,但就是报上面的错误

实在不行,就只指定一个路径算了

最近lsp-mode更新很快,以后就不需要这样的额外配置了。