在Spacemacs中使用conda环境启用lsp-pyright

如果你是Emacs的用户,那么肯定听说过Spacemacs,以开箱即用而出名,界面也非常的漂亮。放弃了一段时间的Emacs,之前都是自己写的配置,没有时间维护,便尝试了一下Spacemacs。 在使用Spacemacs开发Python的时候,启动lsp-pyright对Python的支持,lsp-pyright可以识别virtualenv虚拟环境,暂时还没有对conda env的支持。好在还是有办法设置python程序的路径。 实现方式用到了几个关键词方法: dotspacemacs-configuration-layers列表添加python、lsp以及conda directory local variable with-eval-after-load 下面解释每个点的配置 Spacemacs layers 启动python和lsp,这两个layer不需要做过多的设置。 启动conda的时候需要设置conda-anaconda-home变量,如下: (conda :variables conda-anaconda-home "D:/path/to/miniconda3") python解释器我使用的是miniconda,可以修改成自己对应的路径。 Directory local variable Emacs支持在项目目录创建一个 .dir-locals.el 文件,来创建针对项目文件的本地变量,而不会覆盖全局的变量。这样多个项目之间就不会相互影响了。这块可以参考官方文档。 在我们的Python项目根目录下创建一个 .dir-locals.el 文件,写入以下内容: ((python-mode . ((eval . (with-eval-after-load 'lsp-pyright (progn (lsp-register-custom-settings `(("python.pythonPath" "D:/path/to/miniconda3/envs/stringle_pro/python.exe")))) ))))) 首先python-mode 指定只有在python模式下后面的代码才会执行; (eval . func_call)是一个cons pair,eval函数相当于是标记后面的fanc_call是一个可以执行的S表达式; 如果要设置指定模式下的变量值,则使用下面的代码: ((python-mode . ((variable-name variable-value)))) with-eval-after-load with-eval-after-load 是Emacs内置的一个宏,定义在 subr.el。 这个地方是很需要注意代码运行的顺序与时机的。在Emacs打开python代码的时候会调用 lsp 启动lsp-mode,lsp会询问使用的lsp后端,python的lsp后端有非常的多,pyls, mspy等。我选择的是lsp-pyright。然后lsp根据设置的python lsp后端,加载lsp-pyright的代码。 这时上面的with-eval-after-load就会起作用了,在加载完lsp-pyright.el的代码后就会执行with-eval-after-load里面的代码。把 python.pythonPath 这个lsp变量设置完成后。 lsp就会调用lsp-pyright里面lsp相关函数,启动pyright后端。 总结 本文说明了如何在spacemacs下启用lsp来支持在conda env虚拟环境下开发python的配置工作,需要对Emacs和lsp的工作原理有一定的认识与了解。

June 19, 2023

Emacs下Python开发配置

Python开发环境配置其实比较简单,而我一直没有配置好是参照了网上各种各样的配置,导致了非常混乱的配置,这次自己亲自测试安装自己需要的Emacs包来配置。 需要的Emacs包 Elpy company-mode anaconda-mode 就这三个包就可以了。Elpy是一个很强大的Python集成开发环境了,后面两个其实就是做自动补全用的。如果启动Emacs后,执行M-x elpy-config没有办法出来配置的界面,可能是Emacs没有识别到python, pip, conda等命令,可以安装下面的包来解决: exec-path-from-shell 需要的Python包 Elpy的github页面已经列出来了: # Either of these pip install rope pip install jedi # flake8 for code checks pip install flake8 # and autopep8 for automatic PEP8 formatting pip install autopep8 # and yapf for code formatting pip install yapf 另外anaconda-mode需要安装setuptools pip install setuptools Emacs配置 下面是最简单的配置,~/.emacs.d/init.el (require 'package) (add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/")) (package-initialize) (package-refresh-contents) (defvar my-packages '(elpy company anaconda-mode exec-path-from-shell)) (mapc #'(lambda (package) (unless (package-installed-p package) (package-install package))) my-packages) (exec-path-from-shell-initialize) (elpy-enable) (add-hook 'after-init-hook 'global-company-mode) (add-hook 'python-mode-hook 'anaconda-mode) (add-hook 'python-mode-hook 'anaconda-eldoc-mode) 常用按键 Keybinding Function Description M-. anaconda-mode-find-definitions 跳转到定义处。如果不使用anaconda-mode,则是绑定到elpy的elpy-goto-definition,elpy有时候工作得不是很好 M-? anaconda-mode-show-doc 在另外一个window中显示光标当前所在位置符号的文档 M-, anaconda-mode-find-assignments 跳转到变量赋值位置 M-r anaconda-mode-find-references 在另外一个window中显示光标当前所在位置变量的所有引用 M-* anaconda-mode-go-back 返回上一个位置 show一下我的.emacs.d配置,欢迎交流。

March 20, 2018

Make your own Emacs package

Make you own Emacs package. 创建自己的Emacs包。 在Elpa、MELPA上面有许多的包,可以做各种各样的事情,但有可能你找不到一个合适你的某个问题的包,这时候可以自己动手写一个package,分离到MEELPA。 其实写一个package是一个比较简单的事情,但是又比较麻烦,麻烦在于有很多的约定需要了解,下面我们来动手写一个简单的闹钟包,参考了alarm.el。恰好我的包也叫做alarm.el,如有疑问请提出。 准备 开发阶段使用package-insstall-file来安装并且测试包是否正确,这个命令可以安装单个文件something.el,也可以安装一个tar包,这里主要有两个文件,所以需要打成tar包安装。 目录结构 alarm-20170724.1502 |-alarm-pkg.el |-alarm.el |-alarm.wav 目录名的命名规则是name-version alarm-pkg.el 是给emacs的package提供信息的一个文件 alarm.el 程序主要内容在这个文件 alarm.wav 闹钟响的时候播放这个文件,还可以使用.au文件 alarm-pkg.el (define-package "alarm" "20170724.1502" "A package to alarm yourself at some time.") 这个文件比较简单,只是调用了define-package来定义你的包信息,此函数的签名如下: (defun define-package (_name-string _version-string &optional _docstring _requirements &rest _extra-properties) (error "Don't call me!")) 第一个参数是包名,第二个参数是版本号,第三个参数可以是一个长字符串提供说明文档 alarm.el 这个文件的约定比较多,先看一下这个文件的头部 ;;; alarm.el --- Alarm ;; Copyright (C) 2017, Emacs guys, all rights reserved. ;; Author: Kevim Jiang <wenlin1988@126.com> ;; Version: 20170724.1502 ;; Keywords: alarm ;; Maintainer: Kevin Jaing <wenlin1988@126.com> ;; Created: 2017-07-24 12:00:00 ;;; Commentary: ;; Set an alarm with `alarm-clock', and enter the time; ;; cancel the alarm with `alarm-clock-cancel' ;;; Code: 每一个段落以空白行隔开。第一行是文件名和一个简短的说明,而且开头以;;;三个分号注释。Commentary一段可以是长一些的说明文档,以及使用说明。最后是;;; Code:段,接下面就是真正的代码内容。可以使用checkdoc来检查头部的文档是否正确。还可以使用package-lint包的package-lint-current-buffer命令检查。 ...

July 24, 2017

Racket开发环境Emacs配置

首先到Racket官网下载安装包,然后你还需要Emacs。 在Emacs安装rakcet-mode,M-x输入package-install,再输入racket-mode。安装完后在 init.el 初始化文件添加下面配置: (when (package-installed-p 'racket-mode) (setq racket-racket-program "C:/Program Files/Racket/Racket.exe") (setq racket-raco-program "C:/Program Files/Racket/raco.exe")) 把 C:/Program Files/Racket/ 改成对应的自己机器对应的路径即可。 如果是Linux或者maxOS系统,相应的程序应该是racket和raco。

June 23, 2017

源码安装emacs25

在Ubuntu系列用源码安装Emacs25非常简单 下载源码包 wget 'http://mirrors.ustc.edu.cn/gnu/emacs/emacs-25.2.tar.gz' tar -xzvf emacs-25.2.tar.gz 安装编译环境,依赖 首先需要把安装源码的选项打开。找到Software & Updates,把Source code勾上。另外一个办法是直接修改配置文件/etc/apt/sources.list,把前面两个deb-src前面的注释打开,然后运行一下sudo apt update。 sudo apt install build-essential sudo apt build-dep emacs24 # 25版本和24版本的依赖是一样的 安装Emacs cd emacs-25.2 ./configure make sudo make install 中文输入法 修改/etc/environment,后面添加一行LC_CTYPE="zh_CN.utf8" 用which emacs找到emacs程序的位置,备份sudo cp emacs emacs.bak,然后新建一个emacs可执行shell脚本,记得chmod +x emacs,内容如下: #!/bin/sh LC_CTYPE="zh_CN.utf8" emacs-25.2 重启一下系统 现在使用Alt+F2,输入emacs,把输入法换成中文就可以输入中文了 在CentOS7用源码安装Emacs25也是非常简单 下载源码包 wget 'http://mirrors.ustc.edu.cn/gnu/emacs/emacs-25.3.tar.gz' tar -xzvf emacs-25.3.tar.gz 安装编译环境,依赖 yum install -y ncurses-devel 安装Emacs cd emacs-25.3 ./configure make sudo make install

June 21, 2017

spacemacs配置figwheel环境

0. … clojure和clojurescript不像ruby on rails和django那样all in one的模式,只需要很少的配置就可以建立项目开始开发。clojure系的东西都是library,什么用着顺手就把什么加进来,然后稍做配置再使用。这跟emacs一样,完全私人定制,每个人都有自己的喜欢的extension,这应该是lisp系的习惯吧。所以在使用lisp系的东西的时候没有什么框架能一桶江湖。不过在clojurescript的开发当中figwheel还是少不了的,代码热加载功能太赞了,边写代码边看效果,不需要刷新浏览器,这就是传说的living coding。另外使用集成的IDE工具后,所有东西都有提示,敲两个字母就自动补全了,对于学习一门语言来说的确不是什么好事。闲话不多说,下面来配置一下livind coding的环境,使用spacemacs加上cider,info-clojure两个扩展。 了解更多figwheel请查看其github 1. 配置emacs 在spacemacs的配置文件.spacemacs的dotspacemacs-configuration-layers添加clojure dotspacemacs-configuration-layers '(clojure) 另外还需要inf-clojure,由于这个扩展不在spacemacs的layer列表里面,需要另外添加,在dotspacemacs-additional-packages添加即可 dotspacemacs-additional-packages '(inf-clojure) 重启spacemacs或者按SPC-f-e-R执行dotspacemacs/sync-configuration-layers 然后还需要添加一个个启动figwheel的函数,在.spacemacs后面添加下面的函数 (defun figwheel-repl () (interactive) (run-clojure "lein figwheel")) 在后面按c-x c-e执行上面函数的定义 2. 建立项目,修改project.clj 现在新建一个项目叫hello lein new app hello 修改project.clj为如下内容 (defproject hello "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.8.0"]] :plugins [[lein-figwheel "0.5.6"]] ;(1) :main ^:skip-aot hello.core :target-path "target/%s" ;;(2) :cljsbuild {:builds [{:id "dev" :source-paths ["src/cljs"] :figwheel true :compiler {:main "hello.core" :asset-path "js/out" :output-to "resources/public/js/app.js" :output-dir "resources/public/js/out"}}]} :profiles {:uberjar {:aot :all}}) 添加了两处: (1) 添加figwheel的支持 (2) 添加cljsbuild配置,这里需要注意的就是:figwheel true这一行,这是在编译的js文件里面添加figwheel的支持。还有:asset-path "js/out"这一行,不然加载google closure library会找不到对应的路径。 ...

September 1, 2016

Xshell emacs 发送alt键

我比较喜欢使用Xshell来连接服务器,原因有下面几个: 对于个人用户是免费的; 配色不需要过多的配置,有5、6种可选的比较好看的配色。在比较亮的工作环境可以选择白色背景,暗的工作环境可以选择黑色背景; 可以使用透明的窗体,看起来比较酷; 还有其他,balabalabala 默认在Xshell里面使用emacs的时候,Alt键是不怎么好用的,其实是没有发送到服务器端的,所以需要对其他做一个设置: File -> Properties -> Terminal -> Keyboard 把Use Alt as Meta key这个选项勾上 好了,现在可以使用Alt+x来在emacs里面使用command了。 以上备忘

January 21, 2016