lsp-mode(emacs下的代码编辑环境)

lsp-mode(emacs下的代码编辑环境)

lsp支持的语言相关wiki

lsp支持的语言类型 可以看到支持非常多的语言,意味着针对语言的配置,大多数只要链接下lsp-mode就好了

lsp支持C,C++

使用clangd

具体可以参考我的C的clangd安装部分 一旦安装以后,可以新打开一个文件,会提示导入project,然后就能使用补全和定义了,这里不再展示了

lsp支持bash

lsp支持golang

lsp支持python

Warning (emacs): The palantir python-language-server (pyls) is unmaintained; a maintained fork is the python-lsp-server (pylsp) project; you can install it with pip via: pip install python-lsp-server

所以不用pyls,用pylsp

使用pylsp

https://github.com/python-lsp/python-lsp-server

1
pip3 install python-lsp-server[all]
1
2
3
4
5
6
7
8
(use-package python-mode
  :ensure t
  :hook (python-mode . lsp-deferred) ;; add this support lsp
  :custom
  (dap-python-debugger 'debugpy)
  :config
  (setq python-shell-interpreter "python3")
  (setenv "PYTHONPATH" "/usr/bin/python3")

一般加上hook就好了,然后重启下emacs,这个时候基本东西就差不多了,可以检查下是否有对应的pylsp buffer, 看下log是否ok

../images/lsp-python01.png◎ ../images/lsp-python01.png

刚打开可能会发现都是一大堆错误,这个是正常的,里面的很多规范我建议都满足比较好,一般是顶层加注释,

类加注释,函数加注释,空几行等问题,总之是不错的默认规范。

我尝试了下发现系统自带的,python自己的东西一般都能补全,但是pip装的似乎不能补全,M-x company-dialog 发现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Emacs 27.1 (x86_64-pc-linux-gnu) of 2021-06-25 on liuliancao
Company 0.9.13

company-backends: (company-capf
 (company-files company-yasnippet company-keywords company-capf company-elisp company-abbrev company-dabbrev))

Used backend: company-capf
Value of c-a-p-f: (lsp-completion-at-point)
Major mode: python-mode
Prefix: "djan"
Completions: none

而company-capf本质是一个桥和lsp差不多的东西,所以这里意味着我少装了一个pylsp的插件或者没有启用

我们查阅了pylsp的github,搜python-lsp-server,发现可以用rope这个,而官方的rope github说明建议是 pip下载pylsp-rope,而这个默认是不装的,当我们装完以后,M-x lsp-restart-workspace再看的时候,发现 可以补全了,神奇吧!多看文档。

1
2
3
4
5
6
Used backend: company-capf
Value of c-a-p-f: (lsp-completion-at-point)
Major mode: python-mode
Prefix: "djan"
Completions:
  #("django" 0 4 (lsp-completion-item #s(hash-table size 65 tes...

具体我就不截图了

使用pipenv

pipenv的使用我不再介绍了,这里有个问题就是emacs在编辑的时候并不会使用pipenv的环境的东西, 原因是pipenv-mode这个包读取的是

direnv

direnv本地shell添加 https://direnv.net/docs/hook.html

direnv的主要作用是可以根据不同的项目或者目录设置不同的环境变量,具体可以官网简单看下,

也可以下载direnv的emacs包,整体上分为两部分

编写.envrc export VIRTUAL_ENV="home/liuliancao.local/share/virtualenvs/cmdb-RBwcbsRt/"

allow .envrc(如果不allow会提示lock)

direnv的debug emacs里面也有一个buffer可以看下, 重启emacs后发现

从env[none]到env[on]了

1
2
3
  cat <EOF >>~/.bashrc
  eval "$(direnv hook bash)"
  EOF

使用jedi

lsp支持angular