2024-07-27 13:31:06 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; windows performance tweaks, add to top of init.el as well
( when ( eq system-type 'windows-nt )
; https://lists.gnu.org/archive/html/bug-gnu-emacs/2012-10/msg00274.html
; https://gioorgi.com/2013/solving-emacs-freeze-andor-slowdown-on-windows7/
( setq w32-get-true-file-attributes nil )
; https://www.reddit.com/r/emacs/comments/c9ef5i/comment/esx5ndr/
( setq inhibit-compacting-font-caches t )
; https://www.reddit.com/r/emacs/comments/c9ef5i/comment/esx5snw/
( when ( boundp 'w32-pipe-read-delay )
( setq w32-pipe-read-delay 0 ) )
)
2022-04-22 04:25:29 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Packages related
2022-04-26 12:06:30 +00:00
( require 'package )
2022-04-22 04:48:52 +00:00
( add-to-list 'package-archives ' ( " melpa " . " https://melpa.org/packages/ " ) t ) ; this goes in chemacs2 init -- DO NOT UNCOMMENT
( package-initialize ) ; this goes in chemacs2 init -- DO NOT UNCOMMENT
2022-04-22 04:25:29 +00:00
( add-to-list 'package-selected-packages
2023-08-30 13:59:55 +00:00
' ( which-key all-the-icons revert-buffer-all centaur-tabs scratch persistent-scratch persp-mode rainbow-mode rainbow-delimiters markdown-mode focus zoom popwin dired-single diredfl doominhibitinhibit-modeline helpful helm helm-org dired-rainbow dired-rainbow-listing dired-single dash s origami modus-themes use-package )
2023-04-11 15:35:56 +00:00
)
( add-to-list 'package-selected-packages
2024-10-01 16:25:56 +00:00
' ( xclip )
2023-04-11 15:35:56 +00:00
)
2022-04-22 04:25:29 +00:00
( require 'use-package )
2022-04-22 21:03:15 +00:00
; helper functions
( require 'subr-x )
( setq kmn/is-termux
2023-04-11 13:59:36 +00:00
( string-suffix-p " Android " ( string-trim ( shell-command-to-string " uname -a " ) ) ) )
2022-04-22 21:03:15 +00:00
2023-04-11 15:35:56 +00:00
2022-04-23 19:35:42 +00:00
; ensure elisp plugins are compiled
( require 'dash )
( require 'f )
( defun was-compiled-p ( path )
" Does the directory at PATH contain any .elc files? "
( --any-p ( f-ext? it " elc " ) ( f-files path ) ) )
( defun ensure-packages-compiled ( )
" If any packages installed with package.el aren't compiled yet, compile them. "
( --each ( f-directories package-user-dir )
( unless ( was-compiled-p it )
( byte-recompile-directory it 0 ) ) ) )
( ensure-packages-compiled )
2022-06-02 18:33:30 +00:00
( unless ( was-compiled-p " ~/.emacs.d.profiles/common " )
( byte-recompile-directory " ~/.emacs.d.profiles/common " 0 ) )
2023-04-22 20:07:53 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; eshell
( setq eshell-prompt-function ( lambda ( ) ( concat ( car ( last ( split-string ( eshell/pwd ) " / " ) ) ) " $ " ) ) )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2023-04-24 14:54:09 +00:00
; dont wrap lines
2023-04-22 20:07:53 +00:00
( set-default 'truncate-lines t )
2023-04-24 14:54:09 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; highlight current line global -- Do NOT use
;(global-hl-line-mode +1) ; this overrides std hl-line-mode buffer config
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; hl-line-mode based on major mode hook (on by default, off for listed major modes)
; to get major mode: (message "%s" major-mode)
; to get minor modes: (describe-mode)
2024-05-06 14:06:38 +00:00
( add-hook 'minibuffer-setup-hook #' ( lambda ( ) ( hl-line-mode 0 ) ) )
2023-04-24 14:54:09 +00:00
( add-hook 'after-change-major-mode-hook
2024-05-06 14:06:38 +00:00
#' ( lambda ( ) ( hl-line-mode ( if ( member major-mode ' ( org-agenda-mode ) ) 0 1 ) ) ) )
2023-04-22 20:07:53 +00:00
2022-09-08 19:15:25 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; fix opening urls inside termux
( when kmn/is-termux
( setq browse-url-browser-function 'browse-url-generic
browse-url-generic-program " /data/data/com.termux/files/usr/bin/termux-open " ) )
2022-04-23 17:10:05 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; backups
( defconst kmn/backup-dir
( expand-file-name " backups/ " user-emacs-directory ) )
( unless ( file-exists-p kmn/backup-dir )
( make-directory kmn/backup-dir ) )
( setq backup-directory-alist ` ( ( " .* " . , kmn/backup-dir ) ) )
( setq auto-save-list-file-prefix kmn/backup-dir )
( setq auto-save-file-name-transforms
` ( ( " \\ (?:[^/]*/ \\ )* \\ (.* \\ ) " , ( concat kmn/backup-dir " \\ 1 " ) t ) ) )
( setq backup-by-copying t ) ; safest form of backup file creation
; Config backups so we have *more*, not less
( setq delete-old-versions t
kept-new-versions 1
kept-old-versions 3
version-control t
)
2022-04-22 21:03:15 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2023-08-30 13:49:45 +00:00
; add all-the-icons so status icons (normally handled by a font patched w/ nerd font)
( when ( not kmn/is-termux )
( require 'all-the-icons )
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2023-08-30 13:59:55 +00:00
; which-key
( require 'which-key )
;; Allow C-h to trigger which-key before it is done automatically
;(setq which-key-show-early-on-C-h t)
;; make sure which-key doesn't show normally but refreshes quickly after it is
;; triggered.
;(setq which-key-idle-delay 10000)
;(setq which-key-idle-secondary-delay 0.05)
( which-key-mode )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-04-22 21:03:15 +00:00
; dired adjustments
2022-08-26 16:48:45 +00:00
( with-eval-after-load 'dired
( require 'dired-x )
;; Set dired-x global variables here. For example:
;; (setq dired-x-hands-off-my-keys nil)
)
2022-04-22 21:03:15 +00:00
( require 'dired-single )
2023-04-07 21:10:23 +00:00
( setq dired-single-use-magic-buffer t )
( setq dired-single-magic-buffer-name " dired - main " )
2023-04-07 19:26:46 +00:00
; open dirs in same dired window + open files in main window
; facilitates static file browser sidebar
2023-04-08 16:53:12 +00:00
( defun my/dired-open ( )
2023-04-07 19:26:46 +00:00
( interactive )
( setq file ( dired-get-file-for-visit ) )
( if ( equal ( file-directory-p file ) t )
( progn
( dired-single-buffer )
)
( progn
( dired-find-file-other-window )
)
)
)
2023-04-08 16:53:12 +00:00
( defun my/dired-init ( )
2022-04-22 21:03:15 +00:00
" Bunch of stuff to run for dired, either immediately or when it's
loaded. "
;; <add other stuff here>
( define-key dired-mode-map [ remap dired-find-file ]
2023-04-08 16:53:12 +00:00
'my/dired-open )
2022-04-22 21:03:15 +00:00
( define-key dired-mode-map [ remap dired-mouse-find-file-other-window ]
2023-04-08 16:53:12 +00:00
'my/dired-open )
2022-04-22 21:03:15 +00:00
( define-key dired-mode-map [ remap dired-up-directory ]
'dired-single-up-directory ) )
;; if dired's already loaded, then the keymap will be bound
( if ( boundp 'dired-mode-map )
;; we're good to go; just add our bindings
2023-04-08 16:53:12 +00:00
( my/dired-init )
2022-04-22 21:03:15 +00:00
;; it's not loaded yet, so add our bindings to the load-hook
2023-04-08 16:53:12 +00:00
( add-hook 'dired-load-hook 'my/dired-init ) )
2022-04-22 21:03:15 +00:00
; icons / colors / line tunes
( add-hook 'dired-mode-hook
( lambda ( )
( interactive )
2022-08-26 16:04:43 +00:00
( all-the-icons-dired-mode 1 )
2022-04-22 21:03:15 +00:00
( hl-line-mode 1 ) ) )
2022-08-26 16:46:14 +00:00
( use-package diredfl
:commands diredfl-global-mode
:init
( diredfl-global-mode ) )
2022-04-22 21:03:15 +00:00
2023-04-07 19:26:46 +00:00
; hide dired details by default, use `(` to toggle
( add-hook 'dired-mode-hook 'dired-hide-details-mode )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-10-01 17:47:56 +00:00
; coding general (in case its ever on)
( add-hook 'prog-mode-hook #' rainbow-delimiters-mode )
2023-04-07 19:26:46 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-10-01 17:47:56 +00:00
; markdown config (used by kmn all over everything)
( use-package markdown-mode
:ensure t
:commands ( markdown-mode gfm-mode )
:mode ( ( " README \\ .md \\ ' " . gfm-mode )
( " \\ .md \\ ' " . markdown-mode )
( " \\ .markdown \\ ' " . markdown-mode ) )
:init ( setq markdown-command " multimarkdown " ) )
( use-package markdown-preview-mode
:ensure t
:if ( boundp 'mdcommand )
:init
;(setq markdown-preview-auto-open nil)
:custom
( markdown-preview-ws-port 9697 )
( markdown-preview-http-port 9696 )
( markdown-preview-host " 127.0.0.1 " )
( markdown-preview-http-host " 127.0.0.1 " ) )
( setq markdown-preview-stylesheets ( list " https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/3.0.1/github-markdown.min.css " ) )
2022-04-22 04:25:29 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-04-22 21:03:15 +00:00
; origami config
( use-package origami
:demand
2023-02-13 17:12:29 +00:00
2022-04-22 21:03:15 +00:00
:config
( define-prefix-command 'origami-mode-map )
( define-key ctl-x-map ( kbd " z " ) 'origami-mode-map )
( global-origami-mode )
2023-02-13 17:12:29 +00:00
2022-04-22 21:03:15 +00:00
:bind
( :map origami-mode-map
( " o " . origami-open-node )
( " O " . origami-open-node-recursively )
( " c " . origami-close-node )
( " C " . origami-close-node-recursively )
( " a " . origami-toggle-node )
( " t " . origami-recursively-toggle-node )
( " R " . origami-open-all-nodes )
( " M " . origami-close-all-nodes )
( " v " . origami-show-only-node )
( " k " . origami-previous-fold )
( " j " . origami-forward-fold )
( " x " . origami-reset ) ) )
2022-04-22 04:25:29 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Setup global keys
( cua-mode 1 )
2022-04-23 17:18:39 +00:00
( windmove-default-keybindings 'meta )
2022-04-22 04:25:29 +00:00
( global-set-key ( kbd " <escape> " ) 'keyboard-escape-quit )
2023-03-26 14:48:39 +00:00
( global-set-key ( kbd " M-g " ) 'keyboard-quit )
2022-04-23 21:36:44 +00:00
( global-set-key ( kbd " M-m " ) 'menu-bar-open )
2022-04-22 04:25:29 +00:00
( global-set-key ( kbd " C-x C-z " ) nil )
2022-04-23 21:36:44 +00:00
( global-set-key ( kbd " C-g " ) 'goto-line )
( global-set-key ( kbd " C-c u " ) 'toggle-truncate-lines )
2022-08-26 16:04:43 +00:00
( global-set-key ( kbd " C-o " ) 'helm-find-files )
2023-04-08 14:09:49 +00:00
( global-set-key ( kbd " C-k " ) 'kmn/dired-default-directory-on-left )
2024-08-01 16:37:06 +00:00
( global-set-key ( kbd " C-a " ) 'mark-whole-buffer )
( global-set-key ( kbd " C-S-a " ) 'kmn/smart-beginning-of-line )
( global-set-key ( kbd " M-a " ) 'kmn/smart-beginning-of-line )
( global-set-key ( kbd " C-S-e " ) 'kmn/smart-end-of-line )
( global-set-key ( kbd " M-e " ) 'kmn/smart-end-of-line )
2023-04-15 15:00:11 +00:00
( global-set-key ( kbd " C-c v " ) 'previous-buffer )
2022-04-23 14:21:53 +00:00
( global-set-key ( kbd " C-c w " )
( lambda ( )
( interactive )
( whitespace-mode )
( whitespace-newline-mode )
)
)
2022-04-22 04:25:29 +00:00
2024-09-01 17:02:33 +00:00
; tmux keybind compatibility
( setq windmove-wrap-around t ) ; tmux does wraparound for window movements, enable for emacs
2024-08-17 12:40:04 +00:00
( define-key global-map ( kbd " C-b " ) ( make-sparse-keymap ) )
2024-09-01 17:02:33 +00:00
; prevent ardux typos w/ window sizing
( global-set-key ( kbd " C-<up> " ) nil )
( global-set-key ( kbd " C-<down> " ) nil )
( global-set-key ( kbd " C-<right> " ) nil )
( global-set-key ( kbd " C-<left> " ) nil )
; main tmux key binds
; *remember* C-b b in tmux sends a single C-b to the underlying tty
( global-set-key ( kbd " C-b c " ) ( lambda ( ) ( interactive )
( let ( ( frame ( make-frame ) )
; yes, this is silly
; need a name for the buffer and emacs always re-uses buffers based on name
; to keep w/ tmux, use an arbitrary, 'unique' name of the new buffer
( buffer ( get-buffer-create ( format-time-string " %Y-%m-%d %H:%M:%S " ( current-time ) ) ) ) )
( select-frame-set-input-focus frame )
( display-buffer buffer )
( switch-to-buffer buffer )
( delete-other-windows )
) ) )
( global-set-key ( kbd " C-b & " ) 'delete-frame )
( global-set-key ( kbd " C-b \" " ) 'split-window-below )
( global-set-key ( kbd " C-b % " ) 'split-window-right )
( global-set-key ( kbd " C-b x " ) 'delete-window )
( global-set-key ( kbd " C-b <up> " ) 'windmove-up )
( global-set-key ( kbd " C-b <down> " ) 'windmove-down )
( global-set-key ( kbd " C-b <left> " ) 'windmove-left )
( global-set-key ( kbd " C-b <right> " ) 'windmove-right )
( global-set-key ( kbd " C-b ! " ) 'make-frame )
( global-set-key ( kbd " C-b C-<up> " ) 'enlarge-window )
( global-set-key ( kbd " C-b C-<down> " ) 'shrink-window )
( global-set-key ( kbd " C-b C-<right> " ) 'enlarge-window-horizontally )
( global-set-key ( kbd " C-b C-<left> " ) 'shrink-window-horizontally )
( global-set-key ( kbd " C-b : " ) 'helm-M-x )
( global-set-key ( kbd " C-b SPC " ) 'zoom-mode ) ; use 'balance-windows function if not using zoom.el or golden-ratio
2022-04-23 21:36:44 +00:00
2022-04-22 04:25:29 +00:00
;; Lookup the current symbol at point. C-c C-d is a common keybinding
;; for this in lisp modes.
2022-04-23 21:36:44 +00:00
( global-set-key ( kbd " M-h " ) 'describe-bindings )
2022-04-22 04:25:29 +00:00
( global-set-key ( kbd " C-c C-d " ) #' helpful-at-point )
2022-04-23 15:49:04 +00:00
( bind-key* " M-% " 'query-replace-region-or-from-top )
( global-set-key ( kbd " C-h " ) 'query-replace-region-or-from-top )
; more vscode/gui styled find/replace
( global-set-key ( kbd " C-s " ) 'isearch-forward )
( global-set-key ( kbd " C-f " ) 'isearch-forward )
2024-07-27 13:48:58 +00:00
; C-h find/replace
( global-set-key ( kbd " C-h " ) 'query-replace )
( global-set-key ( kbd " C-H " ) 'query-replace-regexp )
2022-04-22 04:25:29 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Set some global config
( setq inhibit-splash-screen t ) ; why do you need to tell me things i know by default
2022-08-28 15:14:22 +00:00
( setq inhibit-startup-screen t )
( setq inhibit-startup-echo-area-message t )
2022-04-22 04:25:29 +00:00
( setq-default tab-width 4 ) ; sanity!
( electric-indent-mode 0 ) ; return should NOT fuck with the indentation of the previous line
2022-04-23 16:14:37 +00:00
2022-04-22 04:25:29 +00:00
;; make typing delete/overwrites selected text
( delete-selection-mode 1 )
2022-04-23 16:14:37 +00:00
2022-11-03 17:22:07 +00:00
( setq frame-inhibit-implied-resize t )
( setq pixel-scroll-precision-mode t )
2022-04-22 04:25:29 +00:00
;; UTF-8 as default encoding
( set-default-coding-systems 'utf-8 )
( set-language-environment " UTF-8 " )
( set-default-coding-systems 'utf-8-unix )
2024-08-30 21:37:42 +00:00
; dont pop-up tooltips, show in echo area instead
( setq tooltip-mode nil )
( setq tooltip-use-echo-area t )
2022-08-25 17:42:20 +00:00
; auto revert when files/dired changes
( setq global-auto-revert-non-file-buffers t )
( global-auto-revert-mode 1 )
2022-08-26 17:14:12 +00:00
; Clipboard integration
( use-package xclip :config ( xclip-mode 1 ) )
2023-04-11 16:32:17 +00:00
;; use y or n instead of yes or no
2022-08-28 15:14:22 +00:00
( fset 'yes-or-no-p 'y-or-n-p )
2023-04-12 17:52:39 +00:00
; org mode syntax highlight code blocks
( setq org-src-fontify-natively t )
2023-04-15 15:00:11 +00:00
; org mode - multiple agenda buffers
( setq org-agenda-sticky t )
2023-04-15 16:57:15 +00:00
; org show file name in refile, also allows refiling to the file as a top level headline
( setq org-refile-use-outline-path 'file )
( setq org-outline-path-complete-in-steps nil )
( setq org-refile-allow-creating-parent-nodes 'confirm )
2022-04-22 04:25:29 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; set font for emoji -- DOES NOT WORK ON MOBILE
( when ( eq system-type 'windows-nt )
( set-fontset-font
t
' ( #x1f300 . #x1fad0 )
( cond
( ( member " Noto Color Emoji " ( font-family-list ) ) " Noto Color Emoji " )
( ( member " Noto Emoji " ( font-family-list ) ) " Noto Emoji " )
( ( member " Segoe UI Emoji " ( font-family-list ) ) " Segoe UI Emoji " )
( ( member " Symbola " ( font-family-list ) ) " Symbola " )
( ( member " Apple Color Emoji " ( font-family-list ) ) " Apple Color Emoji " ) )
;; Apple Color Emoji should be before Symbola, but Richard Stallman skum disabled it.
;; GNU Emacs Removes Color Emoji Support on the Mac
;; http://ergoemacs.org/misc/emacs_macos_emoji.html
;;
)
2023-01-15 04:30:42 +00:00
( custom-theme-set-faces
'user
2023-01-15 05:08:18 +00:00
' ( default ( ( t ( :family " MonoLisa Variable " :height 100 ) ) ) )
2023-01-15 04:54:23 +00:00
' ( variable-pitch ( ( t ( :family " Atkinson Hyperlegible " :height 120 ) ) ) )
' ( fixed-pitch ( ( t ( :family " MonoLisa Variable " :height 120 ) ) ) )
2023-01-15 04:30:42 +00:00
)
2023-01-18 04:59:58 +00:00
; (custom-theme-set-faces
; 'user
; '(org-agenda ((t (:inherit fixed-pitch))))
; '(org-block ((t (:inherit fixed-pitch))))
; '(org-code ((t (:inherit (shadow fixed-pitch)))))
; '(org-document-info ((t (:inherit fixed-pitch))))
; '(org-document-info-keyword ((t (:inherit (shadow fixed-pitch)))))
; '(org-indent ((t (:inherit (org-hide fixed-pitch)))))
; '(org-link ((t (:inherit (shadow fixed-pitch)))))
; '(org-meta-line ((t (:inherit (font-lock-comment-face fixed-pitch)))))
; '(org-property-value ((t (:inherit fixed-pitch))) t)
; '(org-special-keyword ((t (:inherit (font-lock-comment-face fixed-pitch)))))
; '(org-table ((t (:inherit fixed-pitch))))
; '(org-tag ((t (:inherit (shadow fixed-pitch) :weight bold :height 0.8))))
; '(org-verbatim ((t (:inherit (shadow fixed-pitch)))))
;)
;(add-hook 'org-mode-hook 'variable-pitch-mode)
2023-01-15 04:30:42 +00:00
2022-04-22 04:25:29 +00:00
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; line numbers
; find major mode : M-x eval-expression [enter] major-mode
( require 'display-line-numbers )
( defcustom display-line-numbers-exempt-modes ' ( org-mode org-agenda-mode )
" Major modes on which to disable the linum mode, exempts them from global requirement "
:group 'display-line-numbers
:type 'list
:version " green " )
( defun display-line-numbers--turn-on ( )
" turn on line numbers but excempting certain majore modes defined in `display-line-numbers-exempt-modes' "
( if ( and
( not ( member major-mode display-line-numbers-exempt-modes ) )
( not ( minibufferp ) ) )
( display-line-numbers-mode ) ) )
( global-display-line-numbers-mode )
2022-04-23 14:21:53 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; whitespace
( progn
;; Make whitespace-mode with very basic background coloring for whitespaces.
;; http://xahlee.info/emacs/emacs/whitespace-mode.html
( setq whitespace-style ( quote ( face spaces tabs newline space-mark tab-mark newline-mark ) ) )
;; Make whitespace-mode and whitespace-newline-mode use “¶” for end of line char and “▷” for tab.
( setq whitespace-display-mappings
;; all numbers are unicode codepoint in decimal. e.g. (insert-char 182 1)
' (
( space-mark 32 [ 183 ] [ 46 ] ) ; SPACE 32 「 」, 183 MIDDLE DOT 「·」, 46 FULL STOP 「.」
( newline-mark 10 [ 8629 10 ] ) ; LINE FEED,
( tab-mark 9 [ 8594 9 ] [ 92 9 ] ) ; tab
) ) )
2022-04-22 04:25:29 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; modus-themes setup and enable
2023-02-21 18:23:55 +00:00
( require-theme 'modus-themes )
( setq modus-themes-region ' ( no-extend )
modus-themes-fringes 'subtle
modus-themes-scale-headings t
2022-04-22 04:25:29 +00:00
)
2023-02-21 18:23:55 +00:00
( load-theme 'modus-vivendi :no-confirm )
2022-04-22 04:25:29 +00:00
2022-09-22 20:13:41 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; focus on text (turn on as desired/needed ; off by default
( require 'focus )
2022-04-25 19:23:09 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; helm
( setq completion-styles ' ( flex ) )
2022-04-25 19:54:47 +00:00
( require 'helm-color )
2023-04-07 19:26:46 +00:00
( require 'helm-bookmark )
2022-04-25 19:54:47 +00:00
( helm-autoresize-mode 1 )
2022-08-28 15:25:43 +00:00
( setq helm-display-header-line nil
2022-08-28 15:56:55 +00:00
helm-autoresize-max-height 30
helm-autoresize-min-height 30 )
2022-08-28 15:25:43 +00:00
( setq helm-split-window-in-side-p t ; open helm buffer inside current window, not occupy whole other window
helm-ff-file-name-history-use-recentf t
helm-echo-input-in-header-line t )
2022-04-25 19:54:47 +00:00
( global-set-key ( kbd " C-x C-d " ) 'helm-browse-project )
2022-08-26 15:07:27 +00:00
( global-set-key ( kbd " C-x b " ) 'list-buffers )
2022-09-22 20:13:41 +00:00
( global-set-key ( kbd " C-x f " ) 'focus-mode )
( global-set-key ( kbd " C-x c " ) 'focus-read-only-mode )
2022-04-25 19:23:09 +00:00
( define-key global-map [ remap find-file ] 'helm-find-files )
( define-key global-map [ remap occur ] 'helm-occur )
( define-key global-map [ remap list-buffers ] 'helm-buffers-list )
( define-key global-map [ remap dabbrev-expand ] 'helm-dabbrev )
( define-key global-map [ remap execute-extended-command ] 'helm-M-x )
( define-key global-map [ remap apropos-command ] 'helm-apropos )
2023-04-07 19:26:46 +00:00
( define-key global-map [ remap bookmark-jump ] 'helm-filtered-bookmarks )
2022-04-25 19:23:09 +00:00
( unless ( boundp 'completion-in-region-function )
( define-key lisp-interaction-mode-map [ remap completion-at-point ] 'helm-lisp-completion-at-point )
( define-key emacs-lisp-mode-map [ remap completion-at-point ] 'helm-lisp-completion-at-point ) )
( add-hook 'kill-emacs-hook #' ( lambda ( ) ( and ( file-exists-p " $CONF_FILE " ) ( delete-file " $CONF_FILE " ) ) ) )
2022-09-06 19:08:49 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; activate helm after its fully configured
;(helm-mode 1)
2022-04-25 19:54:47 +00:00
2022-04-25 22:41:50 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-04-25 23:11:06 +00:00
; diminish config
; https://melpa.org/#/manage-minor-mode
; M-x: manage-minor-mode
;
; M-x: describe-mode
2022-04-26 12:32:27 +00:00
;(require 'diminish)
;(diminish 'rainbow-mode) ; Hide lighter from mode-line
;(diminish 'org-habit) ; im well aware i have org-habit enabled globally. thanks
;(diminish 'helm-mode)
;(diminish 'eldoc-mode)
2022-04-25 23:11:06 +00:00
2023-04-07 19:26:46 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-04-25 23:25:25 +00:00
; doom-modeline
( require 'doom-modeline )
( setq all-the-icons-color-icons nil )
( setq find-file-visit-truename t )
( doom-modeline-mode 1 )
2022-04-25 18:43:48 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; flyspell
2022-08-26 00:05:52 +00:00
( require 'flyspell )
( setenv " LANG " " en_US " )
( setq ispell-program-name " hunspell " )
( setq ispell-dictionary " en_US " )
( use-package flyspell :demand t
:config
( use-package
flyspell-correct-helm )
2022-08-26 13:45:51 +00:00
2022-08-26 00:05:52 +00:00
( defun flyspell-most-modes ( )
2022-08-26 13:45:51 +00:00
( add-hook 'text-mode-hook ( lambda ( ) ( flyspell-mode 1 ) ) )
( add-hook 'prog-mode-hook ( lambda ( ) ( flyspell-mode 1 ) ) )
2022-08-26 19:58:28 +00:00
( dolist ( hook ' ( change-log-mode-hook log-edit-mode-hook org-agenda ) )
2022-08-26 00:05:52 +00:00
( add-hook hook ( lambda ( )
( flyspell-mode -1 ) ) ) ) )
( flyspell-most-modes )
)
( defun flyspell-on-for-buffer-type ( )
" Enable Flyspell appropriately for the major mode of the current buffer. Uses `flyspell-prog-mode' for modes derived from `prog-mode' , so only strings and comments get checked. All other buffers get `flyspell-mode' to check all text. If flyspell is already enabled, does nothing. "
( interactive )
( if ( not ( symbol-value flyspell-mode ) ) ; if not already on
( progn
( if ( derived-mode-p 'prog-mode )
( progn
( message " Flyspell on (code) " )
( flyspell-prog-mode ) )
;; else
( progn
( message " Flyspell on (text) " )
( flyspell-mode 1 ) ) )
) ) )
( defun flyspell-toggle ( )
" Turn Flyspell on if it is off, or off if it is on. When turning on, it uses `flyspell-on-for-buffer-type' so code-vs-text is handled appropriately. "
( interactive )
( if ( symbol-value flyspell-mode )
( progn ; flyspell is on, t it off
( message " Flyspell off " )
( flyspell-mode -1 ) )
; else - flyspell is off, turn it on
( flyspell-on-for-buffer-type ) ) )
; flyspell keyboard shortcuts
( global-set-key ( kbd " C-x y " ) 'flyspell-toggle )
( global-set-key ( kbd " C-x w " ) 'flyspell-correct-wrapper )
2022-08-28 15:56:55 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-09-03 20:43:01 +00:00
; zoom (replaces golden-ratio)
( require 'zoom )
2024-07-16 18:20:02 +00:00
; sizing
;(setq zoom-size '(0.618 . 0.618))
( defun kmn-zoom-size-callback ( )
( cond
( ( equal major-mode 'dired-mode ) ' ( 0.20 . 0.20 ) )
( ( equal major-mode 'eww-mode ) ' ( 0.75 . 0.75 ) )
( ( equal major-mode 'eshell-mode ) ' ( 0.75 . 0.75 ) )
( ( string-equal ( window-dedicated-p ) " side " ) ' ( 0.15 . 0.15 ) )
( t ' ( 0.618 . 0.618 ) )
) )
; tuning
2023-04-07 15:05:09 +00:00
( custom-set-variables
2024-07-16 18:20:02 +00:00
' ( zoom-size 'kmn-zoom-size-callback )
' ( temp-buffer-resize-mode t )
; '(zoom-ignored-major-modes '(dired-mode))
; '(zoom-ignore-predicates '((lambda ()
; (if (string-equal (window-dedicated-p) "side") 'Y' nil)
; )))
)
( global-set-key ( kbd " C-x + " ) 'zoom )
( zoom-mode t )
2022-08-28 15:56:55 +00:00
2022-08-28 17:36:06 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; popup windows
2022-09-03 20:08:49 +00:00
( use-package popwin
:bind ( :map popwin:keymap
( " h " . popwin:close-popup-window )
2024-07-27 13:39:11 +00:00
( " r " . kmn/workspace-frame-scratch )
( " R " . kmn/popwin-scratch )
2023-04-10 19:22:13 +00:00
( " q " . kmn/popwin-quick-ref ) )
2022-09-03 20:08:49 +00:00
:config
( global-set-key ( kbd " C-w " ) popwin:keymap )
( push " _quick_reference.org " popwin:special-display-config ) )
2022-08-28 17:36:06 +00:00
( popwin-mode 1 )
2022-09-22 21:36:04 +00:00
2023-04-07 19:26:46 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; tabs-bar
2023-04-08 16:10:00 +00:00
;(tab-bar-mode t)
;(burly-tabs-mode 1)
2023-04-07 19:26:46 +00:00
2023-04-11 19:27:41 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; tab line via centaur tabs
( require 'centaur-tabs )
( setq centaur-tabs-set-bar 'under )
( setq centaur-tabs-set-close-button nil )
( setq centaur-tabs-set-modified-marker t )
( setq centaur-tabs-set-icons t )
( setq centaur-tabs-plain-icons t )
( setq centaur-tabs-cycle-scope 'tabs )
( setq centaur-tabs-show-new-tab-button nil )
( add-hook 'dired-mode-hook 'centaur-tabs-local-mode )
( add-hook 'org-agenda-mode 'centaur-tabs-local-mode )
( global-set-key ( kbd " C-c t i " ) 'centaur-tabs-backward )
( global-set-key ( kbd " C-c t <left> " ) 'centaur-tabs-backward )
( global-set-key ( kbd " C-c t e " ) 'centaur-tabs-forward )
( global-set-key ( kbd " C-c t <right> " ) 'centaur-tabs-forward )
( global-set-key ( kbd " C-c t y " ) 'centaur-tabs-local-mode )
( global-set-key ( kbd " C-c t <down> " ) 'centaur-tabs-local-mode )
( global-set-key ( kbd " C-c t <up> " ) 'centaur-tabs-local-mode )
( defun centaur-tabs-buffer-groups ( )
" `centaur-tabs-buffer-groups' control buffers' group rules.
Group centaur-tabs with mode if buffer is derived from ` eshell-mode ' ` emacs-lisp-mode ' ` dired-mode ' ` org-mode ' ` magit-mode '.
All buffer name start with * will group to \"Emacs\".
Other buffer group by ` centaur-tabs-get-group-name ' with project name. "
( list
( cond
( ( string-equal " * " ( substring ( buffer-name ) 0 1 ) )
( memq major-mode ' ( magit-process-mode
magit-status-mode
magit-diff-mode
magit-log-mode
magit-file-mode
magit-blob-mode
magit-blame-mode
) )
" Misc " )
( ( derived-mode-p 'dired-mode )
" Dired " )
( ( memq major-mode ' ( helpful-mode
help-mode ) )
" Help " )
( t
( centaur-tabs-get-group-name ( current-buffer ) ) ) ) ) )
2023-04-08 14:09:49 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; persp-mode
( setq persp-auto-resume-time -1.0 )
( with-eval-after-load " persp-mode-autoloads "
( setq wg-morph-on nil ) ;; switch off animation
( setq persp-autokill-buffer-on-remove 'kill-weak )
( add-hook 'window-setup-hook #' ( lambda ( ) ( persp-mode 1 ) ) ) )
2023-04-10 19:22:13 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; scratch buffer
; set mode options -- borrowed from : https://emacsredux.com/blog/2014/07/25/configure-the-scratch-buffers-mode/
; fundamental-mode / text-mode / org-mode
( setq initial-major-mode 'text-mode )
( setq initial-scratch-message " original scratch buffer " )
; persistent-scratch (melpa)
( persistent-scratch-autosave-mode 0 )
( global-set-key ( kbd " C-c r S " ) 'persistent-scratch-save )
( global-set-key ( kbd " C-c r r " ) 'persistent-scratch-restore )
( global-set-key ( kbd " C-c r w " ) 'persistent-scratch-save-to-file )
( global-set-key ( kbd " C-c r l " ) 'persistent-scratch-restore-from-file )
2024-03-07 17:58:46 +00:00
; scratch buffers frame - use 'scratch and prompts to manage as needed
( defun kmn/workspace-frame-scratch ( )
( interactive )
( let ( ( frame ( make-frame ) ) )
( select-frame-set-input-focus frame )
( delete-other-windows )
( scratch 'text-mode )
)
)
; scratch buffers frame, prompt for initial mode - use 'scratch and prompts to manage as needed
( defun kmn/workspace-frame-scratch-prompt ( )
( interactive )
( let ( ( frame ( make-frame ) ) )
( select-frame-set-input-focus frame )
( delete-other-windows )
( scratch ( let ( ( current-prefix-arg t ) ) ( scratch--buffer-querymode ) ) )
)
)
2023-04-10 19:22:13 +00:00
; scratch.el (multi-scratch / melpa)
2024-03-07 17:58:46 +00:00
( global-set-key ( kbd " C-c r s " ) #' kmn/workspace-frame-scratch )
( global-set-key ( kbd " C-c r p " ) #' kmn/workspace-frame-scratch-prompt )
2023-04-22 20:07:53 +00:00