dotfiles

Alpine Linux dotfiles

git clone git://git.lin.moe/dotfiles.git

  1;;; package --- Emacs 编辑器内置配置
  2;;; Commentary:
  3
  4;;; 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))
 10
 11(defun scroll-up-half ()
 12  (interactive)
 13  (scroll-up (window-half-height)))
 14
 15(defun scroll-down-half ()
 16  (interactive)
 17  (scroll-down (window-half-height)))
 18
 19(defun pixel-scroll-down-half ()
 20  (interactive)
 21  (if pixel-scroll-precision-interpolate-page
 22      (pixel-scroll-precision-interpolate (pixel-window-half-height)
 23                                          nil 1)
 24    (cua-scroll-down)))
 25
 26(defun pixel-scroll-up-half ()
 27  (interactive)
 28  (if pixel-scroll-precision-interpolate-page
 29      (pixel-scroll-precision-interpolate (- (pixel-window-half-height))
 30                                          nil 1)
 31    (cua-scroll-up)))
 32
 33(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))
 38
 39(use-package emacs
 40  ;; 内置模式的 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  :init
 45  (setq backup-directory-alist `(("." . "~/.saves"))
 46        tramp-auto-save-directory "~/.saves")
 47
 48  (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)
 53  
 54  (when window-system
 55    (tool-bar-mode -1))
 56  (setq tool-bar-mode nil
 57        memu-bar-mode nil)
 58
 59  ;; line number
 60  (global-display-line-numbers-mode t)
 61  (global-auto-revert-mode t)
 62  (global-visual-line-mode t)
 63
 64  ;; charset
 65  (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")
 70
 71  ;; tab mode
 72  (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)
 76
 77  ;; switch mode-lin-modes and mode-line-misc-info, to show which-function
 78  (setq-default mode-line-format '("%e" mode-line-front-space
 79                                   (:propertize
 80                                    ("" mode-line-mule-info mode-line-client mode-line-modified mode-line-remote)
 81                                    display
 82                                    (min-width
 83                                     (5.0)))
 84                                   mode-line-frame-identification mode-line-buffer-identification "   " mode-line-position
 85                                   (vc-mode vc-mode)
 86                                   "  " mode-line-misc-info mode-line-modes mode-line-end-spaces))
 87  
 88  (auth-source-pass-enable)
 89  :config
 90  ;; theme
 91  (load-theme 'modus-operandi t)
 92  (setq display-buffer-alist '())
 93  
 94  (windmove-default-keybindings 'meta)
 95
 96  (pixel-scroll-mode 1)
 97  (setq pixel-scroll-precision-interpolate-page t)
 98  (setq alert-default-style 'libnotify)
 99
100  (setq vc-ignore-dir-regexp
101        (format "\\(%s\\)\\|\\(%s\\)"
102                vc-ignore-dir-regexp
103                tramp-file-name-regexp))
104  :bind
105  ("<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))))))
114
115(use-package term-title
116  :load-path "lisp/lib"
117  :init
118  (setq frame-title-format
119        '((: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  :hook
127  (after-init . term-title-mode))
128
129(use-package ace-window
130  :ensure t
131  :bind ("M-o" . ace-window) ; 代替之前的 M-1, M-2
132  :config
133  (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))
138
139(use-package buffer-focus-hook
140  :demand t
141  :load-path "lisp/lib")
142
143(use-package god-mode
144  :config
145  (defun my-god-mode-update-mode-line ()
146    (cond
147     (god-local-mode
148      (set-face-attribute 'mode-line nil
149                          :foreground "#604000"
150                          :background "#fff29a")
151      (set-face-attribute 'mode-line-inactive nil
152                          :foreground "#3f3000"
153                          :background "#fff3da"))
154     (t
155      (set-face-attribute 'mode-line nil
156			  :foreground "#0a0a0a"
157			  :background "#d7d7d7")
158      (set-face-attribute 'mode-line-inactive nil
159			  :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)
164
165  :hook
166  ((post-command . my-god-mode-update-mode-line)
167   (after-init . god-mode-all))
168   ;; active god mode when focus out
169   ;; (buffer-focus-out . (lambda () (when (and
170   ;;                                       god-global-mode
171   ;;                                       (god-passes-predicates-p)
172   ;;                                       (not (god-exempt-mode-p)))
173   ;;                                  (god-mode-maybe-activate)))))
174  :bind
175  ("<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)
181
182  (:map god-local-mode-map
183        ("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)))
189
190(use-package ibuffer :ensure nil
191  :config
192  (setq ibuffer-expert t
193        ibuffer-display-summary nil
194        ibuffer-use-other-window nil
195        ibuffer-show-empty-filter-groups nil
196        ibuffer-default-sorting-mode 'filename/process
197        ibuffer-use-header-line t
198        ibuffer-default-shrink-to-minimum-size nil)
199  (setq ibuffer-formats
200        '((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-groups
211        '(("Main"
212           ("Directories" (mode . dired-mode))
213           ("C++" (or
214                   (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" (or
220                      (mode . go-mode)))
221           ("Python" (or
222                      (mode . python-ts-mode)
223                      (mode . cython-mode)
224                      (mode . python-mode)))
225           ("Build" (or
226                     (mode . make-mode)
227                     (mode . makefile-gmake-mode)
228                     (name . "^Makefile$")
229                     (mode . change-log-mode)))
230           ("Scripts" (or
231                       (mode . shell-script-mode)
232                       (mode . shell-mode)
233                       (mode . sh-mode)
234                       (mode . lua-mode)
235                       (mode . bat-mode)))
236           ("Config" (or
237                      (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" (or
247                   (mode . mhtml-mode)
248                   (mode . html-mode)
249                   (mode . web-mode)
250                   (mode . nxml-mode)))
251           ("CSS" (or
252                   (mode . css-mode)
253                   (mode . sass-mode)))
254           ("JS" (or
255                  (mode . js-mode)
256                  (mode . rjsx-mode)))
257           ("Markup" (or
258                   (mode . markdown-mode)
259                   (mode . adoc-mode)))
260           ("Org" (mode . org-mode))
261           ("LaTeX" (name . "\.tex$"))
262           ("Magit" (or
263                     (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" (or
270                    (mode . elfeed-search-mode)
271                    (mode . elfeed-show-mode)))
272           ("Fundamental" (or
273                           (mode . fundamental-mode)
274                           (mode . text-mode)))
275           ("IRC" (or
276                   (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" (or
285                    (mode . jabber-chat-mode)
286                    (mode . jabber-roster-mode)
287                    (mode . jabber-browse-mode)
288                    (mode . jabber-console-mode)))
289           ("Terminal" (or
290                        (mode . vterm-mode)
291                        (mode . term-mode)
292                        (mode . eshell-mode)))
293           ("Emacs" (or
294                     (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  :hook
303  (ibuffer-mode . (lambda ()
304                    (ibuffer-switch-to-saved-filter-groups "Main"))))
305
306(use-package tramp
307  :config
308  (tramp-set-completion-function
309   "ssh" (append (tramp-get-completion-function "ssh")
310                 (mapcar (lambda (file) `(tramp-parse-sconfig ,file))
311                         (directory-files
312                          "~/.ssh/conf.d/"
313                          'full directory-files-no-dot-files-regexp))))
314  (customize-set-variable
315   'tramp-ssh-controlmaster-options
316   (concat
317    "-o ControlPath=~/.ssh/controlmaster/%%r@%%h:%%p "
318    "-o ControlMaster=auto -o ControlPersist=1h")))
319
320(use-package beframe
321  :after consult
322  :init
323  (beframe-mode 1)
324  :config
325  (defface beframe-buffer
326    '((t :inherit font-lock-string-face))
327    "Face for `consult' framed buffers.")
328
329  (defun my-beframe-buffer-names-sorted (&optional frame)
330    (beframe-buffer-names frame :sort #'beframe-buffer-sort-visibility))
331
332  (defvar beframe-consult-source
333    `( :name     "Frame-specific buffers (current frame)"
334       :narrow   ?F
335       :category buffer
336       :face     beframe-buffer
337       :history  beframe-history
338       :items    ,#'my-beframe-buffer-names-sorted
339       :action   ,#'switch-to-buffer
340       :state    ,#'consult--buffer-state))
341
342  (setq beframe-global-buffers '("*scratch*" "*Messages*" "*Backtrace*"))
343  (setq consult-source-buffer
344        (plist-put consult-source-buffer :hidden t))
345
346   (add-to-list 'consult-buffer-sources 'beframe-consult-source)
347
348  ;; (declare-function consult--buffer-state "consult")
349  ;; (defun consult-beframe-buffer-list (&optional frame)
350  ;;   (beframe-buffer-list frame :sort #'beframe-buffer-sort-visibility))
351
352  ;; (setq consult-buffer-list-function #'consult-beframe-buffer-list))
353)
354
355(provide 'init-preference)
356;;; init-preference.el ends here
357