Tooooommy / .emacs.d

config for emacs
MIT License
0 stars 0 forks source link

slim #1

Open Tooooommy opened 3 years ago

Tooooommy commented 3 years ago

;;; init.el --- load the full configuration ;;; Commentary:

;; This file contains all config for my Emacs

;;; Code:

;; @see https://github.com/moscribe/emacs.d ;; @see https://github.com/seagle0128/.emacs.d ;; @see https://github.com/purcell/emacs.d

;;;;;;;;;;;;;;; ;;;; define ;;;;;;;;;;;;;;;; (defvar default-package-mirror '(("melpa" . "https://melpa.org/packages/") ("org" . "https://orgmode.org/elpa/") ("gnu" . "https://elpa.gnu.org/packages/"))) (defvar emacs-china-package-mirror '(("gnu" . "http://elpa.emacs-china.org/gnu/") ("melpa" . "http://elpa.emacs-china.org/melpa/") ("org" . "http://elpa.emacs-china.org/org/"))) (defvar tuna-package-mirror '(("gnu" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/") ("melpa" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/") ("org" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/org/")))

;;;;;;;;;;;;;;;;; ;;;; vars ;;;;;;;;;;;;;;;;; (defvar user/emacs-min-version "26" "User defined Use Emacs min Version.") (defvar user/custom-file (expand-file-name "cache/custom.el" user-emacs-directory)) (defvar user/emacs-ispell-dict (expand-file-name "cache/hunspell_dict.txt" user-emacs-directory) "User Ispell Dict Dir.") (defvar user/org-note-dir "~/org" "User defined notes directory.") (defvar user/org-download-image-dir (expand-file-name "images" user/org-note-dir) "User defined org image download dir.")

(defvar user/normal-gc-cons-threshold ( 20 1024 1024)) (defvar user/init-gc-cons-threshold ( 128 1024 1024)) (defvar user/package-mirror tuna-package-mirror) (defvar user/enable-benchmark-init t) (defvar user/emacs-font "Source Code Pro Medium 14")

;;;;;;;;;;;;;;;;;;;;;;; ;;;; Initialize ;;;;;;;;;;;;;;;;;;;;;;; (when (version< emacs-version user/emacs-min-version) (error "Emacs %s or higher is required" user/emacs-min-version))

;; const (defconst is-mac (eq system-type 'darwin)) (defconst is-win64 (eq system-type 'windows-nt)) (defconst is-linux (or (eq system-type 'gnu/linux) (eq system-type 'linux)))

(add-to-list 'load-path (expand-file-name "elisp" user-emacs-directory)) (add-to-list 'load-path (expand-file-name "lisp" user-emacs-directory))

;; adjust garbage collection thresholds during startup, and thereafter (setq file-name-handler-alist nil) (setq gc-cons-threshold user/init-gc-cons-threshold) (add-hook 'emacs-startup-hook (lambda () (setq gc-cons-threshold user/normal-gc-cons-threshold)))

;; custome-file (setq custom-file user/custom-file)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; package ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setq package-archives user/package-mirror) (setq package-enable-at-startup nil) (package-initialize) ;; 初始化

;; use-package installtion (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package))

(require 'use-package) (setq use-package-always-ensure t)

(use-package quelpa) (use-package quelpa-use-package)

;;;;;;;;;;;;;;;;;;;;;;;; ;;;; benchmark ;;;;;;;;;;;;;;;;;;;;;;;; (when user/enable-benchmark-init (define-advice define-obsolete-function-alias (:filter-args (ll) fix-obsolete) (let ((obsolete-name (pop ll)) (current-name (pop ll)) (when (if ll (pop ll) "1")) (docstring (if ll (pop ll) nil))) (list obsolete-name current-name when docstring))) ;; benchmark (use-package benchmark-init :hook (after-init . benchmark-init/deactivate) :init (benchmark-init/activate)))

;;;;;;;;;;;;;;;;;; ;;;; config ;;;;;;;;;;;;;;;;;;

;; bar-mode 隐藏导航 (tool-bar-mode -1) (menu-bar-mode -1) (scroll-bar-mode -1)

;; frame 屏幕的状态栏显示异常 (setq-default window-resize-pixelwise t frame-resize-pixelwise t)

;; Suppress GUI features (setq use-file-dialog nil) (setq use-dialog-box nil) (setq inhibit-startup-screen t)

;; 默认配置 (setq-default blink-cursor-interval 0.4 ;; 光标闪烁 bookmark-default-file (locate-user-emacs-file ".bookmark.el") ;; 书签文件 column-number-mode t ;; 列数显示 fill-column 80 ;; 满列80 word-wrap t ;; 折叠 truncate-lines nil ;; 自动折行 truncate-partial-width-windows nil scroll-step 1 ;; 滚动步数1 auto-image-file-mode t ;; 图片文件显示 indent-tabs-mode nil ;; tab缩进 tab-width 4 ;; tab缩进4空格 tab-always-indent nil ;; tab缩进 tooltip-delay 1.5 ;; tooltip 延迟时间 create-lockfiles nil ;; 不创建 lockfile auto-save-default nil ;; 去掉自动保存 mouse-yank-at-point t ;; 鼠标复制粘贴 make-backup-files nil ;; 去掉备份文件 save-interprogram-paste-before-kill t ;; clipboard和kill ring交互 scroll-preserve-screen-position 'always set-mark-command-repeat-pop t )

;; font 字体大小 (when (not is-win64) (set-face-attribute 'default nil :font user/emacs-font))

;; warn (setq visible-bell nil ring-bell-function 'ignore)

;; exec-path-from-shell (when (not is-win64) (use-package exec-path-from-shell :config (exec-path-from-shell-initialize)))

;; auto-package-update (use-package auto-package-update :defer 2 :init (setq auto-package-update-delete-old-versions t auto-package-update-hide-results t) (defalias 'upgrade-packages #'auto-package-update-now))

;; restart-emcas (use-package restart-emacs :defer 2)

;; posframe (use-package posframe :defer 2)

;; auto revert (use-package autorevert :hook (after-init . global-auto-revert-mode) :config (setq global-auto-revert-non-file-buffers t auto-revert-verbose nil))

;; saveplace (use-package saveplace :hook (after-init . save-place-mode))

;; hl-line (use-package hl-line :hook (after-init . global-hl-line-mode))

;; hideshow (use-package hideshow :diminish hs-minor-mode :hook (prog-mode . hs-minor-mode) :custom (hs-special-modes-alist (mapcar 'purecopy '((c-mode "{" "}" "/[/]" nil nil) (c++-mode "{" "}" "/[/]" nil nil) (go-mode "{" "}" "/[/]" nil nil) (rust-mode "{" "}" "/[/]" nil nil)))))

;; whitespace (use-package whitespace :hook ((prog-mode markdown-mode conf-mode) . whitespace-mode) :config (setq whitespace-style '(face trailing)))

;; so-long (use-package so-long :when (fboundp 'so-long-mode) :config (global-so-long-mode 1))

;; vlf 大文件 (use-package vlf :config (defun ffap-vlf () "Find file at point with VLF." (interactive) (let ((file (ffap-file-at-point))) (unless (file-exists-p file) (error "File does not exist: %s" file)) (vlf file))))

;; subword (use-package subword :hook (after-init . global-subword-mode))

;; newcomment (use-package newcomment :ensure nil :bind ([remap comment-dwim] . #'comment-or-uncomment) :config (defun comment-or-uncomment () (interactive) (if (region-active-p) (comment-or-uncomment-region (region-beginning) (region-end)) (if (save-excursion (beginning-of-line) (looking-at "\s-*$")) (call-interactively 'comment-dwim) (comment-or-uncomment-region (line-beginning-position) (line-end-position))))) :custom (comment-auto-fill-only-comments t))

;; calendar (use-package calendar :ensure nil :custom (calendar-mark-holidays-flag t) :config (setq calendar-chinese-all-holidays-flag t))

;; webjump (use-package webjump :ensure nil :custom (webjump-sites '( ;; Emacs. ("Emacs Home Page" . "www.gnu.org/software/emacs/emacs.html") ("Savannah Emacs page" . "savannah.gnu.org/projects/emacs")

               ;; Internet search engines.
               ("Baidu" .
                [simple-query "baidu.com"
                              "www.baidu.com/s?wd=" ""])
               ("DuckDuckGo" .
                [simple-query "duckduckgo.com"
                              "duckduckgo.com/?q=" ""])
               ("Google" .
                [simple-query "www.google.com"
                              "www.google.com/search?q=" ""])
               ("Google Groups" .
                [simple-query "groups.google.com"
                              "groups.google.com/groups?q=" ""])
               ("Wikipedia" .
                [simple-query "wikipedia.org" "wikipedia.org/wiki/" ""]))))

;; delsel 删除 (use-package delsel :hook (after-init . delete-selection-mode))

;; recentf 最近文件 (use-package recentf :hook (after-init . recentf-mode) :config (setq-default recentf-max-saved-items 1000 recentf-exclude `("/tmp/" "/ssh:" ,(concat package-user-dir "/.*-autoloads\.el\'"))))

;; dired 目录 (use-package dired :ensure nil)

;; winner-mode 窗口恢复和重启 (use-package winner-mode :ensure nil :defer 2 :hook (after-init . winner-mode))

;; zoom 自动调整平衡 (use-package zoom :defer 2)

;; zoom-window 单独显示某个窗口 (use-package zoom-window :defer 2 :config (custom-set-variables '(zoom-window-mode-line-color "Dark")))

;; ranger 文件浏览器 (when (not is-win64) ;; ranger: https://github.com/ralesi/ranger.el (use-package ranger :defer 2))

;; paren 括号匹配 (use-package paren :hook (after-init . show-paren-mode) :config (setq show-paren-when-point-inside-paren t show-paren-when-point-in-periphery t))

;; smartparent 自动匹配 (use-package smartparens :defer 2 :config (require 'smartparens-config) (smartparens-global-mode))

;; ispell 拼音检测 (use-package ispell :config (setq ispell-dictionary "en_US" ispell-program-name "hunspell" ispell-personal-dictionary user/emacs-ispell-dict))

;; selectrum补全框架 (use-package selectrum :hook (after-init . selectrum-mode))

;; marginalia旁注 (use-package marginalia :hook (after-init . marginalia-mode) :config (setq-default marginalia-annotators '(marginalia-annotator-heavy)))

;; selectrum-prescient 推荐 (use-package selectrum-prescient :after selectrum :bind (([remap execute-extended-command] . nil) ([remap execute-extended-command] . execute-extended-command)) :config (selectrum-prescient-mode +1) (prescient-persist-mode +1))

;; orderless 排序 (use-package orderless :after selectrum :config (setq completion-styles '(orderless)) (setq orderless-skip-highlighting (lambda () selectrum-is-active)) (setq selectrum-highlight-candidates-function #'orderless-highlight-matches) )

;; savehist保存历史 (use-package savehist :init (savehist-mode))

;; consult 补全框架 (use-package consult :bind (([remap switch-to-buffer] . consult-buffer) ([remap switch-to-buffer-other-window] . consult-buffer-other-window) ([remap switch-to-buffer-other-frame] . consult-buffer-other-frame) ([remap goto-line] . consult-goto-line)) )

;; 目录和项目 (use-package consult-dir :after consult :config (setq consult-dir-project-list-function #'consult-dir-projectile-dirs) )

;; consult-flycheck (use-package consult-flycheck :after consult)

;; projectile 项目 (use-package projectile :hook (after-init . projectile-mode) :config (setq-default consult-project-root-function 'projectile-project-root) (setq-default projectile-mode-line-prefix " Proj"))

;; helpful 帮助 (use-package helpful)

;; doom-themes 主题 (use-package doom-themes :init (load-theme 'doom-one t) :config (doom-themes-visual-bell-config) (doom-themes-org-config) (setq doom-themes-enable-bold t doom-themes-enable-italic t))

;; language 语言协议框架 (use-package eglot :hook (prog-mode .(lambda () (unless (derived-mode-p 'emacs-lisp-mode 'lisp-mode 'makefile-mode) (eglot-ensure)))) :config (add-hook 'eglot-managed-mode-hook (lambda () (flymake-mode -1))) )

;; modeline 状态栏 (use-package simple-modeline :hook (after-init . simple-modeline-mode))

;; yasnippet 代码片段 (use-package yasnippet :defer 2 :hook (prog-mode . yas-minor-mode) :config (setq yas-snippet-dirs '("~/.emacs.d/snippets")) (use-package yasnippet-snippets))

;; compnay 补全框架 (use-package company :defer 2 :hook (after-init . global-company-mode) :diminish company-mode :bind (("M-C-/" . company-complete) :map company-mode-map ("M-/" . company-complete) ([remap completion-at-point] . company-complete) ([remap indent-for-tab-command] . company-indent-or-complete-common) :map company-active-map ("M-/" . company-other-backend) ("C-n" . company-select-next) ("C-p" . company-select-previous) ("C-d" . company-show-doc-buffer) ("M-." . company-show-location) ("RET" . company-complete-selection) ("" . company-complete-common-or-cycle) ("" . my/company-yasnippet) ) :init (defun my/company-yasnippet () "Hide the current completions and sho snippets" (interactive) (company-abort) (call-interactively 'company-yasnippet))

:config (setq company-tooltip-align-annotations t company-tooltip-limit 12 company-idle-delay 0 company-echo-delay (if (display-graphic-p) nil 0) company-minimum-prefix-length 2 company-require-match nil )

(defun company-yasnippet/disable-after-dot (fun command &optional arg &rest _ignore) (if (eq command 'prefix) (let ((prefix (funcall fun 'prefix))) (when (and prefix (not (eq (char-before (- (point) (length prefix))) ?.))) prefix)) (funcall fun command arg)))

(advice-add #'company-yasnippet :around #'company-yasnippet/disable-after-dot) )

;; company-prescient 候选人排序 (use-package company-prescient :after company :hook (company-mode . company-prescient-mode))

;; quickhelp company快速帮助 (use-package company-quickhelp :after company :hook (global-company-mode . company-quickhelp-mode) :defines company-quickhelp-delay :bind (:map company-active-map ([remap company-show-doc-buffer] . company-quickhelp-manual-begin)) :init (setq company-quickhelp-delay 0.5) )

;; flycheck 错误检查框架 (use-package flycheck :defer 2 :hook (prog-mode . flycheck-mode) :config (setq flycheck-display-errors-function #'flycheck-display-error-messages-unless-error-list) )

;; flycheck-posframe 错误检查弹框 (use-package flycheck-posframe :after flycheck :custom-face (flycheck-posframe-face ((t (:foreground ,(face-foreground 'success))))) (flycheck-posframe-info-face ((t (:foreground ,(face-foreground 'success))))) :hook (flycheck-mode . flycheck-posframe-mode) :init (setq flycheck-posframe-border-width 4 flycheck-posframe-inhibit-functions '((lambda (&rest _) (bound-and-true-p company-backend)))))

;; flycheck color (use-package flycheck-color-mode-line :after flycheck :hook (flycheck-mode . flycheck-color-mode-line-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; git ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; diff-hl git修改高亮 (use-package diff-hl :config (global-diff-hl-mode t) (diff-hl-dired-mode t))

;; hl-todo 高亮TODO (use-package hl-todo :defer t :hook (after-init . global-hl-todo-mode) :config (setq hl-todo-keyword-faces '(("TODO" . "#FF0000") ("FIXME" . "#FF0000") ("DEBUG" . "#A020F0") ("GOTCHA" . "#FF4500") ("STUB" . "#1E90FF"))) )

;; magit git客户端 (use-package magit :config (when is-mac (add-hook 'magit-mode-hook (lambda () (local-unset-key [(meta h)])))) (setq-default magit-diff-refine-hunk t) (setq auto-revert-check-vc-info t) (setq magit-completing-read-function #'selectrum-completing-read))

;; fullframe (use-package fullframe :after magit :config (fullframe magit-status magit-mode-quit-window))

;; git todo 标识 (use-package magit-todos)

;; git-timemachine 时间线 (use-package git-timemachine)

;; git-commit (use-package git-commit :hook (git-commit-mode . goto-address-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; python ;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package python :ensure nil :hook (inferior-python-mode . (lambda () (process-query-on-exit-flag (get-process "Python")))) :init (setq python-shell-completion-native-enable nil) :config (when (and (executable-find "python3") (string= python-shell-interpreter "python")) (setq python-shell-interpreter "python3")) )

;; live-py-mode (use-package live-py-mode)

;; pip (use-package pip-requirements)

;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; rust ;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package rustic :config (setq rustic-lsp-client 'eglot) ;; (setq rustic-lsp-server 'rls) (setq rustic-analyzer-command '("~/.cargo/bin/rust-analyzer")))

;; rust-playground 教练场 (use-package rust-playground)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; go ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package go-mode :defer 2 :hook (go-mode . yas-minor-mode) :bind (:map go-mode-map ("C-c R" . go-remove-unused-imports) ("C-c D" . godoc-at-point)) :config (setq tab-width 2) ;; Env vars (when (not is-win64) (with-eval-after-load 'exec-path-from-shell (exec-path-from-shell-copy-envs '("GOPATH" "GO111MODULE" "GOPROXY"))) ) (setq gofmt-command "goimports") (add-hook 'before-save-hook #'gofmt-before-save)

;; Install or update tools (defvar go--tools '("golang.org/x/tools/gopls" "golang.org/x/tools/cmd/goimports" "honnef.co/go/tools/cmd/staticcheck" "github.com/kisielk/errcheck" "github.com/go-delve/delve/cmd/dlv" "github.com/zmb3/gogetdoc" "github.com/josharian/impl" "github.com/cweill/gotests/..." "github.com/fatih/gomodifytags" "github.com/davidrjenni/reftools/cmd/fillstruct" "github.com/golangci/golangci-lint/cmd/golangci-lint" ) "All necessary go tools.")

(defun go-update-tools () "Install or update go tools." (interactive) (unless (executable-find "go") (user-error "Unable to find go' inexec-path'!"))

(message "Installing go tools...")
(dolist (pkg go--tools)
  (set-process-sentinel
   (start-process "go-tools" "*Go Tools*" "go" "install" "-v" "-x" (concat pkg "@latest"))
   (lambda (proc _)
     (let ((status (process-exit-status proc)))
       (if (= 0 status)
           (message "Installed %s" pkg)
         (message "Failed to install %s: %d" pkg status))))))

(unless (executable-find "gopls")
  (go-update-tools))))

;; godoctor 重构 (use-package godoctor)

;; go-dlv 调试 (use-package go-dlv) ;; go-fill-struct 填充结构体 (use-package go-fill-struct) ;; gotest 测试 (use-package gotest) ;; go-impl 实现接口 (use-package go-impl) ;; go-gen-test 生产test文件 (use-package go-gen-test)

;; emacs-go-tag 添加tag (use-package go-tag :init (setq go-tag-args (list "-transform" "snakecase")))

;; go-playground (use-package go-playground :diminish :commands (go-playground-mode))

;; go-errcheck 检测 (use-package go-errcheck)

;; flycheck-golangci-lint (use-package flycheck-golangci-lint :if (executable-find "golangci-lint") :after flycheck :defines flycheck-disabled-checkers :hook (go-mode . (lambda () "Enable golangci-lint" (setq flycheck-disabled-checkers '(go-gofmt go-golint go-vet go-build go-test go-errcheck)) (flycheck-golangci-lint-setup))))

;; go-eldoc (use-package go-eldoc :hook (go-mode . go-eldoc-setup))

;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; cc ;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package cc-mode :ensure nil :bind (:map c-mode-base-map ("C-c c" . compile)) :hook (c-mode-common . (lambda () (c-set-style "stroustrup"))) :init (setq-default c-basic-offset 4))

(use-package modern-cpp-font-lock :diminish :hook (cc-mode . modern-c++-font-lock-global-mode))

(use-package cmake-ide :init (cmake-ide-setup))

;;;;;;;;;;;;;;;;;;;;;;;; ;; lua ;;;;;;;;;;;;;;;;;;;;;;;; (use-package lua-mode :defer t :delight "Λ " :mode ("//.lua'" . lua-mode) :interpreter ("lua" . lua-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; elisp ;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package elisp-mode :ensure nil :delight "ξ ")

;; eldoc (use-package eldoc :defer 2 :hook (emacs-lisp-mode . eldoc-mode))

;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; misc ;;;;;;;;;;;;;;;;;;;;;;;;;

;; youdao-dict 有道词典 (use-package youdao-dictionary)

;; docker 容器 (use-package docker)

;; docker compose 容器集合 (use-package docker-compose-mode)

;; dockerfile 容器配置 (use-package dockerfile-mode :delight "δ " :mode "Dockerfile\'")

;; sql-indent sql对齐 (use-package sql-indent :after (:any sql sql-interactive-mode) :delight sql-mode "Σ ")

;; ini 配置 (use-package ini-mode :defer 2 :delight "I " :mode ("\.ini\'"))

;; json 配置 (use-package json-mode :defer t :delight "J " :mode "\.json\'")

;; yaml 配置 (use-package yaml-mode :defer t :delight "ψ " :mode "\.yml\'")

;; restclient http客户端 (use-package restclient :defer t)

;; rainbow parent 彩虹括号 (use-package rainbow-delimiters :defer t :hook (prog-mode . rainbow-delimiters-mode))

;; color-indentifier-mode 颜色标识 (use-package color-identifiers-mode :defer t :hook (after-init . global-color-identifiers-mode))

;; dumb-jump 跳转 (use-package dumb-jump :defer t :config (add-hook 'xref-backend-functions #'dumb-jump-xref-activate))

;; format-all 格式化 (use-package format-all :hook (go-mode . format-all-mode) :hook (rust-mode . format-all-mode))

;; aggressive-indent 对齐 (use-package aggressive-indent :hook (emacs-lisp-mode . aggressive-indent-mode) :hook (rust-mode . aggressive-indent-mode) :hook (go-mode . aggressive-indent-mode) :hook (c-mode . aggressive-indent-mode) :hook (c++-mode . aggressive-indent-mode) :config (add-to-list 'aggressive-indent-dont-indent-if '(and (derived-mode-p 'c++-mode) (null (string-match "\([;{}]\|\b\(if\|for\|while\)\b\)" (thing-at-point 'line))))))

;; pomidor 番茄计时 (use-package pomidor :config (setq pomidor-sound-tick nil pomidor-sound-tack nil) :hook (pomidor-mode . (lambda () (display-line-numbers-mode -1) ; Emacs 26.1+ (setq left-fringe-width 0 right-fringe-width 0) (setq left-margin-width 2 right-margin-width 0) ;; force fringe update (set-window-buffer nil (current-buffer)))))

;; markdown 标记文本 (use-package markdown-mode :mode ("//.md//'" . markdown-mode))

;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; org ;;;;;;;;;;;;;;;;;;;;;;;;; (use-package org)

;; org-superstar 修改样式 (use-package org-superstar :after org :defer t :hook (org-mode . org-superstar-mode) :init (setq org-superstar-prettify-item-bullets t org-superstar-headline-bullets-list '("◉" "✸" "⚫" "○" "•") org-superstar-leading-bullet ?\s org-hide-leading-stars t org-superstar-item-bullet-alist '((?* . ?●) (?+ . ?➤) (?- . ?—))))

;; org-download 下载 (use-package org-download :defer t :after org :config (setq org-download-image-dir user/org-download-image-dir))

;; toc-org 目录标题 (use-package toc-org :defer t :after org :hook (org-mode . toc-org-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; vim ;;;;;;;;;;;;;;;;;;;;;;;;;;

;; evil vim按键模式模拟 (use-package evil :init (setq evil-want-keybinding nil evil-ex-substitute-global t) :config (evil-mode 1) ;;; relative line number (defun my-enable-relative-line-number () (interactive) (display-line-numbers-mode -1) (setq display-line-numbers-type 'relative) (display-line-numbers-mode 1))

(defun my-disable-relative-line-number () (interactive) (display-line-numbers-mode -1) (setq display-line-numbers-type t) (display-line-numbers-mode 1))

(add-hook 'evil-normal-state-entry-hook 'my-enable-relative-line-number) (add-hook 'evil-insert-state-entry-hook 'my-disable-relative-line-number) (add-hook 'evil-insert-state-exit-hook 'my-enable-relative-line-number))

;; evil-escape vim退出 (use-package evil-escape ;; :hook (evil-mode . evil-escape-mode) :init(evil-escape-mode 1) :bind ("C-g" . evil-escape) :config (progn (setq-default evil-escape-key-sequence "jk") (setq-default evil-escape-delay 0.2)))

;; function tools (defun my/open-init-file () "Edit the use-init-file, in another window." (interactive) (find-file user-init-file))

(defun my/kill-other-buffers () "Kill all buffers but the current one. Doesn't mess with special buffers." (interactive) (seq-each

'kill-buffer

(delete (current-buffer) (seq-filter #'buffer-file-name (buffer-list)))))

(defun my/save-all-buffers () "Save all buffers." (interactive) (seq-each

'save-buffer (buffer-list)))

(defun my/fullscreen () "Set Fullscreen." (interactive) (set-frame-parameter nil 'fullscreen (if (frame-parameter nil 'fullscreen) nil 'fullboth)))

(defun my/increase-window () "Increase window width and height." (interactive) (progn (evil-window-increase-width 25) (evil-window-increase-height 25)))

(defun my/decrease-window () "Decrease window width and height." (interactive) (progn (evil-window-decrease-width 25) (evil-window-decrease-height 25)))

;; general (use-package general :config (general-evil-setup)

(general-define-key :states '(normal visual motion) :keymaps 'override "gd" 'xref-find-definitions)

(general-define-key :states '(normal visual motion) :keymaps 'override "gb" 'xref-find-references)

(general-define-key :states '(normal visual motion) :keymaps 'override "C-o" 'xref-pop-marker-stack)

(general-define-key :states)

(general-create-definer leader-key :states '(normal visual motion emacs) :prefix "SPC" :keymaps 'override)

;; command (leader-key "SPC" 'execute-extended-command) ;; 调用M-x

;; align (leader-key "aa" 'align-regexp )

;; buffer (leader-key "b1" 'my/kill-other-buffers "bb" 'consult-buffer "bd" 'evil-delete-buffer "bD" 'my/kill-other-buffers "bn" 'evil-next-buffer "bp" 'evil-prev-buffer "bc" 'evil-buffer-new "bm" 'consult-bookmark "br" 'bookmark-delete )

;; comment (leader-key "cc" 'comment-or-uncomment "cr" 'comment-or-uncomment-region )

;; diff & docker (leader-key "d3" 'ediff3 "dd" 'ediff-files "db" 'ediff-buffers "do" 'docker )

;; file (leader-key "ff" 'find-file "fo" 'consult-outline "fc" 'dired-create-empty-file "fd" 'dired-create-directory "fs" 'save-buffer "fr" 'ranger "ft" 'dired "fm" 'follow-mode "fv" 'ediff "fF" 'consult-find "fS" 'my/save-all-buffers "fR" 'rename-file "FD" 'delete-file )

;; git (leader-key "gs" 'magit-status "gg" 'magit-dispatch "gv" 'git-timemachine-toggle "gr" 'consult-git-grep )

;; windows (leader-key "w1" 'delete-other-windows "w+" 'my/increase-window "w-" 'my/decrease-window "wu" 'winner-undo "wr" 'winner-redo "ws" 'evil-window-split "wv" 'evil-window-vsplit "wd" 'evil-window-delete "wh" 'evil-window-left "wj" 'evil-window-bottom "wk" 'evil-window-up "wl" 'evil-window-right "wo" 'other-window "wf" 'toggle-frame-fullscreen "wz" 'zoom-window-zoom "ww" 'zoom-window-next "wD" 'delete-other-frames )

;; search (leader-key "ss" 'consult-line "sS" 'consult-line-multi "sc" 'consult-compile-error "sf" 'consult-flycheck "sr" 'consult-ripgrep "si" 'consult-imenu "sI" 'consult-imenu-multi )

;; project (leader-key "pp" 'consult-dir "pa" 'projectile-add-known-project )

;; org (leader-key "oo" 'consult-org-agenda "oa" 'org-agenda "oc" 'org-capture "ob" 'org-switchb "ow" 'org-refile )

;; theme & dictionary (leader-key "tt" 'consult-theme "tr" 'youdao-dictionary-search-at-point-posframe "tR" 'youdao-dictionary-search-from-input )

;; help (leader-key "hh" 'helpful-callable "ha" 'consult-apropos "hc" 'helpful-command "hf" 'helpful-function "hi" 'consult-man "hk" 'helpful-key "hm" 'helpful-macro "hv" 'helpful-variable "hp" 'helpful-at-point )

;; view & browser (leader-key "vw" 'webjump "vt" 'type-break "vo" 'pomidor "vl" 'consult-goto-line )

;; emacs & package (leader-key "qq" 'save-buffers-kill-emacs "qr" 'restart-emacs "qu" 'upgrade-packages )

;; go-mode-map (leader-key go-mode-map "ma" 'go-import-add "mg" 'go-gen-test-dwim "mR" 'go-remove-unused-imports "md" 'dlv-current-func "mD" 'dlv "ml" 'go-impl "ma" 'go-tag-add "mr" 'go-tag-remove "ms" 'go-fill-struct "mf" 'gofmt-before-save "m." 'godoc-at-point "mx" 'go-run "mp" 'go-playground "mtf" 'go-test-current-file "mtt" 'go-test-current-test "mtp" 'go-test-current-project "mtb" 'go-test-current-benchmark "mtc" 'go-test-current-coverage )

;; rustic-mode (leader-key rustic-mode-map "mx" 'rustic-compile "ma" 'rustic-cargo-add "mr" 'rustic-cargo-rm "mu" 'rustic-cargo-upgrade "mtt" 'rustic-cargo-current-test "mtp" 'rustic-cargo-test "mff" 'rustic-format-file "mfb" 'rustic-format-buffer "mfp" 'rustic-cargo-fmt "mo" 'rustic-cargo-outdated "my" 'rustic-cargo-clippy )

)

(provide 'init)

;;; init.el ends here

Tooooommy commented 3 years ago

;;; https://andrewjamesjohnson.com/suppressing-ad-handle-definition-warnings-in-emacs/ ;; ;; ad-handle-definition: ‘align-regexp’ got redefined ;; ;; ad-handle-definition: ‘find-tag-regexp’ got redefined (setq ad-redefinition-action 'accept)

Tooooommy commented 2 years ago

;;; init.el --- load the full configuration ;;; Commentary:

;; This file contains all config for my Emacs

;;; Code:

;; @see https://github.com/moscribe/emacs.d ;; @see https://github.com/seagle0128/.emacs.d ;; @see https://github.com/purcell/emacs.d

;;;;;;;;;;;;;;; ;;;; define ;;;;;;;;;;;;;;;; (defvar default-package-mirror '(("melpa" . "https://melpa.org/packages/") ("org" . "https://orgmode.org/elpa/") ("gnu" . "https://elpa.gnu.org/packages/"))) (defvar emacs-china-package-mirror '(("gnu" . "http://elpa.emacs-china.org/gnu/") ("melpa" . "http://elpa.emacs-china.org/melpa/") ("org" . "http://elpa.emacs-china.org/org/"))) (defvar tuna-package-mirror '(("gnu" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/") ("melpa" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/") ("org" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/org/")))

;;;;;;;;;;;;;;;;; ;;;; vars ;;;;;;;;;;;;;;;;; (defvar user/emacs-min-version "26" "User defined Use Emacs min Version.") (defvar user/custom-file (expand-file-name "cache/custom.el" user-emacs-directory)) (defvar user/emacs-ispell-dict (expand-file-name "cache/hunspell_dict.txt" user-emacs-directory) "User Ispell Dict Dir.") (defvar user/org-note-dir "~/org" "User defined notes directory.") (defvar user/org-download-image-dir (expand-file-name "images" user/org-note-dir) "User defined org image download dir.")

(defvar user/normal-gc-cons-threshold ( 20 1024 1024)) (defvar user/init-gc-cons-threshold ( 128 1024 1024)) (defvar user/package-mirror tuna-package-mirror) (defvar user/enable-benchmark-init t) (defvar user/emacs-font "Source Code Pro Medium 14")

;;;;;;;;;;;;;;;;;;;;;;; ;;;; Initialize ;;;;;;;;;;;;;;;;;;;;;;; (when (version< emacs-version user/emacs-min-version) (error "Emacs %s or higher is required" user/emacs-min-version))

;; const (defconst is-mac (eq system-type 'darwin)) (defconst is-win64 (eq system-type 'windows-nt)) (defconst is-linux (or (eq system-type 'gnu/linux) (eq system-type 'linux)))

(add-to-list 'load-path (expand-file-name "elisp" user-emacs-directory)) (add-to-list 'load-path (expand-file-name "lisp" user-emacs-directory))

;; adjust garbage collection thresholds during startup, and thereafter (setq file-name-handler-alist nil) (setq gc-cons-threshold user/init-gc-cons-threshold) (add-hook 'emacs-startup-hook (lambda () (setq gc-cons-threshold user/normal-gc-cons-threshold)))

;; custome-file (setq custom-file user/custom-file)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; package ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setq package-archives user/package-mirror) (setq package-enable-at-startup nil) (package-initialize) ;; 初始化

;; use-package installtion (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package))

(require 'use-package) (setq use-package-always-ensure t)

(use-package quelpa) (use-package quelpa-use-package)

;;;;;;;;;;;;;;;;;;;;;;;; ;;;; benchmark ;;;;;;;;;;;;;;;;;;;;;;;; (when user/enable-benchmark-init (define-advice define-obsolete-function-alias (:filter-args (ll) fix-obsolete) (let ((obsolete-name (pop ll)) (current-name (pop ll)) (when (if ll (pop ll) "1")) (docstring (if ll (pop ll) nil))) (list obsolete-name current-name when docstring))) ;; benchmark (use-package benchmark-init :hook (after-init . benchmark-init/deactivate) :init (benchmark-init/activate)))

;;;;;;;;;;;;;;;;;; ;;;; config ;;;;;;;;;;;;;;;;;; ;;; https://andrewjamesjohnson.com/suppressing-ad-handle-definition-warnings-in-emacs/ ;; ;; ad-handle-definition: ‘align-regexp’ got redefined ;; ;; ad-handle-definition: ‘find-tag-regexp’ got redefined (setq ad-redefinition-action 'accept)

;; bar-mode 隐藏导航

(tool-bar-mode -1) (menu-bar-mode -1) (scroll-bar-mode -1)

;; frame 屏幕的状态栏显示异常 (setq-default window-resize-pixelwise t frame-resize-pixelwise t)

;; Suppress GUI features (setq use-file-dialog nil) (setq use-dialog-box nil) (setq inhibit-startup-screen t)

;; 默认配置 (setq-default blink-cursor-interval 0.4 ;; 光标闪烁 bookmark-default-file (locate-user-emacs-file ".bookmark.el") ;; 书签文件 column-number-mode t ;; 列数显示 fill-column 80 ;; 满列80 word-wrap t ;; 折叠 truncate-lines nil ;; 自动折行 truncate-partial-width-windows nil scroll-step 1 ;; 滚动步数1 auto-image-file-mode t ;; 图片文件显示 indent-tabs-mode nil ;; tab缩进 tab-width 4 ;; tab缩进4空格 tab-always-indent nil ;; tab缩进 tooltip-delay 1.5 ;; tooltip 延迟时间 create-lockfiles nil ;; 不创建 lockfile auto-save-default nil ;; 去掉自动保存 mouse-yank-at-point t ;; 鼠标复制粘贴 make-backup-files nil ;; 去掉备份文件 save-interprogram-paste-before-kill t ;; clipboard和kill ring交互 scroll-preserve-screen-position 'always set-mark-command-repeat-pop t )

;; font 字体大小 (when (not is-win64) (set-face-attribute 'default nil :font user/emacs-font))

;; warn (setq visible-bell nil ring-bell-function 'ignore)

;; exec-path-from-shell (when (not is-win64) (use-package exec-path-from-shell :config (exec-path-from-shell-initialize)))

;; auto-package-update (use-package auto-package-update :defer 2 :init (setq auto-package-update-delete-old-versions t auto-package-update-hide-results t) (defalias 'upgrade-packages #'auto-package-update-now))

;; restart-emcas (use-package restart-emacs :defer 2)

;; posframe (use-package posframe :defer 2)

;; auto revert (use-package autorevert :hook (after-init . global-auto-revert-mode) :config (setq global-auto-revert-non-file-buffers t auto-revert-verbose nil))

;; saveplace (use-package saveplace :hook (after-init . save-place-mode))

;; hl-line (use-package hl-line :hook (after-init . global-hl-line-mode))

;; hideshow (use-package hideshow :diminish hs-minor-mode :hook (prog-mode . hs-minor-mode) :custom (hs-special-modes-alist (mapcar 'purecopy '((c-mode "{" "}" "/[/]" nil nil) (c++-mode "{" "}" "/[/]" nil nil) (go-mode "{" "}" "/[/]" nil nil) (rust-mode "{" "}" "/[/]" nil nil)))))

;; whitespace (use-package whitespace :hook ((prog-mode markdown-mode conf-mode) . whitespace-mode) :config (setq whitespace-style '(face trailing)))

;; so-long (use-package so-long :when (fboundp 'so-long-mode) :config (global-so-long-mode 1))

;; vlf 大文件 (use-package vlf :config (defun ffap-vlf () "Find file at point with VLF." (interactive) (let ((file (ffap-file-at-point))) (unless (file-exists-p file) (error "File does not exist: %s" file)) (vlf file))))

;; subword (use-package subword :hook (after-init . global-subword-mode))

;; newcomment (use-package newcomment :ensure nil :bind ([remap comment-dwim] . #'comment-or-uncomment) :config (defun comment-or-uncomment () (interactive) (if (region-active-p) (comment-or-uncomment-region (region-beginning) (region-end)) (if (save-excursion (beginning-of-line) (looking-at "\s-*$")) (call-interactively 'comment-dwim) (comment-or-uncomment-region (line-beginning-position) (line-end-position))))) :custom (comment-auto-fill-only-comments t))

;; calendar (use-package calendar :ensure nil :custom (calendar-mark-holidays-flag t) :config (setq calendar-chinese-all-holidays-flag t))

;; webjump (use-package webjump :ensure nil :custom (webjump-sites '( ;; Emacs. ("Emacs Home Page" . "www.gnu.org/software/emacs/emacs.html") ("Savannah Emacs page" . "savannah.gnu.org/projects/emacs")

               ;; Internet search engines.
               ("Baidu" .
                [simple-query "baidu.com"
                              "www.baidu.com/s?wd=" ""])
               ("DuckDuckGo" .
                [simple-query "duckduckgo.com"
                              "duckduckgo.com/?q=" ""])
               ("Google" .
                [simple-query "www.google.com"
                              "www.google.com/search?q=" ""])
               ("Google Groups" .
                [simple-query "groups.google.com"
                              "groups.google.com/groups?q=" ""])
               ("Wikipedia" .
                [simple-query "wikipedia.org" "wikipedia.org/wiki/" ""]))))

;; delsel 删除 (use-package delsel :hook (after-init . delete-selection-mode))

;; recentf 最近文件 (use-package recentf :hook (after-init . recentf-mode) :config (setq-default recentf-max-saved-items 1000 recentf-exclude `("/tmp/" "/ssh:" ,(concat package-user-dir "/.*-autoloads\.el\'"))))

;; dired 目录 (use-package dired :ensure nil)

;; winner-mode 窗口恢复和重启 (use-package winner-mode :ensure nil :defer 2 :hook (after-init . winner-mode))

;; zoom 自动调整平衡 (use-package zoom :defer 2)

;; zoom-window 单独显示某个窗口 (use-package zoom-window :defer 2 :config (custom-set-variables '(zoom-window-mode-line-color "Dark")))

;; ranger 文件浏览器 (when (not is-win64) ;; ranger: https://github.com/ralesi/ranger.el (use-package ranger :defer 2))

;; paren 括号匹配 (use-package paren :hook (after-init . show-paren-mode) :config (setq show-paren-when-point-inside-paren t show-paren-when-point-in-periphery t))

;; smartparent 自动匹配 (use-package smartparens :defer 2 :config (require 'smartparens-config) (smartparens-global-mode))

;; ispell 拼音检测 (use-package ispell :config (setq ispell-dictionary "en_US" ispell-program-name "hunspell" ispell-personal-dictionary user/emacs-ispell-dict))

;; selectrum补全框架 (use-package selectrum :hook (after-init . selectrum-mode))

;; marginalia旁注 (use-package marginalia :hook (after-init . marginalia-mode) :config (setq-default marginalia-annotators '(marginalia-annotator-heavy)))

;; selectrum-prescient 推荐 (use-package selectrum-prescient :after selectrum :bind (([remap execute-extended-command] . nil) ([remap execute-extended-command] . execute-extended-command)) :config (selectrum-prescient-mode +1) (prescient-persist-mode +1))

;; orderless 排序 (use-package orderless :after selectrum :config (setq completion-styles '(orderless)) (setq orderless-skip-highlighting (lambda () selectrum-is-active)) (setq selectrum-highlight-candidates-function #'orderless-highlight-matches) )

;; savehist保存历史 (use-package savehist :init (savehist-mode))

;; consult 补全框架 (use-package consult :bind (([remap switch-to-buffer] . consult-buffer) ([remap switch-to-buffer-other-window] . consult-buffer-other-window) ([remap switch-to-buffer-other-frame] . consult-buffer-other-frame) ([remap goto-line] . consult-goto-line)) )

;; 目录和项目 (use-package consult-dir :after consult :config (setq consult-dir-project-list-function #'consult-dir-projectile-dirs) )

;; consult-flycheck (use-package consult-flycheck :after consult)

;; projectile 项目 (use-package projectile :hook (after-init . projectile-mode) :config (setq-default consult-project-root-function 'projectile-project-root) (setq-default projectile-mode-line-prefix " Proj") (setq-default projectile-completion-system 'selectrum) )

;; helpful 帮助 (use-package helpful)

;; Fast search tool `ripgrep' (use-package rg :after projectile :hook (after-init . rg-enable-default-bindings) :init (setq rg-group-result t rg-show-columns t) :config (bind-key "s R" #'rg-project projectile-command-map))

;; doom-themes 主题 (use-package doom-themes :init (load-theme 'doom-one t) :config (doom-themes-visual-bell-config) (doom-themes-org-config) (setq doom-themes-enable-bold t doom-themes-enable-italic t))

;; language 语言协议框架 (use-package eglot :hook (prog-mode .(lambda () (unless (derived-mode-p 'emacs-lisp-mode 'lisp-mode 'makefile-mode) (eglot-ensure)))) :hook (eglot-managed-mode . (lambda () (flymake-mode -1) (eldoc-box-hover-mode t))) )

;; modeline 状态栏 (use-package simple-modeline :hook (after-init . simple-modeline-mode))

;; yasnippet 代码片段 (use-package yasnippet :defer 2 :hook (prog-mode . yas-minor-mode) :config (setq yas-snippet-dirs '("~/.emacs.d/snippets")) (use-package yasnippet-snippets))

;; compnay 补全框架 (use-package company :defer 2 :hook (after-init . global-company-mode) :diminish company-mode :bind (("M-C-/" . company-complete) :map company-mode-map ("M-/" . company-complete) ([remap completion-at-point] . company-complete) ([remap indent-for-tab-command] . company-indent-or-complete-common) :map company-active-map ("M-/" . company-other-backend) ("C-n" . company-select-next) ("C-p" . company-select-previous) ("C-d" . company-show-doc-buffer) ("M-." . company-show-location) ("RET" . company-complete-selection) ("" . company-complete-common-or-cycle) ("" . my/company-yasnippet) ) :init (defun my/company-yasnippet () "Hide the current completions and sho snippets" (interactive) (company-abort) (call-interactively 'company-yasnippet))

:config (setq company-tooltip-align-annotations t company-tooltip-limit 12 company-idle-delay 0 company-echo-delay (if (display-graphic-p) nil 0) company-minimum-prefix-length 2 company-require-match nil )

(defun company-yasnippet/disable-after-dot (fun command &optional arg &rest _ignore) (if (eq command 'prefix) (let ((prefix (funcall fun 'prefix))) (when (and prefix (not (eq (char-before (- (point) (length prefix))) ?.))) prefix)) (funcall fun command arg)))

(advice-add #'company-yasnippet :around #'company-yasnippet/disable-after-dot) )

;; company-prescient 候选人排序 (use-package company-prescient :after company :hook (company-mode . company-prescient-mode))

;; quickhelp company快速帮助 (use-package company-quickhelp :after company :hook (global-company-mode . company-quickhelp-mode) :defines company-quickhelp-delay :bind (:map company-active-map ([remap company-show-doc-buffer] . company-quickhelp-manual-begin)) :init (setq company-quickhelp-delay 0.5) )

;; flycheck 错误检查框架 (use-package flycheck :defer 2 :hook (prog-mode . flycheck-mode) :config (setq flycheck-display-errors-function #'flycheck-display-error-messages-unless-error-list) )

;; flycheck-posframe 错误检查弹框 (use-package flycheck-posframe :after flycheck :custom-face (flycheck-posframe-face ((t (:foreground ,(face-foreground 'success))))) (flycheck-posframe-info-face ((t (:foreground ,(face-foreground 'success))))) :hook (flycheck-mode . flycheck-posframe-mode) :init (setq flycheck-posframe-border-width 4 flycheck-posframe-inhibit-functions '((lambda (&rest _) (bound-and-true-p company-backend)))))

;; flycheck color (use-package flycheck-color-mode-line :after flycheck :hook (flycheck-mode . flycheck-color-mode-line-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; git ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; diff-hl git修改高亮 (use-package diff-hl :config (global-diff-hl-mode t) (diff-hl-dired-mode t))

;; hl-todo 高亮TODO (use-package hl-todo :defer t :hook (after-init . global-hl-todo-mode) :config (setq hl-todo-keyword-faces '(("TODO" . "#FF0000") ("FIXME" . "#FF0000") ("DEBUG" . "#A020F0") ("GOTCHA" . "#FF4500") ("STUB" . "#1E90FF"))) )

;; magit git客户端 (use-package magit :config (when is-mac (add-hook 'magit-mode-hook (lambda () (local-unset-key [(meta h)])))) (setq-default magit-diff-refine-hunk t) (setq auto-revert-check-vc-info t) (setq magit-completing-read-function #'selectrum-completing-read))

;; fullframe (use-package fullframe :after magit :config (fullframe magit-status magit-mode-quit-window))

;; git todo 标识 (use-package magit-todos)

;; git-timemachine 时间线 (use-package git-timemachine)

;; git-commit (use-package git-commit :hook (git-commit-mode . goto-address-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; python ;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package python :ensure nil :hook (inferior-python-mode . (lambda () (process-query-on-exit-flag (get-process "Python")))) :init (setq python-shell-completion-native-enable nil) :config (when (and (executable-find "python3") (string= python-shell-interpreter "python")) (setq python-shell-interpreter "python3")) )

;; live-py-mode (use-package live-py-mode)

;; pip (use-package pip-requirements)

;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; rust ;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package rustic :config (setq rustic-lsp-client 'eglot) ;; (setq rustic-lsp-server 'rls) (setq rustic-analyzer-command '("~/.cargo/bin/rust-analyzer")))

;; rust-playground 教练场 (use-package rust-playground)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; go ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package go-mode :defer 2 :hook (go-mode . yas-minor-mode) :config (setq tab-width 2) ;; Env vars (when (not is-win64) (with-eval-after-load 'exec-path-from-shell (exec-path-from-shell-copy-envs '("GOPATH" "GO111MODULE" "GOPROXY"))) ) (setq gofmt-command "goimports") (add-hook 'before-save-hook #'gofmt-before-save)

;; Install or update tools (defvar go--tools '("golang.org/x/tools/gopls" "golang.org/x/tools/cmd/goimports" "honnef.co/go/tools/cmd/staticcheck" "github.com/kisielk/errcheck" "github.com/go-delve/delve/cmd/dlv" "github.com/zmb3/gogetdoc" "github.com/josharian/impl" "github.com/cweill/gotests/..." "github.com/fatih/gomodifytags" "github.com/davidrjenni/reftools/cmd/fillstruct" "github.com/golangci/golangci-lint/cmd/golangci-lint" ) "All necessary go tools.")

(defun go-update-tools () "Install or update go tools." (interactive) (unless (executable-find "go") (user-error "Unable to find go' inexec-path'!"))

(message "Installing go tools...")
(dolist (pkg go--tools)
  (set-process-sentinel
   (start-process "go-tools" "*Go Tools*" "go" "install" "-v" "-x" (concat pkg "@latest"))
   (lambda (proc _)
     (let ((status (process-exit-status proc)))
       (if (= 0 status)
           (message "Installed %s" pkg)
         (message "Failed to install %s: %d" pkg status))))))

(unless (executable-find "gopls")
  (go-update-tools))))

;; godoctor 重构 (use-package godoctor)

;; go-dlv 调试 (use-package go-dlv) ;; go-fill-struct 填充结构体 (use-package go-fill-struct) ;; gotest 测试 (use-package gotest) ;; go-impl 实现接口 (use-package go-impl) ;; go-gen-test 生产test文件 (use-package go-gen-test)

;; emacs-go-tag 添加tag (use-package go-tag :init (setq go-tag-args (list "-transform" "snakecase")))

;; go-playground (use-package go-playground :diminish :commands (go-playground-mode))

;; go-errcheck 检测 (use-package go-errcheck)

;; flycheck-golangci-lint (use-package flycheck-golangci-lint :if (executable-find "golangci-lint") :after flycheck :defines flycheck-disabled-checkers :hook (go-mode . (lambda () "Enable golangci-lint" (setq flycheck-disabled-checkers '(go-gofmt go-golint go-vet go-build go-test go-errcheck)) (flycheck-golangci-lint-setup))))

;; go-eldoc (use-package go-eldoc :hook (go-mode . go-eldoc-setup))

;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; cc ;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package cc-mode :ensure nil :hook (c-mode-common . (lambda () (c-set-style "stroustrup"))) :init (setq-default c-basic-offset 4))

(use-package modern-cpp-font-lock :diminish :hook (cc-mode . modern-c++-font-lock-global-mode))

(use-package cmake-ide :init (cmake-ide-setup))

;;;;;;;;;;;;;;;;;;;;;;;; ;; lua ;;;;;;;;;;;;;;;;;;;;;;;; (use-package lua-mode :defer t :delight "Λ " :mode ("//.lua'" . lua-mode) :interpreter ("lua" . lua-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; elisp ;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package elisp-mode :ensure nil :delight "ξ ")

;; eldoc (use-package eldoc :diminish :hook (after-init . eldoc-mode) :config (use-package eldoc-box :after eldoc) )

;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; misc ;;;;;;;;;;;;;;;;;;;;;;;;; ;; youdao-dict 有道词典 (use-package youdao-dictionary)

;; docker 容器 (use-package docker)

;; docker compose 容器集合 (use-package docker-compose-mode)

;; dockerfile 容器配置 (use-package dockerfile-mode :delight "δ " :mode "Dockerfile\'")

;; sql-indent sql对齐 (use-package sql-indent :after (:any sql sql-interactive-mode) :delight sql-mode "Σ ")

;; ini 配置 (use-package ini-mode :defer 2 :delight "I " :mode ("\.ini\'"))

;; json 配置 (use-package json-mode :defer t :delight "J " :mode "\.json\'")

;; yaml 配置 (use-package yaml-mode :defer t :delight "ψ " :mode "\.yml\'")

;; restclient http客户端 (use-package restclient :defer t)

;; rainbow parent 彩虹括号 (use-package rainbow-delimiters :defer t :hook (prog-mode . rainbow-delimiters-mode))

;; color-indentifier-mode 颜色标识 (use-package color-identifiers-mode :defer t :hook (after-init . global-color-identifiers-mode))

;; dumb-jump 跳转 (use-package dumb-jump :defer t :config (add-hook 'xref-backend-functions #'dumb-jump-xref-activate))

;; format-all 格式化 (use-package format-all :hook (go-mode . format-all-mode) :hook (rust-mode . format-all-mode))

;; aggressive-indent 对齐 (use-package aggressive-indent :hook (emacs-lisp-mode . aggressive-indent-mode) :hook (rust-mode . aggressive-indent-mode) :hook (go-mode . aggressive-indent-mode) :hook (c-mode . aggressive-indent-mode) :hook (c++-mode . aggressive-indent-mode) :config (add-to-list 'aggressive-indent-dont-indent-if '(and (derived-mode-p 'c++-mode) (null (string-match "\([;{}]\|\b\(if\|for\|while\)\b\)" (thing-at-point 'line))))))

;; pomidor 番茄计时 (use-package pomidor :hook (pomidor-mode . (lambda () (display-line-numbers-mode -1) ; Emacs 26.1+ (setq left-fringe-width 0 right-fringe-width 0) (setq left-margin-width 2 right-margin-width 0) ;; force fringe update (set-window-buffer nil (current-buffer)))) :config (setq pomidor-sound-tick nil pomidor-sound-tack nil alert-default-style 'mode-line) )

;; markdown 标记文本 (use-package markdown-mode :mode ("//.md//'" . markdown-mode))

;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; org ;;;;;;;;;;;;;;;;;;;;;;;;; (use-package org)

;; org-superstar 修改样式 (use-package org-superstar :after org :defer t :hook (org-mode . org-superstar-mode) :init (setq org-superstar-prettify-item-bullets t org-superstar-headline-bullets-list '("◉" "✸" "⚫" "○" "•") org-superstar-leading-bullet ?\s org-hide-leading-stars t org-superstar-item-bullet-alist '((?* . ?●) (?+ . ?➤) (?- . ?—))))

;; org-download 下载 (use-package org-download :defer t :after org :config (setq org-download-image-dir user/org-download-image-dir))

;; toc-org 目录标题 (use-package toc-org :defer t :after org :hook (org-mode . toc-org-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; vim ;;;;;;;;;;;;;;;;;;;;;;;;;; ;; evil vim按键模式模拟 (use-package evil :init (setq evil-want-keybinding nil evil-ex-substitute-global t) :config (evil-mode 1) ;;; relative line number (defun my-enable-relative-line-number () (interactive) (display-line-numbers-mode -1) (setq display-line-numbers-type 'relative) (display-line-numbers-mode 1))

(defun my-disable-relative-line-number () (interactive) (display-line-numbers-mode -1) (setq display-line-numbers-type t) (display-line-numbers-mode 1))

(add-hook 'evil-normal-state-entry-hook 'my-enable-relative-line-number) (add-hook 'evil-insert-state-entry-hook 'my-disable-relative-line-number) (add-hook 'evil-insert-state-exit-hook 'my-enable-relative-line-number))

;; evil-escape vim退出 (use-package evil-escape :init(evil-escape-mode 1) :bind ("C-g" . evil-escape) :config (progn (setq-default evil-escape-key-sequence "jk") (setq-default evil-escape-delay 0.2)))

;; function tools (defun my/open-init-file () "Edit the use-init-file, in another window." (interactive) (find-file user-init-file))

(defun my/kill-other-buffers () "Kill all buffers but the current one. Doesn't mess with special buffers." (interactive) (seq-each

'kill-buffer

(delete (current-buffer) (seq-filter #'buffer-file-name (buffer-list)))))

(defun my/save-all-buffers () "Save all buffers." (interactive) (seq-each

'save-buffer (buffer-list)))

(defun my/fullscreen () "Set Fullscreen." (interactive) (set-frame-parameter nil 'fullscreen (if (frame-parameter nil 'fullscreen) nil 'fullboth)))

(use-package which-key :hook (after-init . which-key-mode) :config (setq which-key-popup-type 'minibuffer which-key-max-description-length 30 which-key-show-remaining-keys t) )

;; general (use-package general :config (general-evil-setup)

(general-define-key :states '(normal visual motion) :keymaps 'override "gd" 'xref-find-definitions )

(general-define-key :states '(normal visual motion) :keymaps 'override "gb" 'xref-find-references)

(general-define-key :states '(normal visual motion) :keymaps 'override "C-o" 'xref-pop-marker-stack)

(general-define-key :states)

(general-create-definer leader-key :states '(normal visual motion emacs) :prefix "SPC" :keymaps 'override )

;; command (leader-key "SPC" '(execute-extended-command :wk "M-x")) ;; 调用M-x

;; buffer (leader-key "b" '(:ignore t :wk "buffer & bookmark") "b1" '(my/kill-other-buffers :wk "kill other") "bb" '(consult-buffer :wk "list") "bd" '(evil-delete-buffer :wk "delete") "bn" '(evil-next-buffer :wk "next") "bp" '(evil-prev-buffer :wk "prev") "bc" '(evil-buffer-new :wk "create") "bm" '(consult-bookmark :wk "list bookmarks") "br" '(bookmark-delete :wk "delete bookmark") )

;; comment (leader-key "c" '(:ignore t :wk "comment") "cc" '(comment-or-uncomment :wk "comment") "cr" '(comment-or-uncomment-region :wk "comment region") )

;; docker (leader-key "d" '(:ignore t :wk "docker") "dd" '(docker :wk "docker") )

;; file (leader-key "f" '(:ignore t :wk "file") "fa" '(align-regexp :wk "align") "ff" '(find-file :wk "find") "fo" '(consult-outline :wk "outline") "fc" '(dired-create-empty-file :wk "create") "fd" '(dired-create-directory :wk "create dir") "fs" '(save-buffer :wk "save") "fr" '(ranger :wk "ranger") "ft" '(dired :wk "dired") "fm" '(follow-mode :wk "follow") "fe" '(ediff :wk "diff") "fS" '(my/save-all-buffers :wk "save all") "fR" '(rename-file :wk "rename") "fD" '(delete-file :wk "delete") )

;; git (leader-key "g" '(:ignore t :wk "git") "gs" '(magit-status :wk "status") "gg" '(magit-dispatch :wk "dispatch") "gv" '(git-timemachine-toggle :wk "timemachine") "gr" '(consult-git-grep :wk "grep") )

;; windows (leader-key "w" '(:ignore t :wk "window") "w1" '(delete-other-windows :wk "delete other") "wu" '(winner-undo :wk "undo") "wr" '(winner-redo :wk "redo") "ws" '(evil-window-split :wk "split") "wv" '(evil-window-vsplit :wk "vsplit") "wd" '(evil-window-delete :wk "delete") "wh" '(evil-window-left :wk "left") "wj" '(evil-window-bottom :wk "bottom") "wk" '(evil-window-up :wk "up") "wl" '(evil-window-right :wk "right") "wo" '(other-window :wk "other") "wf" '(toggle-frame-fullscreen :wk "fullscreen") "wz" '(zoom-window-zoom :wk "zoom") "ww" '(zoom-window-next :wk "next") )

;; search (leader-key "s" '(:ignore t :wk "search") "ss" '(consult-ripgrep :wk "ripgrep") "sl" '(consult-line :wk "line") "sL" '(consult-line-multi :wk "line multi") "sf" '(consult-flycheck :wk "flycheck") "sr" '(rg-menu :wk "ripgrep") "si" '(consult-imenu :wk "imenu") "sI" '(consult-imenu-multi :wk "imenu multi") )

;; project (leader-key "p" '(:ignore t :wk "project") "pp" '(consult-dir :wk "switch") "pa" '(projectile-add-known-project :wk "add") )

;; org (leader-key "o" '(:ignore t :wk "org") "oo" '(consult-org-agenda :wk "list agenda") "oa" '(org-agenda :wk "agenda") "oc" '(org-capture :wk "capture") "ob" '(org-switchb :wk "switchb") "ow" '(org-refile :wk "refile") )

;; theme & dictionary (leader-key "t" '(:ignore t :wk "theme & dictionary") "tt" '(consult-theme :wk "theme") "tr" '(youdao-dictionary-search-at-point-posframe :wk "yodao at point") "tR" '(youdao-dictionary-search-from-input :wk "youdao input") )

;; help (leader-key "h" '(:ignore t :wk "help") "hh" '(helpful-callable :wk "callable") "ha" '(consult-apropos :wk "apropos") "hc" '(helpful-command :wk "command") "hf" '(helpful-function :wk "function") "hi" '(consult-man :wk "man") "hk" '(helpful-key :wk "key") "hm" '(helpful-macro :wk "macro") "hv" '(helpful-variable :wk "variable") "hp" '(helpful-at-point :wk "at point") )

;; view (leader-key "v" '(:ignore t :wk "view") "vw" '(webjump :wk "webjump") "vt" '(type-break :wk "type break") "vo" '(pomidor :wk "pomidor") "vl" '(consult-goto-line :wk "goto-line") )

;; emacs & package (leader-key "q" '(:ignore t :wk "emacs") "qq" '(save-buffers-kill-emacs :wk "quit") "qr" '(restart-emacs :wk "restart") "qu" '(upgrade-packages :wk "upgrade pkgs") )

;; go-mode-map (leader-key go-mode-map "m" '(:ignore :wk "golang") "ma" '(go-import-add :wk "add import") "mR" '(go-remove-unused-imports :wk "remove unused import") "md" '(dlv :wk "dlv debug") "ml" '(go-impl :wk "impl") "ma" '(go-tag-add :wk "add tag") "mr" '(go-tag-remove :wk "remove tag") "ms" '(go-fill-struct :wk "fill struct") "mf" '(gofmt :wk "gofmt") "m." '(godoc-at-point :wk "godoc") "mx" '(go-run :wk "run") "mp" '(go-playground :wk "playground") "mt" '(:ignore :wk "test") "mtt" '(go-gen-test-dwim :wk "gen") "mtf" '(go-test-current-file :wk "file") "mtt" '(go-test-current-test :wk "test") "mtp" '(go-test-current-project :wk "project") "mtb" '(go-test-current-benchmark :wk "benchmark") "mtc" '(go-test-current-coverage :wk "coverage") )

;; rustic-mode (leader-key rustic-mode-map "m" '(:ignore t :wk "rust") "mx" '(rustic-compile :wk "compile") "ma" '(rustic-cargo-add :wk "cargo add") "mr" '(rustic-cargo-rm :wk "cargo remove") "mu" '(rustic-cargo-upgrade :wk "cargo upgrade") "mf" '(rustic-cargo-fmt :wk "cargo fmt") "mo" '(rustic-cargo-outdated :wk "cargo outdated") "my" '(rustic-cargo-clippy :wk "cargo clippy") "mt" '(:ignore t :wk "test") "mtt" '(rustic-cargo-current-test :wk "test") "mtp" '(rustic-cargo-test :wk "project") "mtx" '(rustic-cargo-run :wk "run") )

;; lua-mode (leader-key lua-mode-map "m" '(:ignore t :wk "lua") "mx" '(run-lua :wk "run") )

;; c-cc-mode (leader-key c-mode-base-map "m" '(:ignore t :wk "c") "mx" '(compile :wk "compile") ) )

(provide 'init)

;;; init.el ends here