mirror of
https://github.com/pestctrl/emacs-config.git
synced 2026-02-16 08:14:15 +00:00
373 lines
13 KiB
Org Mode
373 lines
13 KiB
Org Mode
* buffer-window management
|
|
#+begin_src emacs-lisp
|
|
(setq split-width-threshold 160)
|
|
(setq split-height-threshold 80)
|
|
|
|
(defun switch-to-buffer-force-same-window (buffer)
|
|
(interactive
|
|
(list (read-buffer-to-switch "Switch to buffer: ")))
|
|
(let ((switch-to-buffer-obey-display-actions nil))
|
|
(switch-to-buffer buffer nil t)))
|
|
|
|
(global-set-key (kbd "C-x B") #'switch-to-buffer-force-same-window)
|
|
|
|
(setq switch-to-buffer-obey-display-actions t)
|
|
|
|
(add-to-list 'display-buffer-alist
|
|
`("COMMIT_EDITMSG"
|
|
display-buffer-in-side-window
|
|
(side . right)
|
|
(slot . 0)
|
|
(window-parameters . ((no-delete-other-windows . t)))
|
|
(window-width . 80)))
|
|
|
|
(add-to-list 'display-buffer-alist
|
|
`("*Async Shell Command*"
|
|
display-buffer-in-side-window
|
|
(side . left)
|
|
(window-parameters . ((no-delete-other-windows . t)))
|
|
(window-width . 80)))
|
|
|
|
(add-to-list 'display-buffer-alist
|
|
`((major-mode . magit-status-mode)
|
|
display-buffer-in-side-window
|
|
(side . right)
|
|
(slot . 1)
|
|
(window-parameters . ((no-delete-other-windows . t)))
|
|
(window-width . 80)))
|
|
|
|
(add-to-list 'display-buffer-alist
|
|
`((major-mode . magit-log-mode)
|
|
display-buffer-in-side-window
|
|
(side . right)
|
|
(slot . 2)
|
|
(window-parameters . ((no-delete-other-windows . t)))
|
|
(window-width . 100)))
|
|
|
|
;; TODO: This should be fixed in future versions of emacs
|
|
(defun my/is-compilation-buffer (buffer &optional _rest)
|
|
(with-current-buffer buffer
|
|
(or compilation-minor-mode
|
|
(eq major-mode 'compilation-mode))))
|
|
|
|
;; TODO: Show multiple deadgrep buffers in side-window
|
|
(add-to-list 'display-buffer-alist
|
|
`((major-mode . deadgrep-mode)
|
|
display-buffer-in-side-window
|
|
(side . right)
|
|
(slot . 3)
|
|
(window-parameters . ((no-delete-other-windows . t)))
|
|
(window-width . 100)))
|
|
|
|
(add-to-list 'display-buffer-alist
|
|
`(my/is-compilation-buffer
|
|
display-buffer-in-side-window
|
|
(side . right)
|
|
(slot . 4)
|
|
(window-parameters . ((no-delete-other-windows . t)))
|
|
(window-width . 80)))
|
|
|
|
(add-to-list 'display-buffer-alist
|
|
`((major-mode . helpful-mode)
|
|
display-buffer-in-side-window
|
|
(side . right)
|
|
(slot . 5)
|
|
(window-width . 80)))
|
|
|
|
(add-to-list 'display-buffer-alist
|
|
`((major-mode . Info-mode)
|
|
display-buffer-in-side-window
|
|
(side . right)
|
|
(slot . 6)
|
|
(window-width . 80)))
|
|
|
|
(require 'org-capture)
|
|
|
|
(defun my/is-org-capture-buffer (buffer &optional _rest)
|
|
(with-current-buffer buffer
|
|
org-capture-mode))
|
|
|
|
(add-to-list 'display-buffer-alist
|
|
`(my/is-org-capture-buffer
|
|
display-buffer-in-side-window
|
|
(side . left)
|
|
(select . t)
|
|
(window-width . 85)
|
|
(window-parameters
|
|
. ((no-delete-other-windows . t)
|
|
(dedicated . t)))))
|
|
|
|
;; (pop display-buffer-alist)
|
|
#+end_src
|
|
* Tramp configuration
|
|
#+begin_src emacs-lisp
|
|
;; This is sort the default in tramp, but I wanted to keep this here
|
|
;; as a reminder that THIS is the way to communicate to a shell that
|
|
;; we want a plain vanilla experience.
|
|
|
|
;; The way to check this is in shell is as follows:
|
|
;; if [[ "$TERM" != "dumb" ]]; then
|
|
;; # vterm configuration, etc.
|
|
;; fi
|
|
|
|
;; OR, the new way I've been doing this:
|
|
;; [[ "$TERM" = "dumb" ]] && return
|
|
(setq tramp-terminal-type "dumb")
|
|
|
|
;; To debug tramp, set the following variable (max value 11).
|
|
|
|
;; (setq tramp-verbose 3)
|
|
;; (setq tramp-verbose 9)
|
|
#+end_src
|
|
* set-default-directory
|
|
#+begin_src emacs-lisp
|
|
(defun set-default-directory (dir)
|
|
(interactive "f")
|
|
(setq default-directory dir))
|
|
#+end_src
|
|
* Profiler Keymap
|
|
#+begin_src emacs-lisp
|
|
(define-prefix-command '*profiler-map*)
|
|
|
|
(define-key *profiler-map* (kbd "s") #'profiler-start)
|
|
(define-key *profiler-map* (kbd "r") #'profiler-report)
|
|
(define-key *profiler-map* (kbd "S") #'profiler-stop)
|
|
|
|
(define-key *root-map* (kbd "p") '*profiler-map*)
|
|
#+end_src
|
|
* colorful compilation buffer
|
|
#+begin_src emacs-lisp
|
|
(require 'ansi-color)
|
|
(defun colorize-compilation-buffer ()
|
|
(let ((buffer-read-only nil))
|
|
(ansi-color-apply-on-region (point-min) (point-max))))
|
|
(add-hook 'compilation-filter-hook 'colorize-compilation-buffer)
|
|
#+end_src
|
|
* World time
|
|
#+begin_src emacs-lisp
|
|
(setq world-clock-list
|
|
'(("America/Chicago" "Houston")
|
|
("Asia/Taipei" "Taiwan")
|
|
("Turkey" "Turkey")
|
|
("Asia/Shanghai" "China")
|
|
("Asia/Jakarta" "Indonesia")))
|
|
#+end_src
|
|
* auto-save files in same directory
|
|
#+begin_src emacs-lisp
|
|
(setq backup-directory-alist `(("." . ,(ef "backups/"))))
|
|
|
|
(setq make-backup-files t ; backup of a file the first time it is saved.
|
|
backup-by-copying t ; don't clobber symlinks
|
|
version-control t ; version numbers for backup files
|
|
kept-old-versions 6 ; oldest versions to keep when a new numbered backup is made (default: 2)
|
|
kept-new-versions 9 ; newest versions to keep when a new numbered backup is made (default: 2)
|
|
auto-save-default t ; auto-save every buffer that visits a file
|
|
auto-save-timeout 20 ; number of seconds idle time before auto-save (default: 30)
|
|
auto-save-interval 200 ; number of keystrokes between auto-saves (default: 300)
|
|
)
|
|
#+end_src
|
|
* freezing time
|
|
#+begin_src emacs-lisp
|
|
(defvar my/frozen-time nil)
|
|
|
|
(defvar my/format-time-string-function nil)
|
|
|
|
(defun my/org-today ()
|
|
(time-to-days my/frozen-time))
|
|
|
|
(defun my/current-time ()
|
|
my/frozen-time)
|
|
|
|
(defun my/format-time-string (original format-string &optional time zone)
|
|
(apply original
|
|
format-string
|
|
(if time
|
|
time
|
|
my/frozen-time)
|
|
zone))
|
|
|
|
(defun my/decode-time (original &optional time zone form)
|
|
(apply original
|
|
(if time
|
|
time
|
|
my/frozen-time)
|
|
zone
|
|
form))
|
|
|
|
;; Change and freeze time
|
|
(defun za-warudo ()
|
|
"Freeze `current-time' at the current active or inactive timestamp. If point
|
|
is not on a timestamp, the function prompts for one. If time is not specified,
|
|
either by the timstamp under point or prompt, the time defaults to the
|
|
current HH:MM of today at the selected date."
|
|
(interactive)
|
|
(let* ((org-read-date-prefer-future nil)
|
|
(time (org-read-date t 'totime nil "Input freeze time: ")))
|
|
(setq my/frozen-time (append time '(0 0)))
|
|
(advice-add #'current-time :override #'my/current-time)
|
|
(advice-add #'format-time-string :around #'my/format-time-string)
|
|
(advice-add #'decode-time :around #'my/decode-time)
|
|
(advice-add #'org-today :override #'my/org-today)
|
|
(set-face-background 'fringe "firebrick2")
|
|
(message "Toki yo tomare")))
|
|
|
|
(define-key *root-map* (kbd "C-z") 'za-warudo)
|
|
|
|
;; Release changed / frozen time
|
|
(defun un-za-warudo ()
|
|
"Release the time frozen by `freeze-time'."
|
|
(interactive)
|
|
(advice-remove #'current-time #'my/current-time)
|
|
(advice-remove #'format-time-string #'my/format-time-string)
|
|
(advice-remove #'decode-time #'my/decode-time)
|
|
(advice-remove #'org-today #'my/org-today)
|
|
(setq my/frozen-time nil)
|
|
(set-face-background 'fringe nil)
|
|
(message "Soshite, toki wa ugoki dasu"))
|
|
|
|
(define-key *root-map* (kbd "C-r") 'un-za-warudo)
|
|
#+end_src
|
|
* encryption
|
|
#+begin_src emacs-lisp
|
|
(let ((authinfo-file
|
|
(if my-ec/at-ti
|
|
(ef "secrets/.authinfo.gpg")
|
|
(expand-file-name "~/.authinfo"))))
|
|
(if (not (setq my-ec/authinfo-exists
|
|
(file-exists-p authinfo-file)))
|
|
(warn ".authinfo file missing, remember to setup seafile. Mail config is also prevented from loading")
|
|
(require 'epa-file)
|
|
(epa-file-enable)
|
|
(setq epa-pinentry-mode 'loopback)
|
|
(setq epa-file-cache-passphrase-for-symmetric-encryption t)
|
|
(setenv "GPG_AGENT_INFO" nil)
|
|
|
|
(setq epg-gpg-program "gpg2")
|
|
;; (setq auth-source-debug t)
|
|
(setq auth-sources `((:source ,authinfo-file)))
|
|
|
|
(when-let* ((gpg (executable-find "gpg2"))
|
|
(version (shell-command-to-string (format "%s --version" gpg)))
|
|
((string-match (rx "gpg (GnuPG) "
|
|
(group (+ digit)
|
|
(+ "."
|
|
(+ digit))))
|
|
version))
|
|
(version (match-string 1 version))
|
|
(number (string-to-number
|
|
(string-replace "." "" version)))
|
|
((>= 243 number 241)))
|
|
(fset 'epg-wait-for-status 'ignore))))
|
|
#+end_src
|
|
* delete-other-side-windows
|
|
#+begin_src emacs-lisp
|
|
(defun my/delete-other-windows (arg)
|
|
(interactive "p")
|
|
(let* ((win (selected-window))
|
|
(side-win (window-parameter win 'window-side)))
|
|
(if (= arg 1)
|
|
(if (not side-win)
|
|
(delete-other-windows)
|
|
(delete-other-windows-vertically))
|
|
(set-window-dedicated-p win nil)
|
|
(when side-win
|
|
(set-window-parameter win 'window-side nil)
|
|
(set-window-parameter win 'no-delete-other-windows nil))
|
|
(let ((ignore-window-parameters t)
|
|
(window--sides-inhibit-check t))
|
|
(delete-other-windows)))))
|
|
|
|
(define-key pestctrl-minor-mode-map (kbd "C-x 1") #'my/delete-other-windows)
|
|
#+end_src
|
|
* find-file-view
|
|
#+begin_src emacs-lisp
|
|
(defun view-mode-file ()
|
|
(interactive)
|
|
(call-interactively #'ido-find-file)
|
|
(view-mode))
|
|
|
|
(global-set-key (kbd "C-c C-v") #'view-mode-file)
|
|
#+end_src
|
|
* man select window
|
|
#+begin_src emacs-lisp
|
|
(setq Man-notify-method 'aggressive)
|
|
#+end_src
|
|
* Scroll interval
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq scroll-margin 1
|
|
hscroll-margin 2
|
|
hscroll-step 1
|
|
scroll-conservatively 101
|
|
scroll-preserve-screen-position t
|
|
mouse-wheel-scroll-amount '(3)
|
|
mouse-wheel-progressive-speed nil)
|
|
#+END_SRC
|
|
|
|
* Window splitting function
|
|
#+begin_src emacs-lisp
|
|
(defun split-window-sensibly-prefer-horizontal (&optional window)
|
|
"Based on split-window-sensibly, but designed to prefer a horizontal split,
|
|
i.e. windows tiled side-by-side."
|
|
(let ((window (or window (selected-window))))
|
|
(or (and (window-splittable-p window t)
|
|
;; Split window horizontally
|
|
(with-selected-window window
|
|
(split-window-right)))
|
|
(and (window-splittable-p window)
|
|
;; Split window vertically
|
|
(with-selected-window window
|
|
(split-window-below)))
|
|
(and
|
|
;; If WINDOW is the only usable window on its frame (it is
|
|
;; the only one or, not being the only one, all the other
|
|
;; ones are dedicated) and is not the minibuffer window, try
|
|
;; to split it horizontally disregarding the value of
|
|
;; `split-height-threshold'.
|
|
(let ((frame (window-frame window)))
|
|
(or
|
|
(eq window (frame-root-window frame))
|
|
(catch 'done
|
|
(walk-window-tree (lambda (w)
|
|
(unless (or (eq w window)
|
|
(window-dedicated-p w))
|
|
(throw 'done nil)))
|
|
frame)
|
|
t)))
|
|
(not (window-minibuffer-p window))
|
|
(let ((split-width-threshold 0))
|
|
(when (window-splittable-p window t)
|
|
(with-selected-window window
|
|
(split-window-right))))))))
|
|
|
|
(defun split-window-really-sensibly (&optional window)
|
|
(let ((window (or window (selected-window))))
|
|
(if (> (window-total-width window) (* 2 (window-total-height window)))
|
|
(with-selected-window window (split-window-sensibly-prefer-horizontal window))
|
|
(with-selected-window window (split-window-sensibly window)))))
|
|
|
|
(setq
|
|
split-height-threshold 4
|
|
split-width-threshold (if my/puppet-p 100 160)
|
|
split-window-preferred-function 'split-window-really-sensibly)
|
|
|
|
#+end_src
|
|
* Splitting functions
|
|
#+begin_src emacs-lisp
|
|
(defun mp-split-below (arg)
|
|
"Split window below from the parent or from root with ARG."
|
|
(interactive "P")
|
|
(split-window (if arg (frame-root-window)
|
|
(window-parent (selected-window)))
|
|
nil 'below nil))
|
|
|
|
(defun mp-split-left (arg)
|
|
"Split window below from the parent or from root with ARG."
|
|
(interactive "P")
|
|
(split-window (if arg (frame-root-window)
|
|
(window-parent (selected-window)))
|
|
nil 'left nil))
|
|
#+end_src
|
|
* Gimme that process
|
|
#+begin_src emacs-lisp
|
|
(require 'rgrep-patch)
|
|
#+end_src
|