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(use-package emacs
 34  ;; 内置模式的 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  :init
 39  (setq backup-directory-alist `(("." . "~/.saves"))
 40        tramp-auto-save-directory "~/.saves")
 41
 42  (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)
 47  
 48  (when window-system
 49    (tool-bar-mode -1))
 50  (setq tool-bar-mode nil
 51        memu-bar-mode nil)
 52
 53  ;; line number
 54  (global-display-line-numbers-mode t)
 55  (global-auto-revert-mode t)
 56  (global-visual-line-mode t)
 57
 58  ;; charset
 59  (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")
 64
 65  ;; tab mode
 66  (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)
 70
 71  ;; switch mode-lin-modes and mode-line-misc-info, to show which-function
 72  (setq-default mode-line-format '("%e" mode-line-front-space
 73                                   (:propertize
 74                                    ("" mode-line-mule-info mode-line-client mode-line-modified mode-line-remote)
 75                                    display
 76                                    (min-width
 77                                     (5.0)))
 78                                   mode-line-frame-identification mode-line-buffer-identification "   " mode-line-position
 79                                   (vc-mode vc-mode)
 80                                   "  " mode-line-misc-info mode-line-modes mode-line-end-spaces))
 81  
 82  (auth-source-pass-enable)
 83  :config
 84  ;; theme
 85  (load-theme 'modus-operandi t)
 86  (setq display-buffer-alist '())
 87  
 88  (windmove-default-keybindings 'meta)
 89
 90  (pixel-scroll-mode 1)
 91  (setq pixel-scroll-precision-interpolate-page t)
 92  (setq alert-default-style 'libnotify)
 93
 94  (setq vc-ignore-dir-regexp
 95        (format "\\(%s\\)\\|\\(%s\\)"
 96                vc-ignore-dir-regexp
 97                tramp-file-name-regexp))
 98  :bind
 99  ("<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))))))
108
109(use-package term-title
110  :load-path "lisp/lib"
111  :init
112  (setq frame-title-format
113        '((: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  :hook
121  (after-init . term-title-mode))
122
123(use-package window-numbering
124  :hook (after-init . window-numbering-mode))
125
126(use-package buffer-focus-hook
127  :demand t
128  :load-path "lisp/lib")
129
130(use-package god-mode
131  :config
132  (defun my-god-mode-update-mode-line ()
133    (cond
134     (god-local-mode
135      (set-face-attribute 'mode-line nil
136                          :foreground "#604000"
137                          :background "#fff29a")
138      (set-face-attribute 'mode-line-inactive nil
139                          :foreground "#3f3000"
140                          :background "#fff3da"))
141     (t
142      (set-face-attribute 'mode-line nil
143			  :foreground "#0a0a0a"
144			  :background "#d7d7d7")
145      (set-face-attribute 'mode-line-inactive nil
146			  :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)
151
152  :hook
153  ((post-command . my-god-mode-update-mode-line)
154   (after-init . god-mode-all))
155   ;; active god mode when focus out
156   ;; (buffer-focus-out . (lambda () (when (and
157   ;;                                       god-global-mode
158   ;;                                       (god-passes-predicates-p)
159   ;;                                       (not (god-exempt-mode-p)))
160   ;;                                  (god-mode-maybe-activate)))))
161  :bind
162  ("<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)
168
169  (:map god-local-mode-map
170        ("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)))
176
177(use-package ibuffer :ensure nil
178  :config
179  (setq ibuffer-expert t
180        ibuffer-display-summary nil
181        ibuffer-use-other-window nil
182        ibuffer-show-empty-filter-groups nil
183        ibuffer-default-sorting-mode 'filename/process
184        ibuffer-use-header-line t
185        ibuffer-default-shrink-to-minimum-size nil)
186  (setq ibuffer-formats
187        '((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-groups
198        '(("Main"
199           ("Directories" (mode . dired-mode))
200           ("C++" (or
201                   (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" (or
207                      (mode . go-mode)))
208           ("Python" (or
209                      (mode . python-ts-mode)
210                      (mode . cython-mode)
211                      (mode . python-mode)))
212           ("Build" (or
213                     (mode . make-mode)
214                     (mode . makefile-gmake-mode)
215                     (name . "^Makefile$")
216                     (mode . change-log-mode)))
217           ("Scripts" (or
218                       (mode . shell-script-mode)
219                       (mode . shell-mode)
220                       (mode . sh-mode)
221                       (mode . lua-mode)
222                       (mode . bat-mode)))
223           ("Config" (or
224                      (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" (or
234                   (mode . mhtml-mode)
235                   (mode . html-mode)
236                   (mode . web-mode)
237                   (mode . nxml-mode)))
238           ("CSS" (or
239                   (mode . css-mode)
240                   (mode . sass-mode)))
241           ("JS" (or
242                  (mode . js-mode)
243                  (mode . rjsx-mode)))
244           ("Markup" (or
245                   (mode . markdown-mode)
246                   (mode . adoc-mode)))
247           ("Org" (mode . org-mode))
248           ("LaTeX" (name . "\.tex$"))
249           ("Magit" (or
250                     (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" (or
257                    (mode . elfeed-search-mode)
258                    (mode . elfeed-show-mode)))
259           ("Fundamental" (or
260                           (mode . fundamental-mode)
261                           (mode . text-mode)))
262           ("IRC" (or
263                   (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" (or
272                    (mode . jabber-chat-mode)
273                    (mode . jabber-roster-mode)
274                    (mode . jabber-browse-mode)
275                    (mode . jabber-console-mode)))
276           ("Terminal" (or
277                        (mode . vterm-mode)
278                        (mode . term-mode)
279                        (mode . eshell-mode)))
280           ("Emacs" (or
281                     (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  :hook
290  (ibuffer-mode . (lambda ()
291                    (ibuffer-switch-to-saved-filter-groups "Main"))))
292
293(use-package tramp
294  :config
295  (tramp-set-completion-function
296   "ssh" (append (tramp-get-completion-function "ssh")
297                 (mapcar (lambda (file) `(tramp-parse-sconfig ,file))
298                         (directory-files
299                          "~/.ssh/conf.d/"
300                          'full directory-files-no-dot-files-regexp))))
301  (customize-set-variable
302   'tramp-ssh-controlmaster-options
303   (concat
304    "-o ControlPath=~/.ssh/controlmaster/%%r@%%h:%%p "
305    "-o ControlMaster=auto -o ControlPersist=1h")))
306
307(use-package beframe
308  :after consult
309  :init
310  (beframe-mode 1)
311  :config
312  (defface beframe-buffer
313    '((t :inherit font-lock-string-face))
314    "Face for `consult' framed buffers.")
315
316  (defun my-beframe-buffer-names-sorted (&optional frame)
317    (beframe-buffer-names frame :sort #'beframe-buffer-sort-visibility))
318
319  (defvar beframe-consult-source
320    `( :name     "Frame-specific buffers (current frame)"
321       :narrow   ?F
322       :category buffer
323       :face     beframe-buffer
324       :history  beframe-history
325       :items    ,#'my-beframe-buffer-names-sorted
326       :action   ,#'switch-to-buffer
327       :state    ,#'consult--buffer-state))
328
329  (setq beframe-global-buffers '("*scratch*" "*Messages*" "*Backtrace*"))
330  (setq consult-source-buffer
331        (plist-put consult-source-buffer :hidden t))
332
333   (add-to-list 'consult-buffer-sources 'beframe-consult-source)
334
335  ;; (declare-function consult--buffer-state "consult")
336  ;; (defun consult-beframe-buffer-list (&optional frame)
337  ;;   (beframe-buffer-list frame :sort #'beframe-buffer-sort-visibility))
338
339  ;; (setq consult-buffer-list-function #'consult-beframe-buffer-list))
340)
341
342(provide 'init-preference)
343;;; init-preference.el ends here
344