All Projects → condy0919 → .emacs.d

condy0919 / .emacs.d

Licence: gpl-3.0
一个快速且实用的 Emacs 配置

Projects that are alternatives of or similar to .emacs.d

.personal Emacs.d
😈 My opinionated Emacs configuration
Stars: ✭ 101 (+60.32%)
Mutual labels:  config, emacs
Awesome Dotfiles
Dotfiles for awesome people using the awesomewm linux environment
Stars: ✭ 409 (+549.21%)
Mutual labels:  config, emacs
Yay Evil Emacs
😈 A lightweight literate Emacs config with even better "better defaults". Shipped with a custom theme!
Stars: ✭ 250 (+296.83%)
Mutual labels:  config, emacs
.emacs.d
My emacs config
Stars: ✭ 56 (-11.11%)
Mutual labels:  config, emacs
.emacs.d
🎉 Personal GNU Emacs configuration
Stars: ✭ 313 (+396.83%)
Mutual labels:  config, emacs
.emacs.d
My emacs configuration, written as literate elisp
Stars: ✭ 46 (-26.98%)
Mutual labels:  config, emacs
Config
Yii2 application runtime configuration support
Stars: ✭ 54 (-14.29%)
Mutual labels:  config
React App Rewired
Override create-react-app webpack configs without ejecting
Stars: ✭ 8,630 (+13598.41%)
Mutual labels:  config
Emacs Fish Completion
[MOVED TO GITLAB]
Stars: ✭ 53 (-15.87%)
Mutual labels:  emacs
Remacs
Emacs style editor written in Racket
Stars: ✭ 52 (-17.46%)
Mutual labels:  emacs
Dotfiles
Setup your Mac and sync it with your other machines.
Stars: ✭ 61 (-3.17%)
Mutual labels:  config
Mermaid Mode
Emacs major mode for working with mermaid graphs https://mermaidjs.github.io/
Stars: ✭ 60 (-4.76%)
Mutual labels:  emacs
Comb
Interactive code auditing and grep tool in Emacs Lisp
Stars: ✭ 58 (-7.94%)
Mutual labels:  emacs
Lsp Javascript
Stars: ✭ 55 (-12.7%)
Mutual labels:  emacs
Emacs Themes Site
Source code for https://emacsthemes.com
Stars: ✭ 58 (-7.94%)
Mutual labels:  emacs
Org Make Toc
Automatic tables of contents for Org files
Stars: ✭ 53 (-15.87%)
Mutual labels:  emacs
Dotfiles
🏠
Stars: ✭ 60 (-4.76%)
Mutual labels:  emacs
Ivy Yasnippet
Preview yasnippet snippets with ivy
Stars: ✭ 53 (-15.87%)
Mutual labels:  emacs
.dot Org Files
Dotfiles, Emacs + Org-mode with babel and Literate programming.
Stars: ✭ 57 (-9.52%)
Mutual labels:  emacs
Yii2 Configloader
Build configuration arrays from config files and env vars.
Stars: ✭ 59 (-6.35%)
Mutual labels:  config

A fast and incredible Emacs config

Build Status License Supports Emacs 27.1-28.x

Table of Contents

个人Emacs配置

overview

仿 Centaur Emacs 的个人配置.

git clone --depth 1 https://github.com/condy0919/.emacs.d ~/.emacs.d

仅包含C/C++/Rust/OCaml/Haskell相关配置,且全线使用lsp。当前由于haskell-ide-engine水土不服,故haskell没有采用lsp

保持着尽量使用Emacs自带功能的原则,能用自带的就用自带的。

需要的依赖

  • hunspell 拼写检查,目前仅在git-commit-mode下启用
  • rg 更快的grep
  • pandoc (optional) 文本转换工具,markdown-mode渲染需要
  • markdown (optional) 文本转换工具,markdown-mode渲染需要
  • cmake c++项目的构建工具
  • git 这个就不用说了吧?
  • gcc 这个就不用说了吧?
  • fd (optional) 更现代的 find, projectile 会自动检测
  • languagetool (optional) 更好的拼写检查、语法纠错工具

基础配置

最基础的配置包含了那些在所有mode下都不会变更的配置,包含了:

包名 功能
align align-regexp可以自动对齐选择的符号
appt 任务提醒,可以与org-mode结合
autorevert 当文本被其他编辑器修改后,可自动更新
delsel 选中文本可以直接覆盖着写,一般编辑器都默认开这个功能
hippie-expand 用来展开文本
hl-line 高亮当前行
newcomment 注释、反注释功能
paren 高亮匹配的括号
saveplace 自动记录上次打开文件的位置
simple modeline里显示行号、列号以及当前文本的大小
so-long 打开长行的文件不再痛苦 (Emacs 27+ 自带)
speedbar 侧边栏,可以显示当前目录下的文件、打开的buffer
tab-bar 窗口布局管理 (Emacs 27+ 自带)
tramp 远程编辑就靠它

而这几个包也是Emacs自带的。

为了保持界面的整洁,禁用了菜单栏、工具栏和滚动条。

在跳转之后会闪烁一下当前行,这样就比较容易知道当前光标在哪里了。这个功能也是基于自带的pulse

插件配置、升级

选用use-package来管理插件。对于elpa, melpa里没有的包,使用quelpa辅助下载。为什么我会从straight.el切换至quelpa呢?主要是straight.el不支持单个文件的下载、配置,见init-cpp.el内的llvm-mode配置项。

而自动升级选择了auto-package-update这个包。如果需要更新,M-x auto-package-update-now即可。需要注意的是,更新是同步的。

注意:

llvm-modetablegen-mode下载通过raw.githubusercontent.com,而这个域名在国内几乎不可达,需要科学上网。因此现在已使用gitee的镜像服务来中转。

界面

使用了doom-themesdoom-modeline,简直惊艳!doom-one的界面非常好看!

趁手的工具

which-key,rg是比较常用的工具。更有projectile管理项目,让项目编译、测试、运行变得更加方便。而且还有counsel-projectile的加成,在原有projectile的基础上又添加了许多ivy action,更一步提升了便捷性。

avy用来代替vim-easymotion。而且avy还提供了goto-line的功能,这下都不用开相对行号8k 9j这样跳了。

自然ivy,counsel是要上的,补全功能太好用了。没有counsel加持的M-x根本无法让人按下去。这里推荐尽量使用isearch,因为swiper下方占用空间过大(继承于ivy的设置),搜索时必然是比较在意上下文的。而自带的isearch在稍加设置之后,效果也还可以接受。当evil-search-module设置成isearch后,也可以使用相同的快捷键来触发ivy-occur。再加上ivy-occur可以与wgrep配合,将原来的「搜索、打开对应文件、修改」变成了「搜索、修改」。

Emacs下的org-mode/markdown-mode让人惊艳,突然觉得写文档也会这么快乐。与之相辅相成的还有separedit,让人在代码里写documentation comments不再烦恼。

valign 提供了像素级别的表格对齐,终于不用再靠西文半宽的字体了!

neovim迁移过来的我,自然是常开evil-mode,相关的evil套件有:

  • evil
  • evil-collection (已包含 evil-magit)
  • evil-surround

按键绑定

evil-mode

normal状态下增加了如下键绑定:

key function
gs evil-avy-goto-char-timer 来跳转到目标字符
go evil-avy-goto-word-or-subword-1 来跳转至目标单词处
gl evil-avy-goto-line 来跳转到对应行

avy真乃神器也!

同时,因为开启了evil-collection-want-unimpaired-p (由evil-collection提供) 而获得了如下键绑定:

key function
[b previous-buffer 切换至上一个 buffer
]b next-buffer 切换至下一个 buffer
[e evil-collection-unimpaired-move-text-up 将当前行移动至上一行
]e evil-collection-unimpaired-move-text-down 将当前行移动至下一行
[l evil-collection-unimpaired-previous-error 上一个错误
]l evil-collection-unimpaired-next-error 下一个错误
[ SPC evil-collection-unimpaired-insert-newline-above 在上方插入一空行
] SPC evil-collection-unimpaired-insert-newline-below 在下方插入一空行
[u evil-collection-unimpaired-url-encode 对所选内容进行url参数编码
]u evil-collection-unimpaired-url-decode 对所选内容进行url参数解码

本配置里使用hideshowfold代码块。由于hideshow本身提供的快捷键非常长,非常推荐使用evil-modenormal状态下定义的键绑定。

key function
zm evil-close-folds隐藏所有代码块
zr evil-open-folds显示所有被隐藏的代码块
zo evil-open-fold隐藏当前代码块
zO evil-open-fold-rec递归地隐藏当前以及之内的代码块
zc evil-close-fold显示当前被隐藏的代码块
zC evil-close-fold-rec递归地显示当前以及之内的代码块
za evil-toggle-fold来切换是否隐藏代码

此外另外提供了一个Leader键,绑定在了SPC键上。

special-mode专用。通常在special-mode里会定义一个SPC用来翻页 (如Info),但是由于SPC已经作为Leader键了。这里曲线救国,用SPC SPC来代替原来的SPC单键行为,并且会进入transient状态,接下来仅按SPC即可触发原函数。

key function
SPC 调用当前mode下原来绑定至SPC上的函数

与文件相关的Leader键绑定如下:

key function
ff find-file打开文件, f.有相同效果
f. 同上
fF find-file-other-window同上,不过是在另一窗口打开, f/有相同效果
f/ 同上
fg rgrep递归地在目录下grep给定字符串
fj counsel-fd-file-jump打开由fd在当前目录下搜索到的文件
fo counsel-find-file-extern使用外部程序打开文件
fD my/delete-current-file删除当前文件
fC my/copy-current-file拷贝当前文件至其他地方
fy my/copy-current-filename拷贝当前文件的绝对路径
fR my/rename-current-file重命名当前文件
fr counsel-recentf访问最近使用过的文件
fl find-file-literally采用朴素模式打开文件
fz counsel-fzf使用fzf来索引打开文件

与目录相关的Leader键绑定如下:

key function
dj dired-jump进入当前文件的目录
dJ dired-jump-other-window同上,不过是在另一窗口打开
dM make-directory创建目录
dC copy-directory拷贝目录
dD delete-directory删除目录
dl list-directory列出目录下的文件

bufferbookmark相关的键绑定:

key function
bb switch-to-buffer切换buffer
bB switch-to-buffer-other-window同上,不过是在另一窗口打开
bc clone-indirect-buffer将当前buffer克隆至另一buffer,它们可以使用不同major-mode
bC clone-indirect-buffer-other-window同上,不过是在另一窗口打开
bv revert-buffer重新读取当前buffer对应的文件
by my/copy-current-buffer-name复制当前buffer的名字
bz bury-buffer退出当前buffer的显示,当前buffer未被 kill
key function
bj bookmark-jump跳转至书签
bJ bookmark-jump-other-window同上,不过是在另一窗口打开
bm bookmark-set设置书签
bM bookmark-set-no-overwrite同上,但是不会覆盖同名的书签
bd bookmark-delete删除书签
bi bookmark-insert插入书签的内容
bl bookmark-bmenu-list打开书签列表
br bookmark-rename重命名书签
bs bookmark-save保存书签
bw bookmark-write将书签保存至其他文件

打开其他程序的Leader键绑定:

key function
ot my/ansi-term打开ansi-term
oT my/ansi-term-other-window在其他窗口打开ansi-term
oe eshell打开eshell
oE my/eshell-other-window在其他窗口打开eshell
os shell打开shell
od osx-dictionary-search-word-at-point打开 MacOS 自带的词典
ow dictionary-search搜索单词定义
ol org-store-link存储URL
oc org-capture随时记录一些想法、URL等

打开一些看起来像是独立的应用:

key function
aa org-agenda日程
ac calendar日历
ag gnus查看新闻组
ai rcirc上 IRC
aj jblog管理博客文章
an newsticker查看RSS订阅
ap proced查看进程

搜索相关的Leader键绑定:

key function
sb swiper-all在所有打开的buffer中搜索
sB swiper-all-thing-at-point与上面类似,默认输入是当前光标处的文本
ss swiper-isearch采用isearch的方式来搜索,不显示行号
sS swiper-isearch-thing-at-point与上面类似,默认输入是当前光标处的文本
sg counsel-rg在当前目录中使用rg搜索
sl ivy-resume方便恢复上一次swiper的搜索
si imenu
sj evil-show-jumps
sm evil-show-marks
sr evil-show-registers
sw my/lsp-ivy-workspace-symbol仅在lsp-mode开启的情况下生效,查找符号

与文本相关的Leader键绑定:

key function
x TAB indent-rigidly在一个region上统一进行缩进
xw delete-trailing-whitespace删除行末空白字符
xj set-justification文本对齐

与代码相关的Leader键绑定:

key function
cc compile编译
cC recompile重新编译
ck kill-compilation打断当前的编译过程
cx quickrun快速运行当前程序
cX quickrun-shelleshell里查看输出
cd rmsbolt-compile查看编译器的输出,如汇编、IR表示
ca add-change-log-entry-other-window打开ChangeLog文件

Emacs

key function
M-; comment-or-uncomment 注释与反注释
C-c ' 通过separedit在注释中快乐地写代码
C-c x 调用quickrun来运行当前buffer内的代码。eval快人一步!
M-= 在下方弹出一个ansi-term终端
C-c p projectile调用前缀,方便地在项目内跳转、编译等其他功能
C-x g 呼出 magit
C-M-; git-commit时会有flyspell检查单词是否错误,通过此按键自动修正
M-o 原生C-x o来切换window有点反人类,绑定在单键上就可以快速的切换至其他窗口了
C-c = 调用align-regexp提供以一个对齐符号的功能

因为projectile比较常用,把它单独拿出来 说。本配置中还使用了counsel-projectile来令projectile更加方便。

key function
C-c p f projectile-find-file在项目内查找其他文件
C-c p b projectile-switch-to-buffer切换至其他buffer(限定在本project下)
C-c p C projectile-configure-project配置当前项目
C-c p c projectile-compile-project编译当前项目
C-c p u projectile-run-project运行当前项目
C-c p P projectile-test-project测试当前项目
C-c p p projectile-switch-project切换至其他项目
C-c p s r projectile-ripgrep使用ripgrep来搜索当前项目内的文本。

基于同样的理由,把flycheck单独拎了出来。

key function
C-c ! l flycheck-list-errors列出所有lint错误
C-c ! n flycheck-next-error下一个lint错误
C-c ! p flycheck-previous-error上一下lint错误

更详细的按键绑定请直接看代码. :-)

定义了一组hydra,通过调用avything-at-point函数,快速复制对应光标处的内容。为了在编辑模式中也能够使用,将其绑定在了C-c h c上。C-c h是所有hydra的前缀,目前有3个,分别是:

  1. hydra-copy通过avy用来快速拷贝
  2. hydra-macro方便执行kmacro
  3. hydra-other-window-scroll在不改变焦点的情况下移动另一窗口的buffer

通用开发设置

  • 显示行末空白字符
  • 高亮TODO FIXME等关键字
  • dumb-jump作为lsp-find-definition失败后的备份手段
  • magit作为git客户端
  • hideshow来显示/隐藏结构化的代码块,如 "{ }" 函数体等
  • rmsbolt作为一个本地的 Compiler Explorer 相比于godbolt友好一点
  • ispell拼写检查器, evil用户可以快速通过z= (ispell-word) 来检查
  • flyspell拼写检查器,仅在magit写提交信息时启用
  • quickrun作为一个能够执行部分区域内的代码块,方便快速验证函数功能
  • tempo作为代码片段展开工具, spdx然后再M-x tempo-expand-if-complete即可

prog-mode

cc-mode

使用lsp-mode作为补全、符号查找的工具,默认后端使用clangd,一般发行版的源里都 会有对应的包。如果想使用ccls,可以customize对应的变量:

(setq lsp-clients-clangd-executable "ccls"
      lsp-clients-clangd-args nil)

如果想使用cclslsp扩展功能,需要安装ccls扩展。

禁用了flycheck自带的3个checker(分别为c/c++-clang, c/c++-cppcheck, c/c++-gcc),因为它们都无法正确包含自定义的头文件路径。

此外,

  • c++-mode启用了modern-cpp-font-lock
  • cmake-mode可使用company-mode进行符号补全
  • 启用了hide-ifdef-mode,可以令#if 0#endif之间的代码看起来像注释一样。也可以#define一些宏,放入hide-ifdef-env中生效。
  • 部分常用snippet,如ifndef,main等等。详细列表见init-cpp.el文件
  • cmake-mode增加了一个简单 lib 的snippet,可以通过lib关键字展开

rust-mode

使用lsp-mode作为补全、符号查找的工具,默认后端使用rls,一般发行版会把它直接跟rust绑在一起,也可以使用rustup来安装。对于rust-analyzer用户而言,通过设置

(setq lsp-rust-server 'rust-analyzer)

来切换至rust-analyzer

当然,

  • rust-mode开启了保存时格式化文件,需要确保rustfmt二进制包存在
  • 使用了cargo来提供深度集成化的cargo命令

ocaml-mode

使用lsp-mode作为补全、符号查找的工具。在Arch Linux上,可以使用 ocaml-lsp-git 这个包。

由于ocaml-lsp-git目前实现了lsp-format-buffer且额外依赖ocamlformat

所以这里额外使用了ocp-indent,通过ocp-indent-region, ocp-indent-buffer来提供格式化代码的功能。

同时也集成了dune

ocp-indentdune都依赖系统级别的包。

如果你是Arch Linux可以直接通过如下命令安装:

yay -S ocaml-ocp-indent dune

haskell-mode

  • 使用 dante

截图

dashboard

magit_markdown

cpp_company

FAQ

  1. dashboard 里图标显示不正确? 依赖 all-the-icons, 请确保M-x all-the-icons-install-fonts安 装对应的字体以显示图标。
  2. 更新时提示对应版本的包不存在? 这多是因为国内镜像源同步慢导致的。如果出错,可以临时禁用镜像源。
(setq package-archives
      '(("melpa"  . "https://melpa.org/packages/")
        ("gnu"    . "https://elpa.gnu.org/packages/")
        ("nongnu" . "https://elpa.nongnu.org/nongnu/")))
  1. 如果升级包遇到了错误,可以使用 init-mini.el 这个最小的配置来 启动。
emacs -Q -l init-mini.el

其他

欢迎提issue给出建议,感谢!

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].