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))818283 (auth-source-pass-enable)84 :config85 ;; theme86 (load-theme 'modus-operandi t)87 (setq display-buffer-alist '())8889 ;; font90 ;; disabled: I use TUI91 ;; (defun styling/set-font ()92 ;; "Set fonts"93 ;; (set-face-attribute 'default nil :font (font-spec :family "Noto Sans Mono" :size 14))94 ;; (set-fontset-font t 'unicode (font-spec :family "OpenMoji" :size 14))95 ;; (set-fontset-font t 'cjk-misc (font-spec :family "Noto Sans Mono CJK SC" :size 14) nil 'prepend))96 ;; (when window-system (styling/set-font))97 ;; (if (daemonp)98 ;; (add-hook 'after-make-frame-functions99 ;; (lambda (frame)100 ;; (with-selected-frame frame101 ;; (when window-system102 ;; (styling/set-font))))))103104 (windmove-default-keybindings 'meta)105106 (pixel-scroll-mode 1)107 (setq pixel-scroll-precision-interpolate-page t)108 (setq alert-default-style 'libnotify)109110 (setq vc-ignore-dir-regexp111 (format "\\(%s\\)\\|\\(%s\\)"112 vc-ignore-dir-regexp113 tramp-file-name-regexp))114 :bind115 ("<next>" . 'pixel-scroll-interpolate-down)116 ("<prior>" . 'pixel-scroll-interpolate-up)117 ;; ("C-v" . 'pixel-scroll-up-half)118 ("C-v" . (lambda () (interactive)119 (scroll-up (max 1 (/ (* (1- (window-height (selected-window)))3) 4)))))120 ("C-x u" . (lambda () (interactive)121 (let ((default-directory "/doas::/"))122 (call-interactively 'find-file))))123 ;;("M-v" . 'pixel-scroll-down-half))124 ("M-v" . (lambda () (interactive)125 (scroll-down (max 1 (/ (* (1- (window-height (selected-window)))3) 4))))))126127(use-package term-title128 :load-path "lisp/lib"129 :init130 (setq frame-title-format131 '((:eval (if (buffer-file-name)132 (abbreviate-file-name (buffer-file-name))133 "%b"))134 (:eval (if (buffer-modified-p)135 " •"))136 (:eval (if (getenv "SSH_CLIENT") (concat " [" (system-name) "]" )))137 " Emacs"))138 :hook139 (after-init . term-title-mode))140141(use-package window-numbering142 :hook (after-init . window-numbering-mode))143144(use-package buffer-focus-hook145 :demand t146 :load-path "lisp/lib")147148(use-package god-mode149 :config150 (defun my-god-mode-update-mode-line ()151 (cond152 (god-local-mode153 (set-face-attribute 'mode-line nil154 :foreground "#604000"155 :background "#fff29a")156 (set-face-attribute 'mode-line-inactive nil157 :foreground "#3f3000"158 :background "#fff3da"))159 (t160 (set-face-attribute 'mode-line nil161 :foreground "#0a0a0a"162 :background "#d7d7d7")163 (set-face-attribute 'mode-line-inactive nil164 :foreground "#404148"165 :background "#efefef"))))166 (add-to-list 'god-exempt-major-modes 'vterm-mode)167 (add-to-list 'god-exempt-major-modes 'erc-mode)168 (add-to-list 'god-exempt-major-modes 'lisp-interaction-mode)169170 :hook171 ((post-command . my-god-mode-update-mode-line)172 (after-init . god-mode-all)173 (buffer-focus-out . (lambda () (when (and174 god-global-mode175 (god-passes-predicates-p)176 (not (god-exempt-mode-p)))177 (god-mode-maybe-activate)))))178 :bind179 ("M-i" . god-local-mode)180 ("<end>" . god-local-mode)181 ("C-x C-1" . #'delete-other-windows)182 ("C-x C-2" . #'split-window-below)183 ("C-x C-3" . #'split-window-right)184 ("C-x C-0" . #'delete-window)185186 (:map god-local-mode-map187 ("DEL" . #'backward-char)188 ("o" . (lambda ()(interactive) (progn (end-of-line) (newline-and-indent) (god-local-mode -1))))189 ("i" . #'god-local-mode)190 ("[" . #'backward-paragraph)191 ("]" . #'forward-paragraph)192 ("z" . #'repeat)))193194195(use-package ibuffer :ensure nil196 :config197 (setq ibuffer-expert t198 ibuffer-display-summary nil199 ibuffer-use-other-window nil200 ibuffer-show-empty-filter-groups nil201 ibuffer-default-sorting-mode 'filename/process202 ibuffer-use-header-line t203 ibuffer-default-shrink-to-minimum-size nil)204 (setq ibuffer-formats205 '((mark modified read-only locked " "206 (name 30 30 :left :elide)207 " "208 (size 9 -1 :right)209 " "210 (mode 16 16 :left :elide)211 " " filename-and-process)212 (mark " "213 (name 16 -1)214 " " filename)))215 (setq ibuffer-saved-filter-groups216 '(("Main"217 ("Directories" (mode . dired-mode))218 ("C++" (or219 (mode . c++-mode)220 (mode . c++-ts-mode)221 (mode . c-mode)222 (mode . c-ts-mode)223 (mode . c-or-c++-ts-mode)))224 ("Golang" (or225 (mode . go-mode)))226 ("Python" (or227 (mode . python-ts-mode)228 (mode . cython-mode)229 (mode . python-mode)))230 ("Build" (or231 (mode . make-mode)232 (mode . makefile-gmake-mode)233 (name . "^Makefile$")234 (mode . change-log-mode)))235 ("Scripts" (or236 (mode . shell-script-mode)237 (mode . shell-mode)238 (mode . sh-mode)239 (mode . lua-mode)240 (mode . bat-mode)))241 ("Config" (or242 (mode . conf-mode)243 (mode . conf-toml-mode)244 (mode . toml-ts-mode)245 (mode . conf-windows-mode)246 (name . "^\\.clangd$")247 (name . "^\\.gitignore$")248 (name . "^Doxyfile$")249 (name . "^config\\.toml$")250 (mode . yaml-mode)))251 ("Web" (or252 (mode . mhtml-mode)253 (mode . html-mode)254 (mode . web-mode)255 (mode . nxml-mode)))256 ("CSS" (or257 (mode . css-mode)258 (mode . sass-mode)))259 ("JS" (or260 (mode . js-mode)261 (mode . rjsx-mode)))262 ("Markup" (or263 (mode . markdown-mode)264 (mode . adoc-mode)))265 ("Org" (mode . org-mode))266 ("LaTeX" (name . "\.tex$"))267 ("Magit" (or268 (mode . magit-blame-mode)269 (mode . magit-cherry-mode)270 (mode . magit-diff-mode)271 (mode . magit-log-mode)272 (mode . magit-process-mode)273 (mode . magit-status-mode)))274 ("Apps" (or275 (mode . elfeed-search-mode)276 (mode . elfeed-show-mode)))277 ("Fundamental" (or278 (mode . fundamental-mode)279 (mode . text-mode)))280 ("IRC" (or281 (mode . erc-mode)282 (mode . circe-mode)283 (mode . circe-server-mode)284 (mode . circe-channel-mode)285 (mode . circe-chat-mode)286 (mode . circe-display-MODE)287 (mode . circe-lagmon-mode)288 (mode . circe-query-mode)))289 ("XMPP" (or290 (mode . jabber-chat-mode)291 (mode . jabber-roster-mode)292 (mode . jabber-browse-mode)293 (mode . jabber-console-mode)))294 ("Terminal" (or295 (mode . vterm-mode)296 (mode . term-mode)297 (mode . eshell-mode)))298 ("Emacs" (or299 (mode . emacs-lisp-mode)300 (name . "^\\*Help\\*$")301 (name . "^\\*Custom.*")302 (name . "^\\*Org Agenda\\*$")303 (name . "^\\*info\\*$")304 (name . "^\\*scratch\\*$")305 (name . "^\\*Backtrace\\*$")306 (name . "^\\*Messages\\*$"))))))307 :hook308 (ibuffer-mode . (lambda ()309 (ibuffer-switch-to-saved-filter-groups "Main"))))310311(use-package tramp312 :config313 (tramp-set-completion-function314 "ssh" (append (tramp-get-completion-function "ssh")315 (mapcar (lambda (file) `(tramp-parse-sconfig ,file))316 (directory-files317 "~/.ssh/conf.d/"318 'full directory-files-no-dot-files-regexp))))319 (customize-set-variable320 'tramp-ssh-controlmaster-options321 (concat322 "-o ControlPath=~/.ssh/controlmaster/%%r@%%h:%%p "323 "-o ControlMaster=auto -o ControlPersist=1h")))324325326(provide 'init-preference)327;;; init-preference.el ends here328