Pythoner 的 spacemacs 入门指北

mac2022-06-30  26

spacemacs 是什么?

“Spacemacs is a new way to experience Emacs – a sophisticated and polished set-up focused onergonomics, mnemonics and consistency.”

简而言之,spacemacs 就是给你提供一套功能强大、易于扩展的开箱即用配置,使你基本不需要折腾也可以享受使用 emacs 的快感。So,come on,折腾起来吧!

以下是我的基本环境:

emacs 版本 : emacs 25.2 系统 : ubuntu-MATE 18.10 python : python 3.7.1( anaconda3 )

0x01 安装与基本配置

spacemacs 的安装非常简单,直接将 github 的仓库克隆的家目录的 .emacs.d 目录就可以了

git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d

之后重启 emacs 时就会自动安装了。安装过程建议选择 vim 跟 helm。

spacemacs 在安装过程中会在家目录下创建 .spacemacs 文件,如果下载插件速度太慢,可以考虑使用清华镜像源,具体使用方法如下:

添加下面的代码到 .spacemacs 的 dotspacemacs/user-init()

(setq configuration-layer--elpa-archives '(("melpa-cn" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/") ("org-cn" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/org/") ("gnu-cn" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")))

其他国内的镜像也可以,添加方法与上面一样。

0x02 spacemacs 配置文件结构

.spacemacs 的基本结构如下图:

可以看到整个文件主要由 4 个函数组成,其中

layers 主要包含对 layer 的相关配置init 主要初始化一些变量,除了对其中的变量值进行修改外,一般不建议进行修改user-init 是用户自定义初始化代码的位置,比如之前配置国内镜像源的代码user-config 包含一些用户的自定义配置 其中,这四个函数执行顺序为 init -> user-init -> layers -> user-config

.spacemacs 文件可以在 emacs 中通过 SPC f e d 快速打开进行编辑, 编辑完成后通过 SPC f s 进行保存,然后通过 SPC f e R 重新加载修改过的 .spacemacs 文件。

还有一种方式是在家目录下创建一个 ~/.spacemacs.d/ 的目录,然后将 .spacemacs 文件重命名为 init.el 后存放到 .spacemacs.d/ 目录中,以后我们创建的 layer 也可以放在这里。

0x03 配置 layers

1.加载新的 layer

之前所说,spacemacs 以 layer 来组织 emacs 的配置,包括我们自定义的配置也可以通过创建一个 layer 来实现。spacemacs 内置了许多 layer,可以通过 SPC h SPC 来进行检索,然后将需要添加的 layer 添加到 .spacemacs 中 layers 函数的 dotspacemacs-configuration-layers 变量中。

注意: 引入的每一个层本质上都是一个 list,只要你开心,可以把每一个层用括号括起来,针对特定层的一些配置可以在这里进行配置。比如后面会提到的 flyspell 的错误就会采用这种方式进行修复。

####2. 添加不包含在 layer 中的包 可以在下列语句中添加想要安装的包,然后下次启动 emacs 时就会自动安装了。如果需要对包进行更多的配置,那么可以创建自己的 layer,然后在自己创建的 layer 中引入。

dotspacemacs-additional-packages '(youdao-dictionary)

3. 删除用不到的包

有时候我们添加的 layer 中有一些自己平时用不到的包,这时候可以在像下面这样删除掉

dotspacemacs-excluded-packages '(org-projectile)

0x04 创建自己的 layer

创建自己的 layer 可以很方便地将自己的配置进行集中存放,便于管理。

1. layer 基本结构

下面是 spacemacs 文档中建议的 layer 结构,我们可以仿照这个结构创建自己的 layer

[layer_name] |__ [local] | |__ [package 1] | | ... | |__ [package n] |-- layers.el |__ packages.el |__ funcs.el |__ config.el |__ keybindings.el [] = directory

2. 创建 layer

spacemacs 内置创建 layer 的命令为 configuration-layer/create-layer,运行之后,会询问 layer 的位置,默认的是 ~/.emacs.d/private/ ,可以通过修改

dotspacemacs-configuration-layer-path '("~/.spacemacs.d/layers")

进行调整。之后不要忘了将 layer 添加到 dotspacemacs-configuration-layers 中。

3. 在 layer 中安装新的包

首先需要在 layer 的 package.el 文件中找到下列语句,然后将包名添加进去,如果需要的包不在官方仓库中,可以指定远程 repo 或者本地目录。

(defconst zeamonk-packages '((aweshell :location (recipe :fetcher github :repo "manateelazycat/aweshell")) ) )

然后创建包的初始化函数,其格式为 layerName/init-packageName

(defun zeamonk/init-aweshell () (use-package aweshell :config (spacemacs/set-leader-keys "osn" 'aweshell-new) ) )

0x05 一些更好的配置

1. 修复 flyspell 中文错误

启动 emacs 时出现如下错误:

Error enabling Flyspell mode: (Error: No word lists can be found for the language "zh_CN".)

这个错误提示的很明显了,直接关掉中文检查即可

(spell-checking :variables ispell-program-name "aspell" ispell-dictionary "american" spell-checking-enable-by-default nil)

2. python 虚拟环境使用

码 Python 代码时,代码补全特别是一些第三方库需要 emacs 工作在特定的虚拟环境下,为了解决这个问题 python layer 内置了 pyvenv 来处理虚拟环境,其默认的虚拟环境目录为 ~/.virtualenv,可以通过在初始化时,也就是在 user-init 函数中指定自己的虚拟环境路径

(setenv "WORKON_HOME" "/path/to/virtual/envs/")

之后在编辑 py 文件时,可以通过 , V w 调用 pyvenv-workon 命令来选择虚拟环境。

3. 导入elisp手册

当时吸引我从 vim 转到 emacs 很重要的一个原因就是 emacs 的文档非常齐全,查看也很方便 C-h i 可以快速进入 info 模式,但是不知道为啥,我在装好 emacs 后发现没有 elisp 内置的文档。在这种情况下需要自己去下载 An Introduction to Programming in Emacs Lisp,依次执行下列两步:

移动eintr.info.gz到info目录 $ sudo cp eintr.info.gz /usr/share/info/ $ cd /usr/share/info/ 安装 $ sudo ginstall-info --info-file=eintr.info.gz --dir-file=dir

4. 几个方便 hack 的函数

下面几个函数是我在学习 spacemacs 中为了方便自己写的,可以给大家做个参考:

(defun zeamonk-quick-eval-a-s-expr () "quick eval a symbol expression" (interactive) (save-excursion (progn (move-end-of-line 1) (call-interactively #'eval-last-sexp)) ) ) (defun zeamonk-quick-eval-selected-region () "eval a selected region" (interactive) (progn (call-interactively #'eval-region) (evil-force-normal-state) ) ) (defun zeamonk-truncate-lines () "turncate-lines in org-mode" (interactive) (setq truncate-lines nil) (visual-line-mode))

5. 对 spacemacs 改进的配置

修改 evil 的 escape 键 习惯了 vim 的同学一般会将 esc 映射为 j j 或 j k,毕竟使用 esc实在是太反人类了, spacemacs 通过 evil-escape 插件来实现这个功能,可以自己通过下列语句定义: (setq-default evil-escape-key-sequence "jk") jk移动时以屏幕行为单位 (define-key evil-normal-state-map (kbd "j") 'evil-next-visual-line) (define-key evil-normal-state-map (kbd "k") 'evil-previous-visual-line) 补全时使用 C-n、C-p来选择补全项 (define-key evil-insert-state-map (kbd "C-n") 'company-select-next) (define-key evil-insert-state-map (kbd "C-p") 'company-select-previous)

欢迎关注公众号 LazyMonk,不定时分享好玩的代码

最新回复(0)