该怎么说呢,很早就下载了这个操作系统(编辑器)了,一年前(2019)在看SICP的时候就有想法用emacs写scheme,但是由于配置过于复杂,还是选择了用vscode进行编辑。然后中间因为一些其他的事情停止了对SICP的学习,总共四章的内容也只看了两章多,这次放假希望一次性把emacs配置好再把SICP看完吧。接下来将介绍我的emacs配置过程。
快捷键的使用
C 即 Control , M 即 Alt (至少在我的键盘上是这样的)
C - x , C - s
对当前文档进行保存
C - x, C - c
关闭当前程序
C - x, C - f
输入文件名,emacs会搜索文件并打开
M - x
输入具体操作(这个比较类似 sublime 和 vscode 里面的C - p
)
C - w
剪切
M - w
复制
C - y
粘贴
M - y
在按下C - y
后,按此键,切换粘贴的内容
C - /
撤销
C - g
中断当前命令输入
C - s
或者C - r
搜索(方向不同)
配置文件
在emacs 27以前的版本通常是在”.emacs”这个文件里进行修改的,具体操作是M - x
后,输入.emac回车,就可以进入配置文件了。
关闭滚动条与工具栏
(scroll-bar-mode -1)
关闭滚动条
(tool-bar-mode -1)
关闭工具栏
添加国内源
这个设置和Linux系统下的添加镜像源的操作如出一辙。
;; add tinghua resource
(setq package-archives '(("gnu" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
("org" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/org/")
("melpa" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")))
(package-initialize) ;; You might already have this line
包管理器的初始化、刷新、安装
;; package initialize
(setq package-check-signature nil)
(require 'package)
(unless (bound-and-true-p package--initialized)
(package-initialize))
;; refresh resource
(unless package-archive-contents
(package-refresh-contents))
;; use-package
(unless (package-installed-p 'use-package)
(package-refresh-contents)
(package-install 'use-package))
unless
语句即如果没有进行(…)那么就进行(…)。
使用use-package管理扩展
最基本的格式
(use-package restart-emacs)
M-x
后输入restart-emacs
,emacs就会重启了。
常用格式
;; 常用格式
(use-package smooth-scrolling
: ensure t; 是否一定要确保已安装
: defer nil ;是否延迟加载
: init (setq smooth-scrolling-margin 2) ;初始化参数
: config (smooth-scrolling-mode t) ;基本配置参数
: bind ;快捷键绑定
: hook ;hook模式的绑定)
推荐添加的配置
(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 安装
;; install a theme
;;(use-package gruvbox-theme
;; :init(load-theme 'gruvbox-dark-soft t))
通过他人编写的文件安装
在这个开源项目(https://github.com/belak/emacs-monokai-pro-theme )中找到了合适版本的emacs配色,然后根据README.md的教程完成。
将monokai-pro-theme.el文件放入.emacs.d/themes/中
然后执行M-x package-install monokai-pro-theme
将(load-theme 'monokai-pro t)
添加到配置文件,重启后就可以看见主题更改了。
;; use monokai
(load-theme 'monokai t) ;; or (load-theme 'monokai-pro t)
更换一个更加优雅的状态栏
;; an elegent mode-line
(use-package smart-mode-line
:init
(setq sml/noconfir-load-theme t
sml/theme 'respectful)
(sml/setup))
显示行标
(global-linum-mode t)
工程化管理配置
由于将所有的配置都写到.emacs里会使整个文档看起来很凌乱,于是就需要将不同方面(ui界面,use-package管理等)的配置代码区分开来。
于是不妨新建一个文件夹/.emacs.d/lisp/里面专门存放配置文件。并且根据配置的不同方向,命名如下:
- init-elpa.el 存放镜像源相关配置
- init-package.el 存放包管理器的相关配置u
- init-startup.el emacs启动时运行的一些代码(关闭工具栏和滚动条等)
- init-ui.el 界面的主题和字体等配置
比如目前我的init-ui.el是这样的
;; install a theme
;;(use-package gruvbox-theme
;; :init(load-theme 'gruvbox-dark-soft t))
;; use monokai
(load-theme 'monokai t) ;; or (load-theme 'monokai-pro t)
;; an elegent mode-line
(use-package smart-mode-line
:init
(setq sml/noconfir-load-theme t
sml/theme 'respectful)
(sml/setup))
;; show the line number
(global-linum-mode t)
;; make the background transparent
(set-frame-parameter (selected-frame) 'alpha (list 85 60))
(add-to-list 'default-frame-alist (cons 'alpha (list 85 60)))
(put 'downcase-region 'disabled nil)
(provide 'init-ui)
(provide 'init-ui)
在这里是将init-ui
暴露的意思,后续的require
会根据是否暴露来找到配置文件。
将所有的配置往/.emacs.d/目录下的init.el文件里迁移。
(add-to-list 'load-path
(expand-file-name(concat user-emacs-directory "lisp")))
(require 'init-startup)
(require 'init-elpa)
(require 'init-ui)
(require 'init-package)
load-path
是一个list
,需要将配置添加进去。
expand-file-name
将后面的两个字符串拼接成一个目录,concat
是拼接的意思,user-emacs-directory
系统的全局变量,寻找emacs的目录,即/.emacs.d/这个目录。
诸如(require 'init-startup)
require和provide是配对的,调用之前配置好的init-startup
。
这些都配置好了以后就可以把.emacs文件删了。
关于自定义配置
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
通过这个命令可以将一些自定义配置(诸如鼠标点击的)后系统生成的文字,保存到custom.el里面。
通过这个方法可以使得init.el文件看上去并不是那么凌乱了。
(when (file-exits-p custom-file)
(load-file custom-file))
系统可能不会自动加载custom里面的配置,这里的代码意思是当发现custom-file文件存在是就自动加载。
启动配置
(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)
控制垃圾回收阈值,满了再回收。
代码补全
使用company插件
(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))))