Emacs笔记
Linux
将emacs gui进程放置到后台
1EMACS=/usr/bin/emacs 2GUI=0 3ARGS="$@" 4ARRAY=("-nw" "--no-window-system" "--batch" "--help") 5 6for arg in $ARGS; do 7 for keyword in "${ARRAY[@]}";do 8 if [ $keyword = $arg ];then 9 GUI=1 10 break 11 fi 12 done 13 if [ $GUI -eq 1 ]; then 14 break 15 fi 16done 17 18if [ $GUI -eq 1 ]; then 19 $EMACS $ARGS 20else 21 $EMACS $ARGS &> /dev/null & 22 # nohup $EMACS $ARGS &> /dev/null & disown 23fi
Evil
粘贴替换的时候会复制替换的文本
1(defun evil-paste-after-from-0 () 2 (interactive) 3 (let ((evil-this-register ?0)) 4 (call-interactively 'evil-paste-after))) 5 6(define-key evil-visual-state-map "p" 'evil-paste-after-from-0)
自动搜索已选中的字符
经常使用 evil 中的 / 进行搜索, 但有时候想要搜索已有的字符, 在 evil-visual-state 下选中某个字符,按 / 时自动把选中的字符填入待搜索项中
1(use-package isearch 2 :ensure nil 3 :init 4 (defun maple/evil-search-paste() 5 (when (region-active-p) 6 (isearch-yank-string 7 (save-excursion 8 (buffer-substring-no-properties 9 (region-beginning) (1+ (region-end))))) 10 (deactivate-mark))) 11 :hook (isearch-mode . maple/evil-search-paste) 12 :bind (:map isearch-mode-map 13 ([remap isearch-delete-char] . isearch-del-char)))
evil-mc不忽略大小写
evil-mc 默认会通过evil-ex-search进行搜索,可以通过设置(setq evil-ex-search-case 'sensitive)来不忽略大小写, 但我只想在使用evil-mc时不忽略,其他时间忽略
1;; ignore case in evil-mc 2(add-hook 'evil-mc-before-cursors-created (lambda() (setq evil-ex-search-case 'sensitive))) 3(add-hook 'evil-mc-after-cursors-deleted (lambda() (setq evil-ex-search-case 'smart)))
Font
设置中英文字体
1;; 中英文表格对齐 2(defvar emacs-english-font "DejaVu Sans Mono" 3 "The font name of English.") 4(defvar emacs-cjk-font "WenQuanYi Micro Hei Mono" 5 "The font name for CJK.") 6(defvar emacs-font-size-pair '(15 . 18) 7 "Default font size pair for (english . chinese)") 8 9(defvar emacs-font-size-pair-list 10 '(( 5 . 6) (10 . 12) 11 (13 . 16) (15 . 18) (17 . 20) 12 (19 . 22) (20 . 24) (21 . 26) 13 (24 . 28) (26 . 32) (28 . 34) 14 (30 . 36) (34 . 40) (36 . 44)) 15 "This list is used to store matching (englis . chinese) font-size.") 16(defun font-exist-p (fontname) 17 "Test if this font is exist or not." 18 (if (or (not fontname) (string= fontname "")) 19 nil 20 (if (not (x-list-fonts fontname)) nil t))) 21 22(defun maple/set-font (english chinese size-pair) 23 "Setup emacs English and Chinese font on x window-system." 24 (if (font-exist-p english) 25 (set-frame-font (format "%s:pixelsize=%d" english (car size-pair)) t)) 26 27 (if (font-exist-p chinese) 28 (dolist (charset '(kana han symbol cjk-misc bopomofo)) 29 (set-fontset-font (frame-parameter nil 'font) charset 30 (font-spec :family chinese :size (cdr size-pair)))))) 31;; (add-hook 'ctbl:table-mode-hook 32;; (maple/set-font emacs-english-font emacs-cjk-font emacs-font-size-pair))
Ivy
指定目录或文件进行搜索
1(defun maple/counsel-ag-file() 2 (interactive) 3 (counsel-ag nil (read-file-name "Search in file(s): ")))
查找当前目录以及子目录的某个文件
1(defun maple/counsel-find-file() 2 (interactive) 3 (ivy-read "Find file: " 4 (mapcar 'file-relative-name 5 (directory-files-recursively default-directory "")) 6 :matcher #'counsel--find-file-matcher 7 :action #'counsel-find-file-action 8 :preselect (counsel--preselect-file) 9 :require-match 'confirm-after-completion 10 :history 'file-name-history 11 :keymap counsel-find-file-map 12 :caller 'counsel-find-file))
当选中单词时,swiper使用已选单词进行搜索
1(defun maple/ivy-search-at-point (func) 2 (let* ((region (region-active-p)) 3 (string (if (not region) "" 4 (buffer-substring-no-properties 5 (region-beginning) (region-end)))) 6 (ivy-initial-inputs-alist 7 (list (cons func string)))) 8 (when region (deactivate-mark)) 9 (funcall func)))
1(defun maple/swiper() 2 (interactive) 3 (maple/ivy-search-at-point 'swiper))
File
获取文件或目录的basename
1(defun maple/basename (fname) 2 (if (or (file-directory-p fname) 3 (string-match "/$" fname)) 4 (let ((dirname (directory-file-name fname))) 5 (file-name-nondirectory dirname)) 6 (file-name-nondirectory fname)))
Elisp
golang自动增加注释
因为flycheck使用了golint, flycheck总是显示代码没有注释的警告
1exported method Raw should have comment or be unexported (go-golint)
也没找到什么方法来禁止它, 作为强迫症受不了,总不能一个一个去注释, 所以写了一个函数来自动注释整个文件的所有未注释函数:
1(defun maple/go-auto-comment() 2 (interactive) 3 (unless (featurep 'imenu) 4 (require 'imenu nil t)) 5 (let* ((imenu-auto-rescan t) 6 (imenu-auto-rescan-maxout (if current-prefix-arg 7 (buffer-size) 8 imenu-auto-rescan-maxout)) 9 (items (imenu--make-index-alist t)) 10 (items (delete (assoc "*Rescan*" items) items))) 11 (cl-mapcan 12 (lambda(item) 13 (cl-mapcan 14 (if (string= (car item) "func") 15 'maple/go-func-comment 16 'maple/go-type-comment) 17 (cdr item))) 18 items))) 19 20(defun maple/go-add-comment(func point) 21 (save-excursion 22 (goto-char point) 23 (forward-line -1) 24 (when (not (looking-at (concat "// " func))) 25 (end-of-line) (newline-and-indent) 26 (insert (concat "// " func " .."))))) 27 28(defun maple/go-func-comment(f) 29 (let ((func (car f))) 30 (if (and (string-prefix-p "(" func) 31 (string-match "[)] \\(.*\\)[(]\\(.*\\)[)]\\(.*\\)$" func)) 32 (maple/go-add-comment (match-string 1 func) (cdr f)) 33 (if (string-match "\\(.*\\)[(]\\(.*\\)[)]\\(.*\\)$" func) 34 (maple/go-add-comment (match-string 1 func) (cdr f)) 35 (maple/go-add-comment (car f) (cdr f)))))) 36 37(defun maple/go-type-comment(f) 38 (maple/go-add-comment (car f) (cdr f)))
相关配置将持续更新: init-go.el
增加到hook但仅调用一次
1(defmacro maple/add-hook-once (hook f &optional append local) 2 "Like `add-hook`, remove after call with HOOK F &OPTIONAL APPEND LOCAL." 3 (let ((func (intern (format "maple/run-once-%s" 4 (symbol-name f))))) 5 `(progn 6 (defun ,func () 7 (remove-hook ',hook ',func ,local) 8 (funcall ',f)) 9 (add-hook ',hook ',func ,append ,local))))
迭代并获取列表索引
1(defmacro maple/dolist (spec &rest body) 2 "Like dolist but get INDEX, SPEC &REST BODY." 3 (declare (indent 1) (debug ((symbolp form &optional form) body))) 4 `(let ((num 0)) 5 (dolist ,(cdr spec) 6 (let ((,(car spec) num)) 7 ,@body 8 (setq num (+ num 1))))))
这样就可以使用
1(maple/dolist (index item '("aaa" "bbb")) 2 (print index))
深拷贝function
https://www.gnu.org/software/emacs/manual/html_node/elisp/Function-Cells.html
1(fset 'maple/put-text-property (symbol-function 'put-text-property))
