Emacs学习

Emacs学习

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

emacs启动

  1. 菜单栏

菜单栏

  1. 工具栏

工具栏

  1. 编辑栏(buffer)

编辑栏

  1. 状态栏

状态栏

  1. 交互区域(命令和反馈区域)(mini buffer)

交互区域

1.3 基本操作速记

  1. C:代表CTRL键
  2. 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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值