../
Emacs手札 ========= 2024-08-03 最近把主力編輯器從VSCode切換到了Emacs,這裏給配置過程做一下記錄。 ## 基本設置 讓Emacs把臨時文件都放到`/tmp`中,以免污染當前目錄: (setq backup-directory-alist `((".*" . ,temporary-file-directory))) (setq auto-save-file-name-transforms `((".*" ,temporary-file-directory t))) 設置字體: (set-frame-font "monospace 13" nil t) (set-fontset-font t 'han "Source Han Sans CN") 開啓行號顯示: (global-display-line-numbers-mode 1) 標題欄和工具欄大多數情況下沒有用,反而會佔屏幕空間,因此這裏把它們隱藏,如果需 要用到的話可以用`F10`呼出。 (menu-bar-mode -1) (toggle-scroll-bar -1) (tool-bar-mode -1) ## 包管理 把Melpa加入Emacs: (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) 啓用包管理器: (require 'package) (package-initialize) 隨後重啓Emacs,更新包目錄:`M-x package-refresh-contents`。 使用`M-x package-install`依次安裝下列功能包: - magit - lsp-mode - rust-mode - dired-sidebar - treesit-auto - use-package - yasnippet - rg - counsel - ivy - lsp-ivy - projectile - company 如果要更新所有安裝的包:`M-x list-package RET S-u x` ## Treesit 啓用內置的treesit然後利用`treesit-auto`自動配置: (require 'treesit) (use-package treesit-auto :config (global-treesit-auto-mode)) 然後安裝語法庫:`M-x treesit-auto-install-all` ## Typst typst模式這個包不在Melpa中,需要從git安裝:`M-x package-vc-install`。地址爲: https://git.sr.ht/~meow_king/typst-ts-mode 然後編譯安裝typst的treesit庫:先輸入 M-: (treesit-install-language-grammar 'typst) RET 然後輸入 https://github.com/uben0/tree-sitter-typst`。 配置: (use-package typst-ts-mode :custom (typst-ts-mode-grammar-location (expand-file-name "tree-sitter/libtree-sitter-typst.so" user-emacs-directory))) ## Ivy Ivy是一個minibuffer的補全工具,也有人用helm,不過我覺得ivy更輕更簡潔一點。 (require 'ivy) (require 'counsel) (ivy-mode) (setq ivy-use-virtual-buffers t) (setq enable-recursive-minibuffers t) (global-set-key "\C-s" 'swiper) (global-set-key (kbd "C-c C-r") 'ivy-resume) (global-set-key (kbd "<f6>") 'ivy-resume) (global-set-key (kbd "M-x") 'counsel-M-x) (global-set-key (kbd "C-x C-f") 'counsel-find-file) (global-set-key (kbd "<f1> f") 'counsel-describe-function) (global-set-key (kbd "<f1> v") 'counsel-describe-variable) (global-set-key (kbd "<f1> o") 'counsel-describe-symbol) (global-set-key (kbd "<f1> l") 'counsel-find-library) (global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol) (global-set-key (kbd "<f2> u") 'counsel-unicode-char) (global-set-key (kbd "C-c g") 'counsel-git) (global-set-key (kbd "C-c j") 'counsel-git-grep) (global-set-key (kbd "C-c k") 'counsel-ag) (global-set-key (kbd "C-x l") 'counsel-locate) (global-set-key (kbd "C-S-o") 'counsel-rhythmbox) (define-key minibuffer-local-map (kbd "C-r") 'counsel-minibuffer-history) ## LSP 這裏先只安裝Rust的lsp功能: (use-package company) (use-package rust-mode) (use-package lsp-mode :init ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l") (setq lsp-keymap-prefix "C-c l") :hook ( (rust-mode . lsp) ;; if you want which-key integration (lsp-mode . lsp-enable-which-key-integration)) :commands lsp) (use-package lsp-ivy :commands lsp-ivy-workspace-symbol) ## 文件瀏覽器側欄 使用`dired-sidebar`: (use-package dired-sidebar :bind (("C-x C-n" . dired-sidebar-toggle-sidebar)) :ensure t :commands (dired-sidebar-toggle-sidebar) :init (add-hook 'dired-sidebar-mode-hook (lambda () (unless (file-remote-p default-directory) (auto-revert-mode)))) :config (push 'toggle-window-split dired-sidebar-toggle-hidden-commands) (push 'rotate-windows dired-sidebar-toggle-hidden-commands) (setq dired-sidebar-subtree-line-prefix "__") (setq dired-sidebar-theme 'vscode) (setq dired-sidebar-use-term-integration t) (setq dired-sidebar-use-custom-font t)) 然後使用`C-x C-n`可以呼出側欄。 ## Projectile 使用`C-c p`快速在項目中跳轉到文件,類似於Vim的CtrlP: (projectile-mode +1) ;; Recommended keymap prefix on Windows/Linux (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) ## Snippet 使用`yasnippet`插件: (use-package yasnippet :bind (("C-c n i" . yas-insert-snippet)) :config (add-to-list 'yas-snippet-dirs "~/.emacs.d/snippets") (yas-global-mode 1)) Snippet保存在`~/.emacs.d/snippets/{模式名}/`目錄下。 ## Ripgrep 使用rg插件可以快速在項目目錄中搜索文本內容: (require 'rg) (rg-enable-default-bindings) 最常用的快捷鍵是`C-c p f`,可以在Projectile項目中搜索。 ## Magit Magit插件功能比較繁雜,這裏不再贅述了,可以去看magit網站上的教程。 啓用: (require 'magit) ## Markdown 直接加載Markdown模式即可: (use-package markdown-mode) -------------------------------------------------------------------- Email: i (at) mistivia (dot) com