1;;; package --- Emacs 编辑器内置配置2;;; Commentary:34;;; Code:5;; 设置 C-v/A-v 滚半屏幕6(defun window-half-height ()7 (max 1 (/ (1- (window-height (selected-window))) 2)))8(defun pixel-window-half-height()9 (/ (1- (window-text-height (selected-window) t)) 2))1011(defun scroll-up-half ()12 (interactive)13 (scroll-up (window-half-height)))1415(defun scroll-down-half ()16 (interactive)17 (scroll-down (window-half-height)))1819(defun pixel-scroll-down-half ()20 (interactive)21 (if pixel-scroll-precision-interpolate-page22 (pixel-scroll-precision-interpolate (pixel-window-half-height)23 nil 1)24 (cua-scroll-down)))2526(defun pixel-scroll-up-half ()27 (interactive)28 (if pixel-scroll-precision-interpolate-page29 (pixel-scroll-precision-interpolate (- (pixel-window-half-height))30 nil 1)31 (cua-scroll-up)))3233(defun tramp-cleanup-all ()34 "Call tramp-cleanup-all-buffers and tramp-cleanup-all-connections"35 (interactive)36 (tramp-cleanup-all-buffers)37 (tramp-cleanup-all-connections))3839(use-package emacs40 ;; 内置模式的 indent 设置41 :hook ((eshell-mode . (lambda () (display-line-numbers-mode 0)))42 (vterm-mode . (lambda () (display-line-numbers-mode 0)))43 (inferior-python-mode . (lambda () (display-line-numbers-mode 0))))44 :init45 (setq backup-directory-alist `(("." . "~/.saves"))46 tramp-auto-save-directory "~/.saves")4748 (unless (display-graphic-p)49 (xterm-mouse-mode 1)50 (global-set-key (kbd "<mouse-4>") 'scroll-down-line)51 (global-set-key (kbd "<mouse-5>") 'scroll-up-line))52 (menu-bar-mode -1)5354 (when window-system55 (tool-bar-mode -1))56 (setq tool-bar-mode nil57 memu-bar-mode nil)5859 ;; line number60 (global-display-line-numbers-mode t)61 (global-auto-revert-mode t)62 (global-visual-line-mode t)6364 ;; charset65 (prefer-coding-system 'utf-8)66 (set-default-coding-systems 'utf-8)67 (set-terminal-coding-system 'utf-8)68 (set-keyboard-coding-system 'utf-8)69 (set-language-environment "UTF-8")7071 ;; tab mode72 (setq-default indent-tabs-mode nil)73 (setq-default tab-width 8)74 (setq-default c-basic-offset 8)75 (setq-default js-indent-level 2)7677 ;; switch mode-lin-modes and mode-line-misc-info, to show which-function78 (setq-default mode-line-format '("%e" mode-line-front-space79 (:propertize80 ("" mode-line-mule-info mode-line-client mode-line-modified mode-line-remote)81 display82 (min-width83 (5.0)))84 mode-line-frame-identification mode-line-buffer-identification " " mode-line-position85 (vc-mode vc-mode)86 " " mode-line-misc-info mode-line-modes mode-line-end-spaces))8788 (auth-source-pass-enable)89 :config90 ;; theme91 (load-theme 'modus-operandi t)92 (setq display-buffer-alist '())9394 (windmove-default-keybindings 'meta)9596 (pixel-scroll-mode 1)97 (setq pixel-scroll-precision-interpolate-page t)98 (setq alert-default-style 'libnotify)99100 (setq vc-ignore-dir-regexp101 (format "\\(%s\\)\\|\\(%s\\)"102 vc-ignore-dir-regexp103 tramp-file-name-regexp))104 :bind105 ("<next>" . 'pixel-scroll-interpolate-down)106 ("<prior>" . 'pixel-scroll-interpolate-up)107 ("C-v" . (lambda () (interactive)108 (scroll-up (max 1 (/ (* (1- (window-height (selected-window)))3) 4)))))109 ("C-x u" . (lambda () (interactive)110 (let ((default-directory "/doas::/"))111 (call-interactively 'find-file))))112 ("M-v" . (lambda () (interactive)113 (scroll-down (max 1 (/ (* (1- (window-height (selected-window)))3) 4))))))114115(use-package term-title116 :load-path "lisp/lib"117 :init118 (setq frame-title-format119 '((:eval (if (buffer-file-name)120 (abbreviate-file-name (buffer-file-name))121 "%b"))122 (:eval (if (buffer-modified-p)123 " •"))124 (:eval (if (getenv "SSH_CLIENT") (concat " [" (system-name) "]" )))125 " Emacs"))126 :hook127 (after-init . term-title-mode))128129(use-package ace-window130 :ensure t131 :bind ("M-o" . ace-window) ; 代替之前的 M-1, M-2132 :config133 (defun aw--switch-buffer ()134 (call-interactively 'consult-buffer))135 ;; 只使用主行的左手和右手字母,绝不挨数字键136 (setq aw-keys '(?a ?s ?d ?f ?j ?k ?l ?\;)137 aw-dispatch-always t))138139(use-package buffer-focus-hook140 :demand t141 :load-path "lisp/lib")142143(use-package god-mode144 :config145 (defun my-god-mode-update-mode-line ()146 (cond147 (god-local-mode148 (set-face-attribute 'mode-line nil149 :foreground "#604000"150 :background "#fff29a")151 (set-face-attribute 'mode-line-inactive nil152 :foreground "#3f3000"153 :background "#fff3da"))154 (t155 (set-face-attribute 'mode-line nil156 :foreground "#0a0a0a"157 :background "#d7d7d7")158 (set-face-attribute 'mode-line-inactive nil159 :foreground "#404148"160 :background "#efefef"))))161 (add-to-list 'god-exempt-major-modes 'vterm-mode)162 (add-to-list 'god-exempt-major-modes 'erc-mode)163 (add-to-list 'god-exempt-major-modes 'lisp-interaction-mode)164165 :hook166 ((post-command . my-god-mode-update-mode-line)167 (after-init . god-mode-all))168 ;; active god mode when focus out169 ;; (buffer-focus-out . (lambda () (when (and170 ;; god-global-mode171 ;; (god-passes-predicates-p)172 ;; (not (god-exempt-mode-p)))173 ;; (god-mode-maybe-activate)))))174 :bind175 ("<end>" . god-local-mode)176 ("C-x C-1" . #'delete-other-windows)177 ("C-x C-2" . #'split-window-below)178 ("C-x C-3" . #'split-window-right)179 ("C-x C-0" . #'delete-window)180 ("C-x C-k" . #'kill-buffer)181182 (:map god-local-mode-map183 ("DEL" . #'kill-region)184 ("o" . (lambda ()(interactive) (progn (end-of-line) (newline-and-indent) (god-local-mode -1))))185 ("E" . (lambda()(interactive) (progn (end-of-line)(god-local-mode -1))))186 ("[" . #'backward-paragraph)187 ("]" . #'forward-paragraph)188 ("." . #'repeat)))189190(use-package ibuffer :ensure nil191 :config192 (setq ibuffer-expert t193 ibuffer-display-summary nil194 ibuffer-use-other-window nil195 ibuffer-show-empty-filter-groups nil196 ibuffer-default-sorting-mode 'filename/process197 ibuffer-use-header-line t198 ibuffer-default-shrink-to-minimum-size nil)199 (setq ibuffer-formats200 '((mark modified read-only locked " "201 (name 30 30 :left :elide)202 " "203 (size 9 -1 :right)204 " "205 (mode 16 16 :left :elide)206 " " filename-and-process)207 (mark " "208 (name 16 -1)209 " " filename)))210 (setq ibuffer-saved-filter-groups211 '(("Main"212 ("Directories" (mode . dired-mode))213 ("C++" (or214 (mode . c++-mode)215 (mode . c++-ts-mode)216 (mode . c-mode)217 (mode . c-ts-mode)218 (mode . c-or-c++-ts-mode)))219 ("Golang" (or220 (mode . go-mode)))221 ("Python" (or222 (mode . python-ts-mode)223 (mode . cython-mode)224 (mode . python-mode)))225 ("Build" (or226 (mode . make-mode)227 (mode . makefile-gmake-mode)228 (name . "^Makefile$")229 (mode . change-log-mode)))230 ("Scripts" (or231 (mode . shell-script-mode)232 (mode . shell-mode)233 (mode . sh-mode)234 (mode . lua-mode)235 (mode . bat-mode)))236 ("Config" (or237 (mode . conf-mode)238 (mode . conf-toml-mode)239 (mode . toml-ts-mode)240 (mode . conf-windows-mode)241 (name . "^\\.clangd$")242 (name . "^\\.gitignore$")243 (name . "^Doxyfile$")244 (name . "^config\\.toml$")245 (mode . yaml-mode)))246 ("Web" (or247 (mode . mhtml-mode)248 (mode . html-mode)249 (mode . web-mode)250 (mode . nxml-mode)))251 ("CSS" (or252 (mode . css-mode)253 (mode . sass-mode)))254 ("JS" (or255 (mode . js-mode)256 (mode . rjsx-mode)))257 ("Markup" (or258 (mode . markdown-mode)259 (mode . adoc-mode)))260 ("Org" (mode . org-mode))261 ("LaTeX" (name . "\.tex$"))262 ("Magit" (or263 (mode . magit-blame-mode)264 (mode . magit-cherry-mode)265 (mode . magit-diff-mode)266 (mode . magit-log-mode)267 (mode . magit-process-mode)268 (mode . magit-status-mode)))269 ("Apps" (or270 (mode . elfeed-search-mode)271 (mode . elfeed-show-mode)))272 ("Fundamental" (or273 (mode . fundamental-mode)274 (mode . text-mode)))275 ("IRC" (or276 (mode . erc-mode)277 (mode . circe-mode)278 (mode . circe-server-mode)279 (mode . circe-channel-mode)280 (mode . circe-chat-mode)281 (mode . circe-display-MODE)282 (mode . circe-lagmon-mode)283 (mode . circe-query-mode)))284 ("XMPP" (or285 (mode . jabber-chat-mode)286 (mode . jabber-roster-mode)287 (mode . jabber-browse-mode)288 (mode . jabber-console-mode)))289 ("Terminal" (or290 (mode . vterm-mode)291 (mode . term-mode)292 (mode . eshell-mode)))293 ("Emacs" (or294 (mode . emacs-lisp-mode)295 (name . "^\\*Help\\*$")296 (name . "^\\*Custom.*")297 (name . "^\\*Org Agenda\\*$")298 (name . "^\\*info\\*$")299 (name . "^\\*scratch\\*$")300 (name . "^\\*Backtrace\\*$")301 (name . "^\\*Messages\\*$"))))))302 :hook303 (ibuffer-mode . (lambda ()304 (ibuffer-switch-to-saved-filter-groups "Main"))))305306(use-package tramp307 :config308 (tramp-set-completion-function309 "ssh" (append (tramp-get-completion-function "ssh")310 (mapcar (lambda (file) `(tramp-parse-sconfig ,file))311 (directory-files312 "~/.ssh/conf.d/"313 'full directory-files-no-dot-files-regexp))))314 (customize-set-variable315 'tramp-ssh-controlmaster-options316 (concat317 "-o ControlPath=~/.ssh/controlmaster/%%r@%%h:%%p "318 "-o ControlMaster=auto -o ControlPersist=1h")))319320(use-package beframe321 :after consult322 :init323 (beframe-mode 1)324 :config325 (defface beframe-buffer326 '((t :inherit font-lock-string-face))327 "Face for `consult' framed buffers.")328329 (defun my-beframe-buffer-names-sorted (&optional frame)330 (beframe-buffer-names frame :sort #'beframe-buffer-sort-visibility))331332 (defvar beframe-consult-source333 `( :name "Frame-specific buffers (current frame)"334 :narrow ?F335 :category buffer336 :face beframe-buffer337 :history beframe-history338 :items ,#'my-beframe-buffer-names-sorted339 :action ,#'switch-to-buffer340 :state ,#'consult--buffer-state))341342 (setq beframe-global-buffers '("*scratch*" "*Messages*" "*Backtrace*"))343 (setq consult-source-buffer344 (plist-put consult-source-buffer :hidden t))345346 (add-to-list 'consult-buffer-sources 'beframe-consult-source)347348 ;; (declare-function consult--buffer-state "consult")349 ;; (defun consult-beframe-buffer-list (&optional frame)350 ;; (beframe-buffer-list frame :sort #'beframe-buffer-sort-visibility))351352 ;; (setq consult-buffer-list-function #'consult-beframe-buffer-list))353)354355(provide 'init-preference)356;;; init-preference.el ends here357