目錄
平台
- 操作系統:win10 64位
- emacs版本:emacs 26.1 64位
安裝
- 官網
http://www.gnu.org/software/emacs/ - 國內鏡像
http://mirrors.nju.edu.cn/gnu/emacs/windows - 安裝包
emacs-26.1-x86_64.zip - 安裝
解壓並重命名 emacs-26.1-x86_64.zip 到所需安裝位置。
如"D:\emacs-26.1",后面均以此為例。 - 配置HOME目錄
-
在注冊表中添加"計算機\HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs"項
-
為Emacs項添加字符串值
名稱 數據 HOME D:\emacs-26.1 -
增加環境變量D:\emacs-26.1
-
基本配置
配置文件結構
- 參考purcell的配置。
- 結構圖
- 結構詳解
- lisp/
插件配置文件目錄,配置文件命名格式為init-xxx.el - site-lisp/
放置無法從elpa或其它倉庫獲取的第三方插件,本目錄及其子目錄須在啟動時添加到load-path - init.el
初始化load-path,初始化elpa,加載各插件配置文件等
- lisp/
- 我的配置
https://files.cnblogs.com/files/eat-and-die/emacs配置文件.7z
elpa倉庫管理
- 倉庫源
- 配置文件init-elpa.el
-
添加倉庫
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
-
初始化package
(package-initialize)
-
主題配色
- solarized-theme
-
配置文件init-mytheme.el
(add-to-list 'custom-theme-load-path "your path") (load-theme 'solarized t)
- molokai
-
配置文件init-mytheme
(setq molokai-theme-kit t) (add-to-list 'custom-theme-load-path "your path") (load-theme 'molokai t)
字體顯示配置(解決中文卡頓)
-
dejavu-fonts
https://dejavu-fonts.github.io/Download.html -
編碼設置
(set-language-environment 'UTF-8) (set-locale-environment "UTF-8") (set-default-coding-systems 'utf-8)
-
中英文等寬設置
(defun set-font (english chinese english-size chinese-size) (set-face-attribute 'default nil :font (format "%s:pixelsize=%d" english english-size)) (dolist (charset '(kana han symbol cjk-misc bopomofo)) (set-fontset-font (frame-parameter nil 'font) charset (font-spec :family chinese :size chinese-size)))) (set-font "Dejavu Sans Mono" "WenQuanYi Zen Hei Mono" 14 14)
插件配置
以下所有插件均可使用以下命令安裝:
M-x package-install RET xxx RET
markdown
簡介
markdown-mode支持emacs markdown編輯,效果預覽需要pandoc工具支持。
插件markdown-toc用於自動生成目錄。
markdown-mode
-
下載地址
- Markdown-mode
https://github.com/jrblevin/markdown-mode - pandoc
https://github.com/jgm/pandoc/releases
- Markdown-mode
-
配置
(autoload 'markdown-mode "markdown-mode" "Major mode for editing Markdown files" t) (add-to-list 'auto-mode-alist '("\\.text\\'" . markdown-mode)) (add-to-list 'auto-mode-alist '("\\.markdown\\'" . markdown-mode)) (add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode)) (autoload 'gfm-mode "markdown-mode" "Major mode for editing GitHub Flavored Markdown files" t) (add-to-list 'auto-mode-alist '("README\\.md\\'" . gfm-mode)) ;; 需安裝pandoc (setq markdown-command "D:/Program/Pandoc/pandoc.exe")
-
快捷指令
指令 功能 C-c C-s b 加粗 C-c C-s i 傾斜 C-c C-s c(C) code C-c C-s 1~6(或 h) 標題 C-c C-s f 腳注 C-c C-l 插入鏈接 C-c C-i 插入圖片 C-c C-s C-h 查詢幫助 C-c C-s t 插入表格 指令(with pandoc) 功能 C-c C-c m 顯示對應html代碼 C-c C-c p preview C-c C-c e export C-c C-c v export & preview C-c C-c o open C-c C-c C-h help
markdown-toc
-
配置
暫時無需配置 -
問題
- 標題不能以數字開頭(包括中文“〇”)命名。
否則,生成的目錄鏈接無法跳轉 - 標題必須從h1-h6按序開始,不能直接從其它級別開始。
否則,無法正確生成目錄樹
- 標題不能以數字開頭(包括中文“〇”)命名。
-
快捷指令
M-x markdown-toc-generate-toc ;; 生成目錄樹 M-x markdown-toc-refresh-toc ;; 更新目錄樹 M-x markdown-toc-delete-toc ;; 刪除目錄樹
org導出md
-
org-mode支持markdown格式導出,而且不需要pandoc和markdown-toc。
從操作性上來說org-mode要好一些,功能更加強大,所以我要棄markdown了。 -
配置方法
(eval-after-load "org" '(require 'ox-md nil t))
-
導出md方法
C-c C-e m
notepad++預覽md
- notepad++ v7.6.1可支持markdown預覽
- 插件->Plugins Admin…->MarkdownViewer++
evil
簡介
模擬vi操作體驗的emacs插件,寫代碼更爽。
evil
-
配置
(require 'evil) (evil-mode 1)
-
快捷方式
指令 功能 C-z emacs模式和evil模式間切換 -
問題
- 在NORMAL和INSERT模式之間切換時,輸入法不會自動切換。
一個可能的解決方案: https://emacs-china.org/t/topic/3152 但我不喜。
所以,暫時不用,什么時候官方支持什么時候用。
- 在NORMAL和INSERT模式之間切換時,輸入法不會自動切換。
atuo-complete
-
簡介
自動補全工具 -
配置
(require 'auto-complete) (require 'auto-complete-config) (global-auto-complete-mode t) ;; 文本模式下啟動補全功能 (add-to-list 'ac-modes 'text-mode) (ac-config-default) (setq ac-auto-start 4) ;; pos-tip 幫助閃爍 ;;(require 'pos-tip) ;;(setq ac-quick-help-prefer-pos-tip t) ;; quick-help (setq ac-use-quick-help t) (setq ac-quick-help-delay 1.0) (setq ac-dwim t) (setq ac-trigger-commands (cons 'backward-delete-char-untabify ac-trigger-commands)) ;; fuzzy (setq ac-fuzzy-enable t) ;; menu ;;(setq ac-menu-height 12) ;;(set-face-background 'ac-candidate-face "lightgray") ;;(set-face-underline 'ac-candidate-face "darkgray") ;;(set-face-background 'ac-selection-face "steelblue")
-
問題
-
pos-tip在這個環境下效果很差,顯示的幫助內容閃爍
-
auto-complete插件和company插件沖突,在彈出菜單時可能造成顯示混亂
-
模糊匹配fuzzy插件
(setq ac-fuzzy-enable t) ;; 不起作用 M-x ac-fuzzy-complete ;; 可以起作用,但沒用
-
yasnippet
簡介
為C、C++、C#、Perl、Python等語言設置代碼片段。
配置
(require 'yasnippet)
;; 使用Ctrl-c k作為唯一的觸發快捷鍵
(define-key yas-minor-mode-map (kbd "<tab>") nil)
(define-key yas-minor-mode-map (kbd "TAB") nil)
(define-key yas-minor-mode-map (kbd "C-c k") 'yas-expand)
(setq yas-snippet-dirs
'("~/.emacs.d/Mysnippets"))
(yas-global-mode t)
snippet
-
創建snippet
C-c & C-n (M-x yas-new-snippet) ;; 創建新snippet C-c C-c ;; 保存snippet
-
典型例子
# contributor: test <test@qq.com> # name: __---__ # -- __${init}__
-
“# –”以上內容均為注釋,這些注釋可能為指令或者元數據
- 指令格式類似 “# property: value”
- 若沒有 “# –” 則,所有的內容均被當做snippet內容
-
指令
-
# key :snippet abbrev,這是最重要的指令,若不指定該指令,則無法觸發展開指令
-
# name :snippet name,用一行描述snippet。
好的描述可以讓你方便的區別相似的snippets -
# condition :snippet condition,若snippet有條件,
當條件非nil時snippet會被展開 -
# group :snippet menu grouping,一個模式若有許多snippets,
則可以把他們組織在一個group中,方便菜單欄中成組的顯示,防止菜單欄變得太長 -
# expand-env :expand environment,為變量賦值的列表(類似於let的變量賦值),
在展開代碼段時,它可用於覆蓋變量值# note: 從官網說明獲取,方便舉例 # name: ASCII home # expand-env: ((yas-indent-line 'fixed) (yas-wrap-around-region 'nil)) # -- welcome to my X humble / \ home, / \ $0 / \ /-------\ | | | +-+ | | | | | +--+-+--+
-
# binding :direct keybinding,你可以直接將展開snippet的指令綁定到普通的emacs按鍵
-
# type :snippet or command,若type指令被設置成了command,那么snippet的內容
會以lisp代碼的方式執行。若設置為snippet(默認為snippet),snippet內容會以其模板語法解釋執行 -
# uuid :unique identifier,獨立於name的唯一標識,若第二次加載的uuid和前次一樣,則會以第二次為准
-
# contributor :snippet author
-
-
模板語法
-
純文本
任意文本都可以作為模板的內容,除了美元符$和反引號`外,通常它們被認為是純文本。若需要可以
用反斜杠\轉義美元符和反引號,若要使用雙反斜杠\\,則每個反斜杠需要一個反斜杠轉義,即\\\\ -
嵌入elisp代碼
使用反引號`將elisp代碼嵌入到模板中,代碼會在snippet展開時執行/*c-mode example,示例取自官網*/ #ifndef ${1:_`(upcase (file-name-nondirectory (file-name-sans-extension (buffer-file-name))))`_H_} #define $1 $0 #endif /* $1 */
-
TAB位字段
該字段可以讓你使用TAB和S-TAB跳轉。該字段格式為美元符$后面跟一個數字,
$0有着exit point的特殊意義,表示退出snippet -
占位符字段
制表位可以設置默認值,即占位符,語法如下
${N:default value} -
Mirrors
將帶有占位符的制表位稱為field,一個field可以有許多mirrors。
當更新一個field,相應field所有的mirrors都會更新begin {${1:test}} $0 end{$1}
-
-
snippet實踐
# -*- mode: snippet -*- # name: main # key: c_main # -- /*${1: test} begin*/ /* C語言main函數snippet,輸入c_main然后C-c k即可 */ int main(${2:int args}, ${3:char *argv[]}) { $0; return 0; }/*$1 end*/
注:若光標被導航到了$0,無法使用S-TAB向后導航了。
semx/ido
-
簡介
Ido是emacs內置插件;semx一款構建在Ido基礎上,用於增強M-x功能的插件。 -
ido配置
(ido-mode 1) (setq ido-separator "\n") (setq ido-enable-flex-matching t)
-
semx配置
(require 'smex) (smex-initialize) (global-set-key (kbd "M-x") 'smex) (global-set-key (kbd "M-X") 'smex-major-mode-commands) ;; This is your old M-x. (global-set-key (kbd "C-c C-c M-x") 'execute-extended-command)
-
操作
- 左右方向鍵選擇待選項
- 使用TAB鍵補全
window-numbering
-
簡介
快速在window間切換。 -
操作
M-number
solarized-theme
-
自定義配置
(require-package 'solarized-theme) (require 'solarized) (defun init-mytheme-light () "My solarized child theme." (custom-theme-set-faces theme-name `(default ((,class (:background ,base03)))) )) (deftheme init-mytheme "The light variant of the Solarized color theme") (create-solarized-theme 'light 'init-mytheme 'init-mytheme-light)
fci-mode
-
簡介
80列提示線 -
操作
M-x fci-mode
erc
登陸emacs ERC
emacs自帶IRC客戶端,啟動指令:
M-x erc
minibuffer會提示操作步驟:
- IRC server : irc.freenode.net
- IRC port : 6667
- Nickname : "your name"
- Password : "your passwd"
注:步驟1-2可按默認配置,步驟3-4需自定義
注冊賬號
- 確認Nickname
可使用指令"/nick"修改Nickname至滿意為止,盡量避免使用社區、商標名 - 注冊nick
/msg NickServ REGISTER password youremail@example.com (注意大小寫)
freenode會向注冊郵箱發送確認注冊的信息的郵件,按操作執行即可
登陸賬號
- 賬號
/nick "your name" - 密碼
/msg NickServ identify "your passwd"