Emacs高手修炼手册
快捷键
C-n,下一行(速记:Nextline)
C-p,前一行(速记:Previous line)
C-f,向前移动一个字符(速记:Forward)
C-b,向后退一个字符(速记:Backforward)
C-k,从光标位置到末尾删掉(速记:Kill)
C-a,回到行首(速记:a是字母表的开始)
C-e,去往行尾(速记:End of line)
M-<,回到编辑区域最开始位置(速记:<)
M->,去往编辑区域最后的位置(速记:>)
C-v,向下翻一屏
M-v,向上翻一屏
自带文档:C-h t ;速记 Help Tutorial
查看快捷键的含义:C-h k ;速记 Help Keybind
查看函数的定义以及快捷键绑定:C-h f ;速记 Help Function
初体验
关掉菜单栏、工具栏、滚动条等:
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
Emacs配置文件的位置,会按照一下顺序去查找:
- ~/.emacs
- ~/.emacs.d
- ~/.config/emacs/init.el
第一个是一个单一文件配置;第二个更符合工程化;第三个仅适用于≥27的版本。教程会从第一个入手,逐渐变为第二种的模式。
emacs配置代码
;;关掉启动界面
(setq inhibit-startup-screen t)
(setq package-archives '(
("melpa" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")
("gnu" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
("org" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/org/")))
(setq package-check-signature nil) ;个别时候会出现签名校验失败
(require 'package) ;; 初始化包管理器
(unless (bound-and-true-p package--initialized)
(package-initialize)) ;; 刷新软件源索引
(unless package-archive-contents
(package-refresh-contents))
(unless (package-installed-p 'use-package)
(package-refresh-contents)
(package-install 'use-package))
使用use-package管理扩展
-
什么是use-package
- 简单理解,是一个宏
- 用更简单统一的方式去管理插件
-
怎么用
- 基本格式,并举个例子
;; 最简洁的格式
(use-package restart-emacs);; 常用的格式
(use-package smooth-scrolling
:ensure t ;是否一定要确保已安装
:defer nil ;是否要延迟加载
:init (setq smooth-scrolling-margin 2) ;初始化参数
:config (smooth-scrolling-mode t) ;基本配置参数
:bind ;快捷键的绑定
:hook) ;hook模式的绑定;; 建议添加的配置(部分来自use-package官方建议)
(eval-and-compile
(setq use-package-always-ensure t) ;不用每个包都手动添加:ensure t关键字
(setq use-package-always-defer t) ;默认都是延迟加载,不用每个包都手动添加:defer t
(setq use-package-always-demand nil)
(setq use-package-expand-minimally t)
(setq use-package-verbose t))
更换个主题
(use-package gruvbox-theme
:init (load-theme 'gruvbox-dark-soft t))
(use-package smart-mode-line
:init
(setq sml/no-confirm-load-theme t)
(setq sml/theme 'respectful)
(sml/setup))
工程化管理配置
-
lisp/init-elpa.el用于存放Elpa和Package初始化
-
lisp/init-package.el用于存放安装的扩展
-
lisp/init-ui.el用于存放界面主题相关配置
-
先设置加载的目标目录到 load-path 中。
(add-to-list 'load-path (expand-file-name (concat user-emacs-directory "lisp")))
-
各个文件通过 provide 暴露对外调用的名称。如:
(provide 'init-ui)
-
然后在 init.el 文件中通过 require 调用:
require 'init-ui
-
关于自定义的配置
建议写入一个单独的文件,对外开源的时候,该文件不被提交到Git中。如,custom.el(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
-
后面的部分配置会因操作系统不同而产生不同配置代码,所以有必要对操作系统进行判断。
(defconst *is-mac* (eq system-type 'darwin)) (defconst *is-linux* (eq system-type 'gnu/linux)) (defconst *is-windows* (or (eq system-type 'ms-dos) (eq system-type 'windows-nt)))
-
通过修改字体解决Windows上Emacs的卡顿:
(use-package emacs :if (display-graphic-p) :config ;; Font settings (if *is-windows* (progn (set-face-attribute 'default nil :font "Microsoft Yahei Mono 9") (dolist (charset '(kana han symbol cjk-misc bopomofo)) (set-fontset-font (frame-parameter nil 'font) charset (font-spec :family "Microsoft Yahei Mono" :size 12)))) (set-face-attribute 'default nil :font "Source Code Pro for Powerline 11")))
-
一点启动配置:
设置系统的编码,避免各处的乱码。(prefer-coding-system 'utf-8) (set-default-coding-systems 'utf-8) (set-terminal-coding-system 'utf-8) (set-keyboard-coding-system 'utf-8) (setq default-buffer-file-coding-system 'utf-8)
设置垃圾回收阈值,加速启动速度。
(setq gc-cons-threshold most-positive-fixnum)
-
测试启动耗时:
通过 benchmark-init 包进行启动耗时的测量:(use-package benchmark-init :init (benchmark-init/activate) :hook (after-init . benchmark-init/deactivate))
小TIPS:
-
中断命令输入:
C-g在输入任何命令的时候,可随时通过该快捷键放弃命令的继续键入。 -
用y/n来代替yes/no:
(use-package emacs :config (defalias 'yes-or-no-p 'y-or-n-p))
-
行号配置:
(use-package emacs :config (setq display-line-numbers-type 'relative) (global-display-line-numbers-mode t))
文本编辑
- 文本编辑之选中/复制/剪切/粘贴:
- 复制 M-w
- 剪切 C-w
- 粘贴 C-y ;; 速记 Yank
- 文本编辑之删除
-
场景一:从光标位置到行尾的删除 C-k
-
场景二:删除当前行
默认没有这样的快捷键,可以安装一个扩展来实现,crux,该扩展提供了包含该场景在内的一系列优化快捷命令。(use-package crux :bind ("C-c k" . crux-smart-kill-line))
-
场景三:一次性删除到前/后面的第一个非空字符(删除连续的空白)
(use-package hungry-delete :bind (("C-c DEL" . hungry-delete-backward) ("C-c d" . hungry-delete-forward)))
-
文本编辑之行/区域上下移动
(use-package drag-stuff :bind (("<M-up>". drag-stuff-up) ("<M-down>" . drag-stuff-down)))
-
文本编辑之强化搜索
(use-package ivy :defer 1 :demand :hook (after-init . ivy-mode) :config (ivy-mode 1) (setq ivy-use-virtual-buffers t ivy-initial-inputs-alist nil ivy-count-format "%d/%d " enable-recursive-minibuffers t ivy-re-builders-alist '((t . ivy--regex-ignore-order)) (ivy-posframe-mode 1))) (use-package counsel :after (ivy) :bind (("M-x" . counsel-M-x) ("C-x C-f" . counsel-find-file) ("C-c f" . counsel-recentf) ("C-c g" . counsel-git))) (use-package swiper :after ivy :bind (("C-s" . swiper) ("C-r" . swiper-isearch-backward)) :config (setq swiper-action-recenter t swiper-include-line-number-in-search t))
-
文本编辑之自动补全
(use-package company :config (setq company-dabbrev-code-everywhere t company-dabbrev-code-modes t company-dabbrev-code-other-buffers 'all company-dabbrev-downcase nil company-dabbrev-ignore-case t company-dabbrev-other-buffers 'all company-require-match nil company-minimum-prefix-length 2 company-show-numbers t company-tooltip-limit 20 company-idle-delay 0 company-echo-delay 0 company-tooltip-offset-display 'scrollbar company-begin-commands '(self-insert-command)) (push '(company-semantic :with company-yasnippet) company-backends) :hook ((after-init . global-company-mode)))
-
文本编辑之顺序更换
光标前后两个字符互换 C-t
光标前后两个单词互换 M-t -
文本编辑之字数统计
- 整个Buffer统计:
M-=
;; 或者
M-x count-words-region - 选中区域统计:
;; 先选中
M-x count-words
- 整个Buffer统计:
-
Emacs常用插件
-
crux优化Emacs常用操作
(use-package crux :bind (("C-a" . crux-move-beginning-of-line) ("C-c ^" . crux-top-join-line) ("C-x ," . crux-find-user-init-file) ("C-c k" . crux-smart-kill-line)))
-
Which-Key快捷键
当你按下一个按键时,它会提示你下一个按键的含义。并等待你去按下。(use-package which-key :defer nil :config (which-key-mode))
-
Emacs窗口管理
-
窗口管理之Buffer管理
Buffer切换: C-x b
杀死当前Buffer: C-x k
批量管理Buffer:C-x C-b ;; 进入Buffer列表 d ;; 标记删除 u ;; 取消当前行标记 U ;; 取消全部标记 x ;; 执行操作 ? ;; 查看按键帮助
-
窗口管理之MiniBuffer交互优化
显示在左下角的MiniBuffer移动视线范围大,移动到中央位置,更合适一些。(use-package ivy-posframe :init (setq ivy-posframe-display-functions-alist '((swiper . ivy-posframe-display-at-frame-center) (complete-symbol . ivy-posframe-display-at-point) (counsel-M-x . ivy-posframe-display-at-frame-center) (counsel-find-file . ivy-posframe-display-at-frame-center) (ivy-switch-buffer . ivy-posframe-display-at-frame-center) (t . ivy-posframe-display-at-frame-center)))
-
窗口管理之分屏
开启横向分屏 C-x 3
开启纵向分屏 C-x 2
只保留当前分屏 C-x 1
关闭当前分屏 C-x 0 -
窗口管理之分屏宽度调整
增加高度 C-x ^
增加/减少宽度 C-x { C-x } -
窗口管理之快速切换分屏
默认可通过以下快捷键进行窗口的循环跳转: C-x o -
窗口管理之Tab标签页管理
C-x t 2 ;; 新建Tab
1 ;; 关闭其它Tab
0 ;; 关闭当前Tab
b ;; 在新Tab中打开Buffer
编程语言环境配置
Language Server Protocol Support for Emacs
Languages: Some languages have to be installed manually. Others can be installed with M-xlsp-install-server.