Emacs学习
- Emacs学习
- 1、Emacs简介与配置
- 2、Emacs文本编辑器
- 3.Emacs常用的插件
- 4.Emacs窗口管理
- 4、编程语言环境的配置
Emacs学习
1、Emacs简介与配置
- windows安装:choco install emacs
- linux安装:sudo apt install emacs
- macos安装 brew install emacs
- 官网安装
1.1、Emacs版本
最新版本(2020年3月):26.3
即将发布版本:27
开发中不稳定的版本:28
查看版本命令
#windows
scoop info emacs
#linux
apt info emacs
dnf info emacs
#macOS
brew cask info emacs
启动Emacs,然后查看版本。
M-x emacs-version
1.2、初识Emacs
- 菜单栏
- 工具栏
- 编辑栏(buffer)
- 状态栏
- 交互区域(命令和反馈区域)(mini buffer)
1.3 基本操作速记
- C:代表CTRL键
- M:代表Meta键,往往是ALT(部分键盘是ESC)
光标移动
- 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-<:回到编辑区域最开始的位置(速记:<)
- C-v:向下翻一屏
- M-v:向上翻一屏
1.4、自带文档
C-h t //速记Help Tutorial
C-h k //查看快捷键的含义
C-h f //查看函数的定义及快捷键的绑定
1.5、对外观的做点改变
M-x customize //图形话配置
- 菜单栏 menu-bar-mod
- 工具栏 tool-bar-mod
- 滚动条 scroll-bar-mod
1.6、配置文件配置环境
在用户目录下创建.emacs配置文件,写入配置内容
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
1.7、认识配置文件
Emacs配置文件的位置,会按照以下顺序查找
- ~/.emacs
- ~/.emacs.d (这个更适合工程配置)
- ~/.config/emacs/init.el (>=27的版本,会优先载入这个配置文件)
1.8、为什么用大牛配置
- 大牛的配置
- Spacemacs
- Centaur Emacs
- Doom Emacs
- Steve Purcell
- redguardetoo(陈斌 一年成为Emacs高手作者)
- …
- 当然建议用大牛配置
- 兼容性好
- 代码质量高
- 功能齐全
- 开箱即用
- 为什么开始学习时不用
- 体验配置Emacs
- 对Emacs工作多一些了解
- 体验大牛成长的过程
- 追求轻量,追求速度,追求新
- 其他配置
1.9、软件源
- 什么是软件源:扩展Emacs的插件程序地址
- 为什么要改国内的软件源:国外的很多不能连接,速度也很慢
(setq package-archives '(("gnu" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
("melpa" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")
("org" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/org/")))
1.10、安装第一个emacs扩展
安装扩展前,需要先刷新软件源的索引
(setq package-check-signature nil);个别时候会出现签名失败
(require 'package)
;;初始化高管理器
(unless (bound-and-true-p package--initialized)
(package-initialize))
;;刷新软件源索引
(unless package-archive-contents
(pakage-refresh-contents))
(unless (package-installed-p 'use-package)
(package-refresh-contents)
(package-install 'use-package))
1.11、使用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);基本二配置参数
:bing ;快捷键的绑定
:hook) ;hook模式的绑定
建议添加的配置(部分来自use-package官方建议):
(eval-and-compile
(setq use-package-always-ensure t) ;不用每个包都手动添加:ensure t关键字
(setq use-package-always-defer t) ;默认都是要延迟加载,不用每个都添加
(setq use-package-always-demand nil)
(setq use-package-expand-minimally t)
(setq use-package-verbose t)) ;通过log打印出来安装内容
1.12、更换主题
改变主题
(use-package gruvbox-theme
:init(load-theme 'gruvbox-dark-soft t))
顺便配置一个好看的Mode LIne
(use-package smart-mode-line
:init
(setq sml/no-confirm-load-theme t)
(setq sml/theme 'respectful)
(sml/setup))
1.13、工程化管理配置功能拆分
在~/.emacs中配置了很多内容,开始显得很混乱
- 初始化Elpa
- 安装扩展
- 添加主题
是时候分类处理。尝试把配置按照功能不同拆分不同得文件。如
- 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 usr-emacs-directory "lisp")))
各个文件通过provide暴露对外调用得名称
(provide 'init-ui)
然后在init.el文件中通过require调用
require 'init-ui
1.14、关于自定义的配置
建议写入一个单独得文件,对外开源得时候,该文件不被提交到Git中。如,custom.el
(setq custom-file(expand-file-name "custom.el" user-emacs-directory))
1.15、操作系统的判断
不同系统产生不同配置代码
(defconst *is-mac* (eq system-type 'darwin))
(defconst *is-linux* (eq system-type 'gnu/linux))
(defconst *is-windows* (or (eq system-type 'ms-doc)(eq system-typ 'windows-nt)))
1.16、macos平台command键映射为Meta
(when *is-mac*
(setq mac-command-modifier 'meta)
(setq mac-option-modifier 'none))
1.17、通过修改字体解决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")))
1.18、建议增加的一点启动配置
设置系统的编码,避免各处的乱码。
(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)
1.19、测试启动耗时
通过benchmark-init包进行启动耗时的测量。
(use-package benchmark-init
:init (benchmark-init/activate)
:hook (after-init . benchmark-init/deactivate))
M-x benchmark-init/show-durations-tree
;; or
M-x benchmark-init/show-durations-tabulated
1.20、中断命令输入
C-g ;;中断当前输入,放弃已经输入的。
1.21、用y/n代替yes/no
(defalias 'yes-or-no-p 'y-or-n-p)
为了项目管理的统一化,可以用如下use-package写法:
(use-package emacs
:config (defalias 'yes-or-no-p 'y-or-n-p))
1.22、显示行号
1.22.1、行号的类型
从Emacs 26开始,自带行号的显示功能,可以通过设置display-line-numbers-type变量的值,来改变行号的类型。
- relative,相对行号
- visual,可视化行号
- t,绝对行号
1.22.2、行号配置
(setq display-line-numbers-type 'relative)
(global-display-line-numbers-mode t)
直接跳转相对行号
C-u 11(相对行号) C-n(向下).
C-u 11(相对行号) C-p(向上)
windows开启行号闪烁的解决方法,不开启行号
(setq display-line-numbers-type 'relative)
(unless *is-windows*
(global-display-line-numbers-mode t))
2、Emacs文本编辑器
2.1、文本编辑之选中、复制、剪切、粘贴
选中
- 方法一,使用鼠标拖动选中
- 方法二,标记开始的位置,然后通过移动光标到结束的位置
- 默认使用C-SPC或C-@进行开始位置的标记
- 对于很多场景下,C-SPC快捷键被占用(输入法,Spotlight等)
M-w ;;复制
C-w ;;剪切
C-y ;; Yank 粘贴
2.2、文本编辑之删除
从光标当天的位置删除到结束
C-k
删除当前行
(use-package crux
:bind ("C-c k" . crux-smart-kill-line))
C-c k ;;删除当前行
一次性删除多个前面或者后面的非空白字符(连续空行)
(use-package hungry-delete
:bind (("C-c DEL" . hungry-delete-backward));;DEl表示退格键
:bind (("C-c d" . hungry-delete-forward)))
C-c d ;;当前行后
C-c <- ;;当前行前
2.3、文本编辑之行/区域上下移动
(use-package drag-stuff
:bind (("<M-up>" . drag-stuff-up)
("<M-down>" . drag-stuff-down)))
2.4、文本编辑之原生搜索/替换
Emacs原生提供的最强大的功能
;; 当前位置到文档结尾的搜索
C-s
;; 当前文职到文档开始的搜索
C-r
;; 替换
M-%
;;按y确认替换,n就是跳过替换,!全部替换。
2.5、文本编辑之强化搜索
著名的ivy-counsel-swiper三剑客,就是为了强化搜索(同时优化了一系列Minibuffer操作)
(use-package ivy
:defer 1
:demand
:hook (after-init . ivy-mode)
:config
(ivy-mode 1)
(setq ivy-use-virtual-buffert t
ivy-initial-inputs-alist nil
ivy-count-format "%d/%d "
enable-recursive-minibuffers t
ivy-re-builders-alist '((t . ivy--regex-ignore-order))))
(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))
2.6、文本编辑之自动补全
Emacs界有两大补全插件,Auto-Complete和Company(Complete Anything)
(use-package company
:diminish (company-mode " Cmp.")
:defines (company-dabbrev-ignore-case company-dabbrev-downcase)
:hook (after-init . global-company-mode)
: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 1
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))
(eval-after-load 'company
'(add-to-list 'company-backends
'(company-abbrev company-yasnippet company-capf))))
2.7、文件编辑之语法检查
默认Emacs自带Flymake,但Flycheck是一个更优的方案。
(use-package flycheck
:hook (after-init . global-flycheck-mode))
编程模式启动下
(use-package flycheck
:hook (prog-mode . flycheck-mode))
2.8、文本编辑之行排序
M-x sort-lines ;;按第一个字符排序
2.9、文本编辑的顺序更换
C-t ;;光标前后两个字符互换
M-t ;;光标前后两个单词互换
2.10、文本编辑字数统计
整个Buffer统计
M-= ;;光标放到文档后面,方法一
M-x count-words-regin ;;方法二
2.11、区域统计
;;先选中
M-= ;;方法一
M-x count-words ;;方法二
3.Emacs常用的插件
3.1、curx优化Emacs常用操作
- 优化版的回到行首
- 快速打开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-S-d" . crux-duplicate-current-line-or-region)
("C-S-k" . crux-smart-kill-line)))
3.2、如何记忆越来越长的快捷键
which-key可以在你按下一个按钮时,它会提示你下一个按钮的含义,并等待你去按下。
(use-package which-key
:defer nil
:config (which-key-mode))
4.Emacs窗口管理
4.1、窗口管理之Buffer管理
C-x b ;;Buffer切换
C-x k ;;杀死当前的Buffer
;;批量管理Buffer
C-x C-b ;;进入Buffer列表
d ;; 标记删除
u ;; 取消当前行标记
U ;; 取消全部的标记
x ;; 执行操作
? ;; 查看帮助
4.2、窗口管理之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))))
4.3、窗口管理之分屏
C-x 3 ;;横向分屏
C-x 2 ;;纵向分屏
C-x 1 ;;只保留当前
C-x 0 ;;关闭当前分屏
4。4、窗口管理之分屏宽度调整
C-x ^ ;;增加高度
C-x { ;; 增加宽度
C-x } ;; 减少宽度
C-u 10 C-x } ;;连续10此变换
4.5、窗口管理之快速切换分屏
默认可通过快捷键进行窗口跳转:
C-x o
多个分屏用插件ace-window
(use-package ace-window
:bind(("M-o" . 'ace-window'))
- x - delete window
- m -swap window
- M - move window
- c - copywindow
- j - select buffer
- n - select the previous window
- u - select buffer in the other window
- c - split window fairlym, either vertically or horizontally
- v - split window vertically
- b -split window horizontally
- o - maximize current window
- ? - show there commadn bindings
4、编程语言环境的配置
4.1、编程语言环境配置之LSP
LSP 是Language Server Protcol
微软LSP地址 (需要外网)
emacs Lsp地址(需要外网)
(use-package lsp-mode
;; add prog-mode to lsp instead of adding one by one
;; :hook ((prog-mode . (lsp-deferred))
:commands (lsp lsp-deferred)
:hook ((lsp-mode . lsp-enable-which-key-integration)
(python-mode . lsp-deferred)
(c-mode . lsp-deferred)
(go-mode . lsp-deferred)
(java-mode . lsp-deferred)
(js-mode . lsp-deferred)
(rust-mode . lsp-deferred)
(web-mode . lsp-deferred)
(vue-mode . lsp-deferred)
(html-mode . lsp-deferred))
:init (setq lsp-keep-workspace-alive nil ;; Auto kill LSP server
lsp-enable-indentation t
lsp-enable-on-type-formatting t
lsp-auto-guess-root nil
lsp-enable-snippet t
lsp-modeline-diagnostics-enable t
lsp-modeline-diagnostics-scope :workspace ;; workspace/global/file
lsp-idle-delay 0.500
lsp-completion-provider :capf)
:config
;; Configure LSP Clients
(use-package lsp-clients
:ensure nil
:functions (lsp-format-buffer lsp-organize-imports)))
有时候正确好装package,需要手动安装
M-x list-packages ;;打开插件列表
C-s ;;搜索插件
;;选择相应的插件手动安装
4.1.1、python语言的配置
安装python插件,就可以提供提示功能
sudo pip3 install python-lanuage-server