第253页图灵笔记,2020 –

原始视频地址:www.bilibili.com/video/BV13g…

Emacs初体会

教程简介

开端视频版别的理念(其间带*的也是文字版的理念):

  • *带领知道Emacs这款传说中的编辑器
  • 每节课五分钟左右,没有废话,干货
  • *每节课一个技巧或知识点,轻松学习
  • *对笔者也是个学习的进程,共同进步
  • *新手视角,向老鸟学习,向高手迈进

Emacs简介

  • 解说的版别是GNU Emacs,非其他的衍生版别
  • GNU Emacs于1984年,Richard Stallman主张并保护
  • GNU尖端项目
  • 竞争对手VIM,VSCode等
  • 跨渠道,内核解释器C写成,经过ELisp言语进行扩展

Emacs装置

Windows

主张运用ScoopChocolatey等包办理器装置。

scoop bucket add extras
scoop install emacs
choco install emacs

或许也能够直接在Emacs官网进行下载解压运用。

www.gnu.org/software/em…

或许下载测试版(版别比较新,其实功用也挺安稳):alpha.gnu.org/gnu/emacs/p…

Linux

主张运用分发版自带的包办理器进行装置,如:

# Ubuntu / Debian
sudo apt install emacs
# Fedora
sudo dnf install emacs
# Arch
sudo pacman -S emacs

或许也能够经过官网下载源代码编译装置。

www.gnu.org/software/em…

macOS

主张运用Homebrew包办理器进行装置。

brew install --cask emacs

或许也能够在官网经过下载后拖动到Applications目录中即可运用。

www.gnu.org/software/em…

Emacs版别

截止到本文编写的时分:

  • 最新版别:28.1 (2022年4月4日)
  • 开发中不安稳版别:29.0.50

开端的教程以27.2为演示版别,一起兼容28/29版别(所以在运用本教程的时分,完全能够直接运用最新的28.1)。装置前可检查包办理器装置的是否是对应版别。

注:随着时刻的推移,笔者从2022年头开端将版别普遍提高到了28.1+。

# Windows
scoop info emacs
# Linux
apt info emacs
dnf info emacs
# macOS
brew info emacs

发动Emacs,然后检查版别。 M-x emacs-version

或许在指令行中检查版别。 emacs –version

Emacs初识

Emacs高手修炼手册(v1.0,2022)
绿色:菜单栏

赤色:工具栏

黄色:编辑区域

蓝色:状态栏

紫色:交互区域(输出信息,M-x操作等)

根本操作速记

别太多,先学习一点点光标的移动。

  • 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 – <,回到编辑区域最开端方位(速记:<)
  • M – >,去往编辑区域最终的方位(速记:>)
  • C-v,向下翻一屏
  • M-v,向上翻一屏

自带文档

C-h t ;速记 Help Tutorial

检查方便键的意义:

C-h k ;速记 Help Keybind

检查函数的界说以及方便键绑定:

C-h f ;速记 Help Function

对外观做点改动

图形化装备 M-x customize

  • 菜单栏 menu-bar-mode
  • 工具栏 tool-bar-mode
  • 滚动条 scroll-bar-mode

体会下用装备文件装备

创建文件 ~/.emacs 并写入一下内容:

(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)

重启Emacs看看实际的作用。

Emacs装备初体会

知道装备文件

Emacs装备文件的方位,会按照一下次序去查找:

  1. ~/.emacs
  2. ~/.emacs.d
  3. ~/.config/emacs/init.el

榜首个是一个单一文件装备;第二个更符合工程化;第三个仅适用于≥27的版别。

教程会从榜首个下手,逐渐变为第二种的模式。

为什么不必大牛装备

  • 大牛装备有哪些
  1. Spacemacs
  2. Centaur Emacs
  3. Doom Emacs
  4. Steve Purcell
  5. redguardtoo(陈斌,一年成为emacs高手作者)
  6. ……
  • 我的主张
  1. 当然主张用大牛装备,大牛的装备是最优,并且经历了时刻和项目考验的,就算你将来不日常运用,学习价值也十分大。
  2. 为什么不必:你一定是经历了很长的运用后才该有这样的想法,想学习,想装备,了解了Emacs后想打造一些属于自己的东西的时分。并且强烈主张你以大牛的装备为基础进行增减。

我的装备 github.com/cabins/emac…

榜首行emacs装备代码

现已体会了关掉菜单栏、工具栏、滚动条等。现在尝试关掉发动界面:

(setq inhibit-startup-screen t)

重启Emacs看看?

软件源

  • 什么是软件源,你装置第三方插件的来历(或许叫插件源更合理?)。
  • 为什么要用软件源,不同的软件源有不同的软件包,所以为了找到更多的需求的包。
  • 为什么要改成国内的软件源,有些软件源或许无法访问,有些软件源在国内衔接的时分或许速度不理想。
(setq package-archives
      '(("melpa" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")
        ("gnu" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
        ("org" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/org/")))

装置榜首个emacs扩展

装置扩展前,需求先改写软件源的索引。

;;个别时分会出现签名检验失败
(setq package-check-signature nil) 
;; 初始化软件包办理器
(require 'package)
(unless (bound-and-true-p package--initialized)
    (package-initialize))
;; 改写软件源索引
(unless package-archive-contents
    (package-refresh-contents))
;; 榜首个扩展插件:use-package,用来批量统一办理软件包
(unless (package-installed-p 'use-package)
    (package-refresh-contents)
    (package-install 'use-package))

运用use-package办理扩展

  • 什么是use-package
  • 怎么用

最简练的格式

(use-package restart-emacs)

常用的格式

(use-package SOME-PACKAGE-NAME
             :ensure t ; 是否一定要确保已装置
             :defer t ; 是否要推迟加载,许多时分能够加快Emacs的发动速度
             :init (setq ...) ; 初始化装备
             :config (...) ; 初始化后的根本装备参数
             :bind (...) ; 方便按键绑定
             :hook (...) ; hook的绑定
             )

主张添加的装备:

;; `use-package-always-ensure' 防止每个软件包都需求加 ":ensure t"
;; `use-package-always-defer' 防止每个软件包都需求加 ":defer t" 
(setq use-package-always-ensure t
      use-package-always-defer t
      use-package-enable-imenu-support t
      use-package-expand-minimally t)

替换个主题

开端教程演示采用的主题是 gruvbox-theme

(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
        sml/theme 'respectful)
  (sml/setup))

但后来我仍是倾向于运用内置的modus主题(28+),审美这东西,仍是看你自己的喜好。

工程化办理装备(1)功用拆分

到此为止,在~/.emacs 中装备了许多的内容,开端显得很乱:

  • 初始化Elpa
  • 装置扩展
  • 添加主题

是时分分类处理了。就像一个开发项目那样。尝试着把装备按照功用不同拆分成不同的文件。如:

  • lisp/init-elpa.el用于寄存Elpa和Package初始化
  • lisp/init-package.el用于寄存装置的扩展
  • lisp/init-ui.el用于寄存界面主题相关装备
  • 如安在初始化文件中把它们联系在一起(调用)?

工程化办理装备(2)文件加载与调用

先设置加载的目标目录到 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的判别还能够放的宽一点:

(defconst *is-windows* (memq system-type '(ms-dos windows-nt cygwin)))

macOS渠道将Command键映射为Meta

对于Mac键盘来说,Command键距离x的方位与Windows键盘更附近,所以习惯上能够修正这个按键映射为Meta,假如你不需求这个设置,能够不必管。

(when *is-mac* (setq mac-command-modifier 'meta)
               (setq mac-option-modifier 'none))

经过修正字体解决Windows上Emacs的卡顿

计划是修正字体,开端的版别中我会主张你这样修正字体:

Emacs高手修炼手册(v1.0,2022)

现在的计划中我会引荐你这样修正字体:

(defvar cn-fonts-list '("黑体" "STHeiti" "微软雅黑" "文泉译微米黑")
  "界说运用的中文字体候选列表.")
(defvar en-fonts-list '("Cascadia Code" "Courier New" "Monaco" "Ubuntu Mono")
  "界说运用的英文字体候选列表.")
(defvar emoji-fonts-list '("Apple Color Emoji" "Segoe UI Emoji" "Noto Color Emoji" "Symbola" "Symbol")
  "界说运用Emoji字体候选列表.")
;;;###autoload
(defun tenon--font-setup ()
  "Font setup."
  (interactive)
  (let* ((cf (tenon--available-font cn-fonts-list))
	     (ef (tenon--available-font en-fonts-list))
         (em (tenon--available-font emoji-fonts-list)))
    (when ef
      (dolist (face '(default fixed-pitch fixed-pitch-serif variable-pitch))
	    (set-face-attribute face nil :family ef)))
    (when em
      (dolist (charset `(unicode unicode-bmp ,(if (> emacs-major-version 27) 'emoji 'symbol)))
        (set-fontset-font t charset em nil 'prepend)))
    (when cf
      (dolist (charset '(kana han cjk-misc bopomofo))
	    (set-fontset-font t charset cf))
      (setq face-font-rescale-alist
	        (mapcar (lambda (item) (cons item 1.2)) `(,cf ,em))))))

你能够在你的custom.el中设置cn-fonts-list来自界说字体,而不需求改写装备代码,装备中的字体仅做兜底运用。

主张添加的一点发动装备

设置系统的编码,防止各处的乱码。我开端的教程中是主张你这样写:

(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)

其实,最新的装备里边我会引荐你这样写。这两行代码足够了。

(prefer-coding-system 'utf-8)
(unless *is-windows*
    (set-selection-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))

发动完成后能够履行:

M-x benchmark-init/show-durations-tree 或许 M-x benchmark-init/show-durations-tabulated来检查发动的耗时细节。

中止指令输入

C-g在输入任何指令的时分,可随时经过该方便键抛弃指令的持续键入。

用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))

显现行号

行号的类型

从Emacs 26开端,自带了行号显现功用,能够经过设置display-line-numbers-type变量的值,来改动行号的类型。可取值有:

  • relative,相对行号
  • visual,可视化行号
  • t

行号装备(不一定非要用use-package,只保存config后边两行即可)

(add-hook 'prog-mode-hook 'display-line-numbers-mode)

Emacs文本编辑

文本编辑之选中/复制/剪切/张贴

选中

  • 方法一,运用鼠标拖动选中
  • 方法二,标记开端方位,然后经过移动光标到结束方位

复制 M-w

剪切 C-w

张贴 C-y ;; 速记 Yank

文本编辑之删去

场景一:从光标方位到行尾的删去

C-k

场景二:删去当时行

我开端的视频教程中以为默许没有这样的方便键,能够装置一个扩展来完成,crux,该扩展供给了包含该场景在内的一系列优化方便指令。

(use-package crux
             :bind ("C-c k" . crux-smart-kill-line))

但其实是有这样的方便按键的,C-S-<Backspace> (kill-whole-line)。

场景三:一次性删去到前/后边的榜首个非空字符(删去连续的空白)

经过hungry-delete扩展完成,该功用。

(use-package hungry-delete
  :bind (("C-c DEL" . hungry-delete-backward)
         ("C-c d" . hungry-delete-forward)))

文本编辑之行/区域上下移动

在VSCode或Jetbrains宗族的编辑器中,上下移动行/块是十分简单的,但原生的Emacs没有供给这样的功用。可经过插件drag-stuff来辅助完成。

(use-package drag-stuff
             :bind (("<M-up>" . drag-stuff-up)
                    ("<M-down>" . drag-stuff-down)))

或许运用move-dup插件:

(use-package move-dup
             :hook (after-init . global-move-dup-mode))

文本编辑之原生查找/替换

Emacs原生供给了强大的查找和替换功用。

  • 当时方位到文档结尾的查找 C-s

  • 当时方位到文档开端的查找 C-r

  • 替换 M-%

替换时按下y确认替换,n越过本处的替换,!悉数替换。

文本编辑之强化查找

著名的ivy-counsel-swiper三剑客,便是为了强化查找(一起优化了一系列Minibuffer的操作)。

Emacs高手修炼手册(v1.0,2022)

文本编辑之主动补全

Emacs界补全两大独占插件,Auto-Complete和Company(Complete Anything)。时代和特性原因,Company出现压倒性优势。

我最早的代码主张你这样写:

Emacs高手修炼手册(v1.0,2022)

最新的代码我会主张你这样写:

(use-package company
  :hook (after-init . global-company-mode)
  :config (setq company-minimum-prefix-length 1
                company-show-quick-access t))

文本编辑之语法检查

开端的教程中我主张你运用Flycheck,而不是Flymake,受其他的大牛以及历史的影响。但如今我仍是主张你运用内置的Flymake,因为它现已十分好用了。

(use-package flymake
  :hook (prog-mode . flymake-mode)
  :config
  (global-set-key (kbd "M-n") #'flymake-goto-next-error)
  (global-set-key (kbd "M-p") #'flymake-goto-prev-error))

文本编辑之行排序

M-x sort-lines

文本编辑之次序替换

光标前后两个字符交换 C-t

光标前后两个单词交换 M-t

文本编辑之字数计算

整个Buffer计算

M-= 或许 M-x count-words-region

选中区域计算

先选中需求计算的区域,然后履行 M-x count-words

Emacs常用插件

crux优化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-c k" . 'crux-smart-kill-line)))

其实,快速回到行首这个功用我现在更引荐你运用C-a以及M-m。这样的方便按键既是内置,并且清晰。

如何回忆越来越长的方便键

假如你不喜爱用鼠标在菜单栏点击的化,你其实能够用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移动视野规模大,移动到中央方位,更适宜一些。

Emacs高手修炼手册(v1.0,2022)

窗口办理之分屏

开启横向分屏 C-x 3

开启纵向分屏 C-x 2

只保存当时分屏 C-x 1

封闭当时分屏 C-x 0

窗口办理之分屏宽度调整

添加高度 C-x ^

添加/削减宽度 C-x { C-x }

窗口办理之快速切换分屏

默许可经过以下方便键进行窗口的循环跳转: C-x o

当分屏许多的时分功率十分低。经过ace-window可快速进行窗口间的跳转。相似的插件较多,但该款为最佳计划。

(use-package ace-window
             :bind (("M-o" . 'ace-window)))

Emacs高手修炼手册(v1.0,2022)

窗口办理之Tab标签页办理

C-x t 后边持续输入

  • 2 ;; 新建Tab
  • 1 ;; 封闭其它Tab
  • 0 ;; 封闭当时Tab
  • b ;; 在新Tab中翻开Buffer

编程言语

eglot完成IDE

github.com/joaotavora/…

在Emacs编程的国际里,快速完成IDE,有两种计划,分别是这一节的eglot以及下一节的lsp-mode。关于两者的对比或许会形成十分大量的文字。此处我挑选几个典型的来说明一下:

  • eglot比较轻量级,lsp-mode相对比较重
  • eglot无第三方依靠,lsp-mode有十分多的第三方依靠
  • eglot完成的功用够用,但不丰厚;lsp-mode功用十分丰厚

所以两者我都会进行解说,运用哪个的选择权留给读者。

假如你仅仅想体会一下,其实能够经过 package-install 的方法装置eglot,然后进入到某一个编程言语的文件中,经过 M-x eglot来发动。而假如你像我相同喜爱它,则下面的装备供你参考。

(use-package eglot
  :hook ((c-mode
          c++-mode
          go-mode
          java-mode
          js-mode
          python-mode
          rust-mode
          web-mode) . eglot-ensure)
  :bind (("C-c e f" . #'eglot-format)
         ("C-c e a" . #'eglot-code-actions)
         ("C-c e i" . #'eglot-code-action-organize-imports)
         ("C-c e q" . #'eglot-code-action-quickfix))
  :config
  ;; (setq eglot-ignored-server-capabilities '(:documentHighlightProvider))
  (add-to-list 'eglot-server-programs '(web-mode "vls"))
  (defun eglot-actions-before-save()
    (add-hook 'before-save-hook
              (lambda ()
                (call-interactively #'eglot-format)
                (call-interactively #'eglot-code-action-organize-imports))))
  (add-hook 'eglot--managed-mode-hook #'eglot-actions-before-save))

上面是我的eglot的装备,添加了我日常运用的一些编程言语、方便按键以及一些主动格式化与主动保存/办理导入的包的装备。

留意:你一定要先装置对应的language-server,并装备好环境变量。例如对c/cpp来说就需求是ccls或许clangd,对于rust来说,就需求是rust-analyzer,对于go来说便是gopls。

lsp-mode完成IDE

lsp-mode的装备相对来说也差不多。可是它有十分丰厚的特性可装备。下图是一个比较简化的装备。

(use-package lsp-mode
  :commands (lsp lsp-deferred)
  :init
  (defun lsp-save-actions ()
    "LSP actions before save."
    (add-hook 'before-save-hook #'lsp-organize-imports t t)
	(add-hook 'before-save-hook #'lsp-format-buffer t t))
  :hook ((lsp-mode . #'lsp-enable-which-key-integration)
         (lsp-mode . #'lsp-save-actions)
         ((c-mode
           c++-mode
           go-mode
           java-mode
           js-mode
           python-mode
           rust-mode
           web-mode) . lsp-deferred))
  :config
  (setq lsp-auto-guess-root t
	    lsp-headerline-breadcrumb-enable nil
	    lsp-keymap-prefix "C-c l"
	    lsp-log-io nil)
  (define-key lsp-mode-map (kbd "C-c l") lsp-command-map))

更多的装备可参考官网:github.com/emacs-lsp/l…

相同的,你也需求提前装置好language-server并装备好环境变量。

由于lsp-mode的丰厚性,你还能够装置lsp-ui来提高图形操作的体会:

(use-package lsp-ui
    :after lsp-mode
    :init
    (setq lsp-ui-doc-include-signature t
	      lsp-ui-doc-position 'at-point
          lsp-ui-sideline-ignore-duplicate t)
    (add-hook 'lsp-mode-hook 'lsp-ui-mode)
    (add-hook 'lsp-ui-mode-hook 'lsp-modeline-code-actions-mode)
    :config
    (define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions)
    (define-key lsp-ui-mode-map [remap xref-find-references] #'lsp-ui-peek-find-references))

对于调试的场景,你还能够装置dap-mode以及对应的调试器来运用:

(use-package dap-mode
    :init
    (add-hook 'lsp-mode-hook 'dap-mode)
    (add-hook 'dap-mode-hook 'dap-ui-mode)
    (add-hook 'dap-mode-hook 'dap-tooltip-mode)
    ;;   (add-hook 'python-mode-hook (lambda() (require 'dap-python)))
    ;;   (add-hook 'go-mode-hook (lambda() (require 'dap-go)))
    ;;   (add-hook 'java-mode-hook (lambda() (require 'dap-java)))
    )

看上去lsp-mode是不是比eglot丰厚更多?但你也要留意,在一些机器上,尤其是Windows机器,lsp-mode会出现卡顿等功能问题,而eglot根本不会。

Java特别装备

运用了上面的LSP客户端后,一般的环境应该很简单装备或许无需装备,例如gopls,pylsp等,但也有一些编程言语的服务器需求一些额定的装备。例如c/c++的状况下,例如Java的状况。

Java的言语服务器是来自Eclipse的jdtls,最新版别的jdtls供给了一个可履行的文件,对于非Windows环境,只要把这个bin目录放到环境变量中即可。但他们供给的可履行脚本是基于Python写成的,这在Windows上无法变成可履行文件。

所以你需求额定生成一个可履行文件,或许自己写一个jdtls.bat的适合Windows的可履行文件。

@echo off
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs
cd /d %~dp0
java^
    -Declipse.application=org.eclipse.jdt.ls.core.id1^
    -Dosgi.bundles.defaultStartLevel=4^
    -Declipse.product=org.eclipse.jdt.ls.core.product^
    -Dosgi.checkConfiguration=true^
    -Dosgi.sharedConfiguration.area=../config_win^
    -Dosgi.sharedConfiguration.area.readOnly=true^
    -Dosgi.configuration.cascaded=true^
    -noverify^
    -Xms1G^
    --add-modules=ALL-SYSTEM^
    --add-opens java.base/java.util=ALL-UNNAMED^
    --add-opens java.base/java.lang=ALL-UNNAMED^
    -jar ../plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar^
    %CMD_LINE_ARGS%

或许运用pyinstaller –onefile来生成(源代码如下)。

import os
import sys
if getattr(sys, "frozen", False):
    dir_path = os.path.dirname(os.path.dirname(os.path.abspath(sys.executable)))
else:
    dir_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
cmd = (
    "java"
    " -Declipse.application=org.eclipse.jdt.ls.core.id1"
    " -Dosgi.bundles.defaultStartLevel=4"
    " -Declipse.product=org.eclipse.jdt.ls.core.product"
    " -Dosgi.checkConfiguration=true"
    f" -Dosgi.sharedConfiguration.area={dir_path}/config_win"
    " -Dosgi.sharedConfiguration.area.readOnly=true"
    " -Dosgi.configuration.cascaded=true"
    " -noverify"
    " -Xms1G"
    " --add-modules=ALL-SYSTEM"
    " --add-opens java.base/java.util=ALL-UNNAMED"
    " --add-opens java.base/java.lang=ALL-UNNAMED"
    f" -jar {dir_path}/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar"
    f" {' '.join(sys.argv[1:])}"
)
os.system(cmd)

针对Windows

好久以来,许多人对在Windows下运用Emacs的体会,给的点评并不高。包含我。经过了一段时刻的折腾之后,我想说的是,没有我们说的那么差。它或许无法与Linux/macOS下的体会进行媲美,但肯定能够日常运用,甚至有或许成为你的主力编辑器。

一般来说,Windows下需求解决几个方面的问题就能够了:

  • 字体,这是卡顿的元凶巨恶
  • 假如你喜爱mactype这样的插件,一定记得把emacs排除掉,十分显着的解决卡顿
  • 部分插件替代,例如用VC替代magit,例如用内置的project替代projectile等
  • Windows也能够运用daemon

结束语

之所以会重写,并且今后还会持续不断的晋级(这便是为什么这篇现已加上了版别号的原因),更多的仍是期望自己对Emacs的运用和理解,能够保持更新,一起期望把这些更新带给更多的初学者,以及有需求的人。交更多的志同道合的朋友。

不出意外,我后边应该会**一年出一个大版别**,虽然或许更新的内容不多。并且根本上,后边会交融更多的《Emacs轻奢之路》的内容(假如你感兴趣,能够阅览那一本小册)。我觉得那是运用Emacs的必经之路。假如你喜爱,能够保持对我以及这两个系列的关注。一起我也欢迎有更多的内容弥补进来,欢迎给我提意见/主张。

发布版别历史:

  • v0.1,视频版别,2020年3月起陆续发布
  • v1.0,当时版别,2022年4月