Emacs高手修炼手册

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

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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值