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