这里这个用lambda
定义的是一个新的函数了,而add-hook
默认是加载最前面的,也就是说,你的流程是先执行了custom-post.el
加入的hook,隐藏了行号,然后才会执行custom.el
加入的hook,显示行号,所以你的配置相当于是先隐藏了行号,然后又显示行号,最终当然就是显示行号了
多谢你的回答
如下例:
(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
的值,应该就比较清楚了
好的,谢谢!也就是相当于(car A list)(car B list),B在头部,从头至尾的执行的话,B先执行。
对头,就是这个意思
多谢!
ありがとうございます!
Centaur里,go语言不能智能提示吗?
我自己的go配置智能提示如图:
能,请参考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,我都不了解,我在网上搜搜相关资料去。若有好的资料网址,也帮推荐一下。
我现在看的是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))
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更新很快,以后就不需要这样的额外配置了。