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(use-package emacs34 ;; 内置模式的 indent 设置35 :hook ((eshell-mode . (lambda () (display-line-numbers-mode 0)))36 (vterm-mode . (lambda () (display-line-numbers-mode 0)))37 (inferior-python-mode . (lambda () (display-line-numbers-mode 0))))38 :init39 (setq backup-directory-alist `(("." . "~/.saves"))40 tramp-auto-save-directory "~/.saves")4142 (unless (display-graphic-p)43 (xterm-mouse-mode 1)44 (global-set-key (kbd "<mouse-4>") 'scroll-down-line)45 (global-set-key (kbd "<mouse-5>") 'scroll-up-line))46 (menu-bar-mode -1)4748 (when window-system49 (tool-bar-mode -1))50 (setq tool-bar-mode nil51 memu-bar-mode nil)5253 ;; line number54 (global-display-line-numbers-mode t)55 (global-auto-revert-mode t)56 (global-visual-line-mode t)5758 ;; charset59 (prefer-coding-system 'utf-8)60 (set-default-coding-systems 'utf-8)61 (set-terminal-coding-system 'utf-8)62 (set-keyboard-coding-system 'utf-8)63 (set-language-environment "UTF-8")6465 ;; tab mode66 (setq-default indent-tabs-mode nil)67 (setq-default tab-width 8)68 (setq-default c-basic-offset 8)69 (setq-default js-indent-level 2)7071 ;; switch mode-lin-modes and mode-line-misc-info, to show which-function72 (setq-default mode-line-format '("%e" mode-line-front-space73 (:propertize74 ("" mode-line-mule-info mode-line-client mode-line-modified mode-line-remote)75 display76 (min-width77 (5.0)))78 mode-line-frame-identification mode-line-buffer-identification " " mode-line-position79 (vc-mode vc-mode)80 " " mode-line-misc-info mode-line-modes mode-line-end-spaces))8182 (auth-source-pass-enable)83 :config84 ;; theme85 (load-theme 'modus-operandi t)86 (setq display-buffer-alist '())8788 (windmove-default-keybindings 'meta)8990 (pixel-scroll-mode 1)91 (setq pixel-scroll-precision-interpolate-page t)92 (setq alert-default-style 'libnotify)9394 (setq vc-ignore-dir-regexp95 (format "\\(%s\\)\\|\\(%s\\)"96 vc-ignore-dir-regexp97 tramp-file-name-regexp))98 :bind99 ("<next>" . 'pixel-scroll-interpolate-down)100 ("<prior>" . 'pixel-scroll-interpolate-up)101 ("C-v" . (lambda () (interactive)102 (scroll-up (max 1 (/ (* (1- (window-height (selected-window)))3) 4)))))103 ("C-x u" . (lambda () (interactive)104 (let ((default-directory "/doas::/"))105 (call-interactively 'find-file))))106 ("M-v" . (lambda () (interactive)107 (scroll-down (max 1 (/ (* (1- (window-height (selected-window)))3) 4))))))108109(use-package term-title110 :load-path "lisp/lib"111 :init112 (setq frame-title-format113 '((:eval (if (buffer-file-name)114 (abbreviate-file-name (buffer-file-name))115 "%b"))116 (:eval (if (buffer-modified-p)117 " •"))118 (:eval (if (getenv "SSH_CLIENT") (concat " [" (system-name) "]" )))119 " Emacs"))120 :hook121 (after-init . term-title-mode))122123(use-package window-numbering124 :hook (after-init . window-numbering-mode))125126(use-package buffer-focus-hook127 :demand t128 :load-path "lisp/lib")129130(use-package god-mode131 :config132 (defun my-god-mode-update-mode-line ()133 (cond134 (god-local-mode135 (set-face-attribute 'mode-line nil136 :foreground "#604000"137 :background "#fff29a")138 (set-face-attribute 'mode-line-inactive nil139 :foreground "#3f3000"140 :background "#fff3da"))141 (t142 (set-face-attribute 'mode-line nil143 :foreground "#0a0a0a"144 :background "#d7d7d7")145 (set-face-attribute 'mode-line-inactive nil146 :foreground "#404148"147 :background "#efefef"))))148 (add-to-list 'god-exempt-major-modes 'vterm-mode)149 (add-to-list 'god-exempt-major-modes 'erc-mode)150 (add-to-list 'god-exempt-major-modes 'lisp-interaction-mode)151152 :hook153 ((post-command . my-god-mode-update-mode-line)154 (after-init . god-mode-all))155 ;; active god mode when focus out156 ;; (buffer-focus-out . (lambda () (when (and157 ;; god-global-mode158 ;; (god-passes-predicates-p)159 ;; (not (god-exempt-mode-p)))160 ;; (god-mode-maybe-activate)))))161 :bind162 ("<end>" . god-local-mode)163 ("C-x C-1" . #'delete-other-windows)164 ("C-x C-2" . #'split-window-below)165 ("C-x C-3" . #'split-window-right)166 ("C-x C-0" . #'delete-window)167 ("C-x C-k" . #'kill-buffer)168169 (:map god-local-mode-map170 ("DEL" . #'kill-region)171 ("o" . (lambda ()(interactive) (progn (end-of-line) (newline-and-indent) (god-local-mode -1))))172 ("E" . (lambda()(interactive) (progn (end-of-line)(god-local-mode -1))))173 ("[" . #'backward-paragraph)174 ("]" . #'forward-paragraph)175 ("." . #'repeat)))176177(use-package ibuffer :ensure nil178 :config179 (setq ibuffer-expert t180 ibuffer-display-summary nil181 ibuffer-use-other-window nil182 ibuffer-show-empty-filter-groups nil183 ibuffer-default-sorting-mode 'filename/process184 ibuffer-use-header-line t185 ibuffer-default-shrink-to-minimum-size nil)186 (setq ibuffer-formats187 '((mark modified read-only locked " "188 (name 30 30 :left :elide)189 " "190 (size 9 -1 :right)191 " "192 (mode 16 16 :left :elide)193 " " filename-and-process)194 (mark " "195 (name 16 -1)196 " " filename)))197 (setq ibuffer-saved-filter-groups198 '(("Main"199 ("Directories" (mode . dired-mode))200 ("C++" (or201 (mode . c++-mode)202 (mode . c++-ts-mode)203 (mode . c-mode)204 (mode . c-ts-mode)205 (mode . c-or-c++-ts-mode)))206 ("Golang" (or207 (mode . go-mode)))208 ("Python" (or209 (mode . python-ts-mode)210 (mode . cython-mode)211 (mode . python-mode)))212 ("Build" (or213 (mode . make-mode)214 (mode . makefile-gmake-mode)215 (name . "^Makefile$")216 (mode . change-log-mode)))217 ("Scripts" (or218 (mode . shell-script-mode)219 (mode . shell-mode)220 (mode . sh-mode)221 (mode . lua-mode)222 (mode . bat-mode)))223 ("Config" (or224 (mode . conf-mode)225 (mode . conf-toml-mode)226 (mode . toml-ts-mode)227 (mode . conf-windows-mode)228 (name . "^\\.clangd$")229 (name . "^\\.gitignore$")230 (name . "^Doxyfile$")231 (name . "^config\\.toml$")232 (mode . yaml-mode)))233 ("Web" (or234 (mode . mhtml-mode)235 (mode . html-mode)236 (mode . web-mode)237 (mode . nxml-mode)))238 ("CSS" (or239 (mode . css-mode)240 (mode . sass-mode)))241 ("JS" (or242 (mode . js-mode)243 (mode . rjsx-mode)))244 ("Markup" (or245 (mode . markdown-mode)246 (mode . adoc-mode)))247 ("Org" (mode . org-mode))248 ("LaTeX" (name . "\.tex$"))249 ("Magit" (or250 (mode . magit-blame-mode)251 (mode . magit-cherry-mode)252 (mode . magit-diff-mode)253 (mode . magit-log-mode)254 (mode . magit-process-mode)255 (mode . magit-status-mode)))256 ("Apps" (or257 (mode . elfeed-search-mode)258 (mode . elfeed-show-mode)))259 ("Fundamental" (or260 (mode . fundamental-mode)261 (mode . text-mode)))262 ("IRC" (or263 (mode . erc-mode)264 (mode . circe-mode)265 (mode . circe-server-mode)266 (mode . circe-channel-mode)267 (mode . circe-chat-mode)268 (mode . circe-display-MODE)269 (mode . circe-lagmon-mode)270 (mode . circe-query-mode)))271 ("XMPP" (or272 (mode . jabber-chat-mode)273 (mode . jabber-roster-mode)274 (mode . jabber-browse-mode)275 (mode . jabber-console-mode)))276 ("Terminal" (or277 (mode . vterm-mode)278 (mode . term-mode)279 (mode . eshell-mode)))280 ("Emacs" (or281 (mode . emacs-lisp-mode)282 (name . "^\\*Help\\*$")283 (name . "^\\*Custom.*")284 (name . "^\\*Org Agenda\\*$")285 (name . "^\\*info\\*$")286 (name . "^\\*scratch\\*$")287 (name . "^\\*Backtrace\\*$")288 (name . "^\\*Messages\\*$"))))))289 :hook290 (ibuffer-mode . (lambda ()291 (ibuffer-switch-to-saved-filter-groups "Main"))))292293(use-package tramp294 :config295 (tramp-set-completion-function296 "ssh" (append (tramp-get-completion-function "ssh")297 (mapcar (lambda (file) `(tramp-parse-sconfig ,file))298 (directory-files299 "~/.ssh/conf.d/"300 'full directory-files-no-dot-files-regexp))))301 (customize-set-variable302 'tramp-ssh-controlmaster-options303 (concat304 "-o ControlPath=~/.ssh/controlmaster/%%r@%%h:%%p "305 "-o ControlMaster=auto -o ControlPersist=1h")))306307(use-package beframe308 :after consult309 :init310 (beframe-mode 1)311 :config312 (defface beframe-buffer313 '((t :inherit font-lock-string-face))314 "Face for `consult' framed buffers.")315316 (defun my-beframe-buffer-names-sorted (&optional frame)317 (beframe-buffer-names frame :sort #'beframe-buffer-sort-visibility))318319 (defvar beframe-consult-source320 `( :name "Frame-specific buffers (current frame)"321 :narrow ?F322 :category buffer323 :face beframe-buffer324 :history beframe-history325 :items ,#'my-beframe-buffer-names-sorted326 :action ,#'switch-to-buffer327 :state ,#'consult--buffer-state))328329 (setq beframe-global-buffers '("*scratch*" "*Messages*" "*Backtrace*"))330 (setq consult-source-buffer331 (plist-put consult-source-buffer :hidden t))332333 (add-to-list 'consult-buffer-sources 'beframe-consult-source)334335 ;; (declare-function consult--buffer-state "consult")336 ;; (defun consult-beframe-buffer-list (&optional frame)337 ;; (beframe-buffer-list frame :sort #'beframe-buffer-sort-visibility))338339 ;; (setq consult-buffer-list-function #'consult-beframe-buffer-list))340)341342(provide 'init-preference)343;;; init-preference.el ends here344