Last active
May 9, 2025 09:05
-
-
Save orazdow/98d85929a70d58729e1ef0a97a754b14 to your computer and use it in GitHub Desktop.
init.el
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; -- windows emacs setup -- | |
;; | |
;; Place this file in C:\Users\Username\AppData\Roaming | |
;; add %HOME% to user environment variables | |
;; if msys2 and gnugpg installed put gpg4win GnuPG\bin in PATH before msys2 | |
;; for speedup in defender settings: add exclusions for emacs, .emacs.d folders | |
;; shorcut properties to start: | |
;; target: "C:\Program Files\Emacs\emacs-29.4\bin\runemacs.exe" -bg black -g 142x48 | |
;; start in: C:\Users\ollie | |
(setenv "HOME" "C:/Users/ollie") | |
(setq user-emacs-directory "C:/Users/ollie/.emacs.d/") | |
(setq user-init-file "C:/Users/ollie/.emacs.d/init.el") | |
(setq default-directory "C:/Users/ollie") | |
(setq package-gnupghome-dir "~/.emacs.d/elpa/gnupg") | |
; if msys2 usr/bin in path: | |
(setq-default find-program "C:/msys64/usr/bin/find.exe") |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(deftheme benthic-zone "the Benthic Zone..") | |
(let ( | |
(black "#00041a") | |
(black2 "#080019") | |
(black3 "#040420") | |
(blue "#94bfff") | |
(blue2 "#6dddfd") | |
(blue3 "#4f5987") | |
(blue4 "#858db7") | |
(blue5 "#656fa4") | |
(cyan "#39ffba") | |
(cyan2 "#01f7f7") | |
(orange "#ffc22a") | |
(orange2 "#ffad4a") | |
(pink "#f1b3f1") | |
(purple "#e193f2") | |
(purple2 "#9470ff") | |
(red "#ff446a") | |
(red2 "#ff3f85") | |
(white "#f8f8f0") | |
(white2 "#effaff") | |
(yellow "#ffee7a") | |
(yellow2 "#ffdf3a") | |
(grey "dddddd") | |
(grey2 "#aaaaaa") | |
(grey3 "#999999") | |
(grey4 "#dbdce2") | |
(darkgrey "#2b2d4f")) | |
(custom-theme-set-faces 'benthic-zone | |
`(default ((t (:background ,black2 :foreground ,white2 )))) | |
`(region ((t (:background ,darkgrey)))) | |
`(hl-line ((t ( :extend t :background "#0f0f1e")))) | |
`(cursor ((t (:foreground "#a7F3F3")))) | |
`(secondary-selection ((t (:background ,black )))) | |
`(fringe ((t (:background ,black )))) | |
`(mode-line-inactive ((t (:background ,black :foreground ,grey4 )))) | |
`(mode-line ((t (:background "#000000" :foreground "#c7c8ce" )))) | |
`(vertical-border ((t (:foreground "#000000" )))) | |
`(highlight ((t (:background unspecified :foreground unspecified)))) | |
`(window-divider ((t (:background ,black :foreground ,black )))) | |
`(font-lock-function-name-face ((t (:foreground ,red :fontStyle :bold nil :italic nil :underline nil )))) | |
`(font-lock-comment-face ((t (:foreground ,grey3 )))) | |
`(font-lock-string-face ((t (:foreground ,blue2 )))) | |
`(font-lock-keyword-face ((t (:foreground ,red )))) | |
`(font-lock-type-face ((t (:foreground ,cyan :fontStyle :underline nil )))) | |
`(font-lock-variable-name-face ((t (:foreground ,cyan :fontStyle :bold nil :italic nil :underline nil )))) | |
`(font-lock-keyword-face ((t (:foreground ,purple )))) | |
`(font-lock-number-face ((t (:foreground ,purple )))) | |
`(highlight-numbers-number ((t (:foreground ,purple )))) | |
`(font-lock-operator-face ((t (:foreground ,red )))) | |
`(highlight-operators-face ((t (:foreground ,red )))) | |
`(font-lock-builtin-face ((t (:foreground ,pink :fontStyle :bold nil :italic nil :underline nil )))) | |
;; `(font-lock-property-name-face ((t (:foreground ,red )))) | |
`(font-lock-property-use-face ((t (:foreground ,white2 )))) | |
`(font-lock-function-call-face ((t (:foreground ,cyan )))) | |
`(font-lock-constant-face ((t (:foreground ,purple )))) | |
`(line-number ((t (:foreground "#707070" )))) | |
`(line-number-current-line ((t (:foreground ,white2 )))) | |
`(show-paren-match ((t (:background unspecified :foreground ,cyan )))) | |
`(show-paren-mismatch ((t (:background unspecified :foreground ,red)))) | |
;; `(js2-object-property ((t (:foreground ,cyan2 )))) | |
`(js2-function-param ((t (:foreground ,orange2 )))) | |
`(js2-function-call ((t ( :foreground ,cyan2 )))) | |
`(vertical-border ((((class color) (min-colors 89)) (:foreground ,black)))) | |
`(border ((t (:background unspecified :foreground unspecified)))) | |
`(iedit-occurrence ((t (:foreground "white" :background "LightSeaGreen")))) | |
;; '(js2-warning ((((class color) (min-colors 89)) (:underline "#f99157")))) | |
;; '(js2-error ((((class color) (min-colors 89)) (:foreground nil :underline "#f2777a")))) | |
;; '(js2-external-variable ((((class color) (min-colors 89)) (:foreground "#cc99cc")))) | |
;; '(js2-instance-member ((((class color) (min-colors 89)) (:foreground "#6699cc")))) | |
;; '(js2-object-property-access ((((class color) (min-colors 89)) (:foreground "#f99157")))) | |
;; '(js2-private-member ((((class color) (min-colors 89)) (:foreground "#cc99cc")))) | |
)) | |
;; (window-divider-mode 0) | |
;; add numbers, operators highlighting | |
(add-hook 'js-mode-hook #'(lambda () | |
(font-lock-add-keywords nil | |
'(("\\b\\([0-9]+\\([eE][+-]?[0-9]*\\)?\\)\\b" 1 'font-lock-number-face) | |
("\\([!%&*+<-?|~^-]\\)" 0 'font-lock-operator-face) | |
("\\([^/]\\)\\(/\\)\\([^/]\\)" 2 'font-lock-operator-face) | |
) | |
))) | |
;;;###autoload | |
(when load-file-name | |
(add-to-list 'custom-theme-load-path | |
(file-name-as-directory (file-name-directory load-file-name)))) | |
;;;###autoload | |
(defun benthic-zone-theme() | |
(interactive) | |
(load-theme 'benthic-zone t)) | |
(provide-theme 'benthic-zone) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(set-face-attribute 'default nil :background "#000000" :foreground "#eeeeee") | |
(tool-bar-mode -1) | |
(menu-bar-mode -1) | |
(scroll-bar-mode -1) | |
(setq inhibit-startup-message t) | |
(setq gc-cons-threshold most-positive-fixnum gc-cons-percentage 0.6) | |
(defvar _alist file-name-handler-alist) | |
(setq file-name-handler-alist nil) | |
(add-hook 'emacs-startup-hook (lambda () (setq file-name-handler-alist _alist))) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(require 'package) | |
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) | |
(add-to-list 'package-archives '("nongnu" . "https://elpa.nongnu.org/nongnu/") t) | |
; -------------- themes -------------- | |
(defun theme-init () (interactive) | |
(load "~/.emacs.d/theme/benthic-zone-theme.el") | |
(load-theme 'benthic-zone) | |
(set-cursor-color "#32b343") | |
(custom-set-faces | |
'(mode-line ((t (:background "#22222b" :box (:line-width 1 :color "#22222b"))))) | |
'(ivy-minibuffer-match-face-1 ((t (:background "RoyalBlue" :foreground "black")))) | |
'(ivy-minibuffer-match-face-2 ((t (:inherit 'ivy-minibuffer-match-face-1)))) | |
'(swiper-background-match-face-1 ((t (:inherit 'ivy-minibuffer-match-face-1)))) | |
'(swiper-background-match-face-2 ((t (:inherit 'ivy-minibuffer-match-face-1)))) | |
'(swiper-match-face-1 ((t (:background "SkyBlue2" :foreground "black")))) | |
'(swiper-match-face-2 ((t (:inherit 'swiper-match-face-1)))) | |
'(mc/cursor-bar-face ((t (:foreground "SpringGreen2" :height 1.1)))) | |
)) | |
; -------------- fonts ----------------- | |
(set-frame-font "Roboto Mono 10") | |
;; (set-frame-font "Droid Sans Mono 11") | |
;; (set-frame-font "Liberation Mono 12") | |
;; (set-frame-font "Meslo LG M 11") | |
;; (set-frame-font "Menlo 11") | |
; -------------- settings -------------- | |
(setq make-backup-files nil | |
create-lockfiles nil | |
auto-save-default nil | |
ring-bell-function 'ignore | |
recentf-auto-cleanup 480 | |
use-short-answers t | |
help-window-select t | |
warning-minimum-level :error | |
mouse-wheel-scroll-amount '(9 ((shift) . 40)) | |
mouse-wheel-progressive-speed nil | |
mouse-wheel-tilt-scroll t | |
void-text-area-pointer nil | |
bookmark-set-fringe-mark nil | |
dired-kill-when-opening-new-dired-buffer t | |
frame-title-format "" ;"%f" | |
custom-safe-themes t) | |
(setq-default truncate-lines t | |
display-line-numbers-type t | |
display-line-numbers-width 3 | |
font-lock-maximum-decoration 3 | |
indent-tabs-mode nil | |
cursor-type 'bar | |
scroll-bar-width 20 | |
c-basic-offset 4 | |
tab-width 4) | |
;; (require 'desktop) | |
;; (setq desktop-path '("~/.emacs.d")) | |
;; (desktop-save-mode 1) | |
;; (setq desktop-restore-frames nil) | |
(recentf-mode t) | |
(savehist-mode 1) | |
(winner-mode t) | |
(show-paren-mode t) | |
(global-eldoc-mode -1) | |
(electric-pair-mode t) | |
(fringe-mode '(4 . 4)) | |
;; (scroll-bar-mode) | |
(transient-mark-mode t) | |
(global-hl-line-mode 1) | |
(delete-selection-mode t) | |
(pixel-scroll-precision-mode 1) | |
(defalias 'yes-or-no-p 'y-or-n-p) | |
(add-hook 'prog-mode-hook 'display-line-numbers-mode) | |
(define-key messages-buffer-mode-map (kbd "<escape>") 'quit-window) | |
(with-eval-after-load 'help-mode (define-key help-mode-map (kbd "<escape>") 'quit-window)) | |
(define-key minibuffer-local-map (kbd "<escape>") 'keyboard-escape-quit) | |
(setq heading-search "\\(?:/\\{2,\\}\\|;+\\|#+\\|/\\*+\\)[ \t]*-\\{3,\\}") ; 3+ - | |
(defun display-startup-echo-area-message ()(message "~~--==--~~")) | |
;---------keys------------- | |
(cua-mode t) | |
;; (setq-default cua-copy-keep-mark nil) | |
(defun set-keydefs () | |
; C-x C-f, C-x f find file | |
(global-set-key (kbd "C-x f") 'counsel-find-file) | |
(global-set-key (kbd "C-x C-f") 'counsel-find-file) | |
; C-x k, C-x C-k kill buffer | |
(global-set-key (kbd "C-x C-k") 'kill-buffer) | |
; M-z, counsel M-x | |
(global-set-key (kbd "M-x") 'counsel-M-x) | |
; C-B eval buffer | |
(global-set-key (kbd "C-S-b") 'eval-buffer) | |
; zoom | |
(global-set-key (kbd "C-+") 'text-scale-increase) | |
(global-set-key (kbd "C-_") 'text-scale-decrease) | |
; C-x C-a open recent files | |
(global-set-key (kbd "C-x C-a") 'recentf-open-files) | |
; expand region | |
(global-set-key (kbd "C-=") 'er/expand-region) | |
(global-set-key (kbd "C-.") 'er/expand-region) | |
(global-set-key (kbd "C-,") 'er/contract-region) | |
; C-; iedit mode | |
(global-set-key (kbd "C-;") 'iedit-mode) | |
; C-x C-b, C-x b ivy-switch-buffer | |
(global-set-key (kbd "C-x C-b") 'ivy-switch-buffer) | |
(global-set-key (kbd "C-x b") 'ivy-switch-buffer) | |
; c-x r counsel recentf | |
(global-set-key (kbd "C-x r") 'counsel-recentf) | |
; C-z, C-y undo/redo | |
(global-set-key (kbd "C-z") 'undo-fu-only-undo) | |
(global-set-key (kbd "C-y") 'undo-fu-only-redo) | |
(global-set-key (kbd "C-x t") 'eshell) | |
; C-c C-a mark all | |
(define-key global-map (kbd "C-c") (make-sparse-keymap)) | |
(global-set-key (kbd "C-c C-a") 'mark-whole-buffer) | |
; C-P toggle menu bar | |
(global-set-key (kbd "C-S-p") 'toggle-menu-bar-mode-from-frame) | |
(global-set-key (kbd "<f10>") 'toggle-frame-maximized) | |
(global-set-key (kbd "<f11>") 'toggle-frame-fullscreen) | |
; mouse side buttons | |
(global-set-key (kbd "<mouse-4>") 'previous-buffer) | |
(global-set-key (kbd "<mouse-5>") 'next-buffer) | |
(global-set-key (kbd "C-<mouse-4>") 'pixel-scroll-interpolate-down) | |
(global-set-key (kbd "C-<mouse-5>") 'pixel-scroll-interpolate-up) | |
(global-set-key (kbd "M-<mouse-4>") 'delete-other-windows) | |
(global-set-key (kbd "M-<mouse-5>") 'split-window-right) | |
; split window, refocus | |
(global-set-key (kbd "C-x 2") (lambda () (interactive)(split-window-vertically) (other-window 1))) | |
(global-set-key (kbd "C-x 3") (lambda () (interactive)(split-window-horizontally) (other-window 1))) | |
; window focus | |
(global-set-key (kbd "M-.") 'windmove-right) | |
(global-set-key (kbd "M-,") 'windmove-left) | |
(global-set-key (kbd "M->") 'toggle-maximize) | |
(global-set-key (kbd "M-<") 'window-swap-states) | |
; C-/ comment | |
(global-set-key (kbd "C-/") 'toggle-comment) | |
; C-l select line | |
(global-set-key (kbd "C-l") 'select-current-line) | |
(global-set-key (kbd "C-S-l") 'recenter-top-bottom) | |
(global-set-key (kbd "M-n") 'narrow-or-widen-dwim) | |
(global-set-key (kbd "C-:") 'narrow-or-widen-paragraph-iedit) | |
(global-set-key (kbd "C-x C-c") 'fast-kill-emacs) | |
(global-set-key (kbd "C-c l r") 'list-colors-display) | |
(global-set-key (kbd "C-q") 'keyboard-quit) | |
(global-set-key (kbd "M-i") 'backward-sentence) | |
(global-set-key (kbd "M-o") 'forward-sentence) | |
(global-set-key (kbd "M-<left>") 'back-to-indentation) | |
(global-set-key (kbd "M-<right>") 'move-end-of-line) | |
(global-set-key (kbd "C-d") 'mc/mark-next-like-this) | |
(global-set-key (kbd "C-S-d") 'duplicate-line) | |
(global-set-key (kbd "M-d") 'duplicate-dwim) | |
(global-set-key (kbd "C-S-k") 'kill-whole-line) | |
(global-set-key (kbd "C-S-s") 'isearch-selected) | |
(global-set-key (kbd "C-c C-s") 'swiper) | |
(global-set-key (kbd "C-c s") 'copy-to-file) | |
; backtab | |
(global-set-key (kbd "<backtab>") 'dumb-backtab) | |
(global-set-key (kbd "C-x m") 'point-to-register) | |
(global-set-key (kbd "C-x j") 'register-to-point) | |
(global-set-key (kbd "C-<prior>") 'previous-heading) | |
(global-set-key (kbd "C-<next>") 'next-heading) | |
(global-set-key (kbd "M-<prior>") 'previous-heading) | |
(global-set-key (kbd "M-<next>") 'next-heading) | |
(global-set-key (kbd "S-<prior>") (lambda ()(interactive) (scroll-down 3))) | |
(global-set-key (kbd "S-<next>") (lambda ()(interactive) (scroll-up 3))) | |
(global-set-key (kbd "C-<") 'beginning-of-buffer) | |
(global-set-key (kbd "C->") 'end-of-buffer) | |
) | |
; C-g, C-q keyboard quit | |
; M-h mark parag | |
; M-up/dn move-text | |
; M-n narrow/widen | |
; C-x C-w save as | |
; C-c C-a mark all | |
; C-x C-c fast quit | |
; C-/ comment | |
; C-l select line | |
; C-c l r display colors | |
; C-x d dired | |
; C-x C-j dired jump | |
; C-x left/right switch buffer | |
; C-x 0 delete window | |
; C-x 1 delete other windows | |
; C-x 2 split window below | |
; C-x 3 split window right | |
; M-S-<dir> focus window | |
; C-d mc mark next | |
; C-S isearch selected | |
; M-d kill word | |
; C-k kill line | |
; C-K kill whole line | |
; C-D duplicate line | |
; M-d duplicate dwim | |
; M-g g goto line | |
; M-<, M-> go to beggining/end | |
; C-a, M-left beggining of line | |
; C-e, M-right end of line | |
; M-a, M-i beggining of sentence | |
; M-e, M-o end of sentence | |
; C-M-<left>/<right> bkwd/fwd sexp | |
; C-M-backspace backward-kill-sexp | |
; C-^ delete-indentation | |
; C-M-\ indent region | |
; C-x m mark register point | |
; C-x j jump to register point | |
; C-pgup/pgdown cycle headings | |
; win undo/redo C-c <left>/<right> | |
(theme-init) | |
(set-keydefs) | |
;---------imports------------ | |
(load "~/.emacs.d/sessions.el") | |
(add-hook 'emacs-startup-hook #'open-session-menu) | |
;; (add-hook 'emacs-startup-hook #'load-recent-session) | |
;; (add-hook 'emacs-startup-hook (lambda () (load-recent-session t))) | |
; counsel / ivy, prescient | |
(use-package counsel :ensure t | |
:after ivy | |
:config | |
(setq ivy-height 8) | |
(setq ivy-initial-inputs-alist nil) | |
(define-key ivy-minibuffer-map (kbd "TAB") 'ivy-partial) | |
(define-key ivy-minibuffer-map (kbd "<return>") 'ivy-alt-done) | |
(define-key ivy-minibuffer-map (kbd "<escape>") 'minibuffer-keyboard-quit) | |
:init (ivy-mode 1)) | |
(use-package ivy-prescient :ensure t | |
:after ivy | |
:config | |
(setq prescient-sort-length-enable nil) | |
(setq prescient-frequency-decay 0.5) | |
(setq ivy-prescient-enable-filtering nil) | |
(ivy-prescient-mode 1) | |
(prescient-persist-mode 1)) | |
; autocomplete | |
(use-package company :ensure t | |
:config | |
(setq company-backends '((company-dabbrev-code))) | |
(setq company-dabbrev-code-ignore-case t) | |
(setq company-idle-delay 0.1) | |
(setq company-minimum-prefix-length 2) | |
(define-key company-active-map (kbd "<tab>") 'company-complete-selection) | |
(add-hook 'after-init-hook 'global-company-mode)) | |
; undo | |
(use-package undo-fu :ensure t) | |
; iedit | |
(use-package iedit :ensure t) | |
; expand region | |
(use-package expand-region :ensure t) | |
; move-text | |
(use-package move-text :ensure t :config (move-text-default-bindings)) | |
; multiple-cursors | |
(use-package multiple-cursors :ensure t | |
:config | |
(define-key mc/keymap (kbd "C-g") | |
(let ((mc-quit | |
(lambda () | |
(interactive) | |
(mc/disable-multiple-cursors-mode) | |
(deactivate-mark)))) | |
(define-key mc/keymap (kbd "C-g") mc-quit) | |
(define-key mc/keymap (kbd "C-q") mc-quit)))) | |
;---------mode line--------------- | |
(defface modeline-dir '((t (:foreground "deep sky blue"))) "modeline directory") | |
(defface modeline-buffer-modified '((t (:foreground "light green"))) "modeline modified buffer") | |
(defface modeline-buffer-unmodified '((t (:foreground "white"))) "modeline unmodified buffer") | |
(defface modeline-mode '((t (:foreground "#7e8d9a"))) "modeline mode name") | |
(defface modeline-mc '((t (:foreground "MediumAquamarine"))) "modeline mc numcursors") | |
(defun position () | |
(let* ((chars '(".____" "_.___" "__.__" "___._" "____.")) | |
(total (max 1 (line-number-at-pos (point-max)))) | |
(pos (min 4 (floor (* (/ (float (line-number-at-pos)) total) 5)))) | |
(symbol (nth pos chars))) | |
symbol)) | |
(setq mode-line-right-align-edge 'right) | |
(setq-default mode-line-format | |
'( | |
" " | |
; directory and buffer | |
(:eval (let* ((dir (file-name-directory (or buffer-file-name default-directory))) | |
(parent (file-name-nondirectory (directory-file-name dir))) | |
(face (if (buffer-modified-p) 'modeline-buffer-modified 'modeline-buffer-unmodified))) | |
(concat (propertize (concat parent "/ ") 'face 'modeline-dir) | |
(propertize (buffer-name) 'face face)))) | |
; Right-align | |
mode-line-format-right-align | |
; position ascii | |
(:eval (propertize (format "%s " (position)) 'face 'modeline-mode)) | |
; mc mode | |
(:eval (when (> (mc/num-cursors) 1) (propertize (format "mc:%d " (mc/num-cursors)) 'face 'modeline-mode ))) | |
; mode name | |
(:eval (propertize (format "%s" (string-remove-suffix "-mode" (symbol-name major-mode))) 'face 'modeline-mode)) | |
" " | |
)) | |
;------------functions------------- | |
; select line | |
(defun select-current-line () | |
(interactive) | |
(forward-line 0) | |
(set-mark-command nil) | |
(forward-line 1)) | |
; keep search mark on esc | |
(defun isearch-mark-exit () | |
(interactive) | |
(isearch-done) | |
(push-mark isearch-other-end 'no-message 'activate)) | |
(define-key isearch-mode-map (kbd "<escape>") 'isearch-mark-exit) | |
; live server | |
(defun serve () (interactive) | |
(with-current-buffer (get-buffer-create "*live-server*") | |
(eshell-mode) | |
(goto-char (point-max)) | |
(insert "live-server") | |
(eshell-send-input))) | |
; toggle maximize split | |
(setq window-maximized nil) | |
(defun toggle-maximize () | |
(interactive) | |
(when (not (one-window-p)) | |
(if window-maximized | |
(balance-windows) | |
(maximize-window)) | |
(setq window-maximized (not window-maximized)))) | |
(defun minibuffer-toggle () | |
(define-key (current-local-map) (kbd "M-x") 'keyboard-escape-quit)) | |
(add-hook 'minibuffer-setup-hook #'minibuffer-toggle) | |
; delete line | |
(defun kill-whole-line () (interactive) (forward-line 0) (kill-line)) | |
; sublime-style comment toggle | |
(defun toggle-comment () | |
(interactive) | |
(let ((beg (if (region-active-p) (region-beginning) (line-beginning-position))) | |
(end (if (region-active-p) (region-end) (line-end-position)))) | |
(comment-or-uncomment-region beg end))) | |
; fast quit | |
(defun fast-kill-emacs () | |
"save some buffers, then exit unconditionally" | |
(interactive) | |
(save-some-buffers nil t) | |
(kill-emacs)) | |
; cycle headings | |
(defun next-heading () | |
(interactive) | |
(forward-line) | |
(or (re-search-forward heading-search nil t) | |
(progn | |
(goto-char (point-min)) | |
(re-search-forward heading-search nil t))) | |
(beginning-of-line)) | |
(defun previous-heading () | |
(interactive) | |
(beginning-of-line) | |
(or (re-search-backward heading-search nil t) | |
(progn | |
(goto-char (point-max)) | |
(re-search-backward heading-search nil t))) | |
(beginning-of-line)) | |
; minibuffer mouse unfocus | |
(defun stop-using-minibuffer () | |
(when (and (not (minibufferp)) | |
(>= (recursion-depth) 1) (active-minibuffer-window)) | |
(abort-recursive-edit))) | |
(add-hook 'mouse-leave-buffer-hook 'stop-using-minibuffer) | |
; right click copy selection | |
(defadvice mouse-save-then-kill (around mouse2-copy-region activate) | |
(when (region-active-p) | |
(copy-region-as-kill (region-beginning) (region-end))) ad-do-it) | |
; isearch selected | |
(defun isearch-selected () | |
(interactive) (deactivate-mark) | |
(call-interactively 'isearch-forward-symbol-at-point)) | |
; open explorer | |
(defun explorer() | |
(interactive) | |
(shell-command "explorer .")) | |
; dumb tabs | |
(defun dumb-tab () (interactive) | |
(let ((start (if (use-region-p) (region-beginning) (line-beginning-position))) | |
(end (if (use-region-p) (region-end) (line-end-position)))) | |
(indent-rigidly start end tab-width) | |
(setq deactivate-mark nil))) | |
(defun dumb-backtab () (interactive) | |
(let ((start (if (use-region-p) (region-beginning) (line-beginning-position))) | |
(end (if (use-region-p) (region-end) (line-end-position)))) | |
(indent-rigidly start end (- tab-width)) | |
(setq deactivate-mark nil))) | |
; keep mark on cua copy | |
;; (defun copy-keep-mark (orig-fun &rest args) | |
;; (prog1 (apply orig-fun args) (message "copied") | |
;; (run-with-idle-timer 0.7 nil (lambda () (message ""))) | |
;; (setq deactivate-mark nil))) | |
;; (when (bound-and-true-p cua-copy-keep-mark) | |
;; (advice-add 'cua-copy-region :around 'copy-keep-mark)) | |
; save buffer as | |
(defun copy-to-file () (interactive) | |
(let* ((curr (buffer-file-name)) | |
(new (read-file-name "Copy to file: " nil nil nil | |
(and curr (file-name-nondirectory curr)))) | |
(mustbenew (if (and curr (file-equal-p new curr)) 'excl t))) | |
(save-restriction (widen) | |
(write-region (point-min) (point-max) new nil nil nil mustbenew)))) | |
; pgup/dn less than default | |
(defvar fk/default-scroll-lines 40) | |
(defun fk/scroll-up (orig-func &optional arg) | |
(apply orig-func (list (or arg fk/default-scroll-lines)))) | |
(defun fk/scroll-down (orig-func &optional arg) | |
(apply orig-func (list (or arg fk/default-scroll-lines)))) | |
(advice-add 'scroll-up :around 'fk/scroll-up) | |
(advice-add 'scroll-down :around 'fk/scroll-down) | |
; endlessparentheses.com/emacs-narrow-or-widen-dwim.html | |
(defun narrow-or-widen-dwim (p) | |
(interactive "P") | |
(cond ((and (buffer-narrowed-p) (not p)) (widen)) | |
((region-active-p) | |
(narrow-to-region (region-beginning) (region-end))) | |
(t (narrow-to-defun)))) | |
(defun narrow-or-widen-paragraph-iedit () | |
(interactive) | |
(let ((original-point (point))) | |
(if (buffer-narrowed-p) | |
(progn | |
(widen) | |
(iedit-mode -1)) | |
(mark-paragraph) | |
(narrow-to-region (region-beginning) (region-end)) | |
(deactivate-mark) | |
(goto-char original-point) | |
(iedit-mode)))) | |
(custom-set-variables | |
;; custom-set-variables was added by Custom. | |
;; If you edit it by hand, you could mess it up, so be careful. | |
;; Your init file should contain only one such instance. | |
;; If there is more than one, they won't work right. | |
'(package-gnupghome-dir nil) | |
'(package-selected-packages nil)) | |
(custom-set-faces | |
;; custom-set-faces was added by Custom. | |
;; If you edit it by hand, you could mess it up, so be careful. | |
;; Your init file should contain only one such instance. | |
;; If there is more than one, they won't work right. | |
) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;; sessions.el --- Minimal named session manager -*- lexical-binding: t; -*- -by chatgpt | |
(defvar shark " | |
. ..:..:::::. :.::::.:::..: . . . :... .....:....:::. | |
..:... -::-:.. .::-:.:.. . . .. . ........ | |
. ....:.... : ....:.. . ..::.. .. .... . .. .::.. | |
. ...:. .... .:.: .. . :..:.. ........ . . .. . . | |
.. . . . . ..... . . :.. ... . .. . . . :....: | |
. ... . . . . . . . . .. :........ ... .... ..:::... | |
. . . . . .. .. . . ... ...:::.:: | |
. : . . . . . . . . ... . ... .... . | |
:::- . . . . .. ..... .. .. . .... .. | |
. .. ::::: .. . ...... ... . . | |
.. . .. ... ..:. .:::::-........... .. .. .. . | |
:....:...........:::..:::----+::::::::::::::..... . . . . . | |
::::::::::::.::::::::-:--=----::+-*+==----:::::::::.::...:.:::.... . | |
::::--:-----:::::::------------======-+*****+==-=-----:-==---::::::.. . | |
:-+++++*******-::-----:----===---========+*++#%###%%##%*#****+--:::::........ | |
#%#%%%@%@%@@@@@@#=::=-----=----=-=====+*=*=+==*=+@@@%@%%%@%#%%****+=::::::::.. | |
@@@@@@@@@@@@@@@@@@@@%**=-==--=-===:--+-=-=-=====++*++@@@@@@@@@@@@@%*+--::::::: | |
@@@@@@@@@@@@@@@@@@@=+***+++==-------:----=-+==-==+++==*++@@@@@@@@@@%#@*#==---: | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@+:+=-:-:--::-:=-+==++=====+=+=+++@@@@@@@@@@@@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*--=:::::::::--=-+======++++*+++++@@@@@@@@@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*=::::+=-----=-==++====++*+++==+=++@@@@@@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@**+++===--:---==========+++++==++++@@@@@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@@@@@@@@***++=+=+==+++--------==--==-++++++++++++*@@@@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@#******+++++=+++:::-:::::+====-=-======++++++++++**@@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@@@@*%*****+==#@@@@@@@@*+==-::*++===--=====+++++*+***@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*+=-::++==-=====+++++*@@@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*+=--:::-**+++**%@@@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*+=-====**%%@@@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@%@") | |
(defvar ak " | |
++==-==============... | |
:===---===========+++===*++++=: | |
=--:-=:-::-============+++++===+==+=. | |
.===-:---::-=====-:--==========+=++++#*==+ . | |
.--::::.:---:=---------==::=====-::-==-:=-+. | |
. . .=-=:==-:--:::::--======------==-::::::::::-=: . | |
. . . . . =:.:::::-:::-=::=-:=+- .:=-===-:-==-::.::::-:. . . . . . . . . | |
. . . .:==-:.:::--::-=- .:===:.:===+=:==-: =:::-.. . . . . . | |
............=::::.::::------:-----: .-==========- :-:=........ ............. | |
............==:::..:::-======--::-===========+==::::-=::=.......... . ....... | |
.............--===-::::-=========++===========++=+++*=::...................... | |
............-::::-:-::::---====+======--:::===+=====+==:...................... | |
............=-:::.:::::::-----====--=--::::::::::===-=--...................... | |
.............:=:---:::::::------=--::....::..:::--=---:....................... | |
.............-::-=::::::::::::::=:-.--==::::--.:---::-==...................... | |
.............=:::::::::-:::::-:---::-====---=-::::-----....................... | |
..............:-====::::-:-::=::=-:-::::.:...::::::::=........................ | |
.............:-::-===--=::::=:-=:::::::::::--::-::::-===...................... | |
............:====--===---:-:::::::-.::::::::::::::::====:..................... | |
:::-========-::-=+++==-=-=-+==-==================:.:-:........................ | |
+=+++========-=-:::---=-=--:-::::::::::.:.:..:. .:::.:=++++-:................. | |
+++=+++======-:-==----=-::===-=======--==---=-==-+-==-===+=+++*****++++::..... | |
++=========+==---===---=-=:==-=::.:... .:::::::::::::-===+++++++*******+==+.. | |
=++++=+=++====-+=========-:-:-:-:::.:..::.:::::::-::::-=====+=+++=+++++=++++=+ | |
=+=++===+==++==-====---==--=+=*+*+=+=-+===-=-=*++::-----===========+===++===++") | |
(defvar ancient " | |
-+=#==: ::=== ::= | |
=:* :=---: - .=-====:-=-=:-=--==-:===::* | |
.:+*::*-:::: =::===-=:-===:==-=======+:==== | |
=-.. .::::: :+.. ==---:=-============:-+=-: | |
:=*===. :-:-:===-=:=====-==========-==- | |
-#*====::: =:=.:-.:=:=============+===-=== | |
:*+==+:==::: :=-=::=-::===========:--+=====.- | |
=-+**=--:.:: :::..:::=+=====================-:: | |
-***#=::=:::: .:-:.=:=========================--= | |
==+++--=::.:- :::::::===================+=====--: | |
=+=+=* =:::: .:..:.---======++==-=-== =-==-=---: | |
:+=++= :--::: .:. :: ..:::::-::::=+=:--:=-===-=::. | |
-==-=: : =:: . .===::. .:::+==-=*==-:=:=----::: | |
=-=-:.: :-*:: :=++==-=======+-====.==-=----:::: | |
:.==-= :::::- . .::--=-=-- ========:.:-:=::-::.:. | |
=+=== :-#::. . ..::::.-::--:.. ==:----::::::.:. | |
:=== :-- ======+==-===========::::::::.:::=+- | |
-: =-.:=-:= . ::::::::.:::::-:=:--:::::::::::---==- | |
===:::=-:: ....:. :. .:::::::... ..::::=--===== | |
=+== =::::- . .:.:.. .:.....::: . .-:========= | |
= ===:-::-:- . .. .. .: . . ...::=+======== | |
= :: ::. := . :: . ....:.:.:-+=====: | |
=+==-:+::.:- . . ... .... ..:.:.:=+====-=: | |
-:::- +::::: . . . . .:.::::::.::-: =+==+====+ | |
== -+ =--:.:.. .. . .:::: :.:.-::::-=:=========-= | |
== .. =--.:: . . .: :::-+=--=::-==+===+=+=+=: | |
+-- :: =:- .: ..::.:=-=+++=++:---:-=-====*==- | |
--:-- =::.:- . . . .:::==:==++=*+=:=::-:====+=:=- | |
.-:-- :-::.: :. . ...::=+:==-==-=:-=::::.:=-==-=-- | |
: := ==::: .. .-:--::===--==:--:===-:=:.:==-===== | |
::- ==.-: ::::-:-:-==--::-:==:==- -...-=::-=-- | |
== = ==::: :-:::==:=::::--.=:::=-::-..:.::::=-: | |
:=- =- :: :. :--:.-::=--:-.:==:-::: :-.:::=:=: | |
.:=- +=:-- .:::-:-.:--=-=-:=::.==-::: ::::-:=--- | |
# +=-:: :::::-:-::::---==--:==::::...::::.=:: | |
-:: ::::::-:-=:--===-====-:=-:....:...:.-") | |
(require 'wid-edit) | |
(setq session-store-file "~/.emacs.d/.sessions") | |
(setq session-table nil) | |
(setq menubuffer " ") | |
(setq ascii-art ak) | |
(setq re-order-on-load t) | |
(setq display-recentf t) | |
(defun load-session-table () | |
"load sessions if session-table is empty" | |
(unless session-table | |
(when (file-exists-p session-store-file) | |
(setq session-table | |
(with-temp-buffer | |
(insert-file-contents session-store-file) | |
(read (current-buffer))))))) | |
(defun save-session-table () | |
"save `session-table` to disk." | |
(with-temp-file session-store-file | |
(prin1 session-table (current-buffer)))) | |
(defun re-order-session (name table) | |
"return table with session (name) moved to the front." | |
; (setq session-table (re-order-session "name" session-table)) | |
(let ((session (assoc name table))) | |
(if session | |
(cons session (assoc-delete-all name table)) | |
table))) | |
(defun kill-unmodified-buffers () | |
"kill file buffers unless they are modified" | |
(dolist (buf (buffer-list)) | |
(when (and (buffer-file-name buf) | |
(not (buffer-modified-p buf))) | |
(kill-buffer buf)))) | |
(defun save-session (name) | |
"save the current session (name)" | |
(interactive | |
(list (completing-read "Save session: " (mapcar #'car session-table)))) | |
(load-session-table) | |
(when (assoc name session-table) | |
(unless (yes-or-no-p (format "Session '%s' exists. Overwrite? " name)) | |
(user-error "Canceled"))) | |
; filtered file buffer list | |
(let ((buffers (cl-remove-if-not | |
(lambda (b) (buffer-file-name b)) | |
(buffer-list))) | |
; window state | |
(state (window-state-get (frame-root-window) t))) | |
; set session entry | |
(setf (alist-get name session-table nil nil #'equal) | |
`(:buffers ,(mapcar (lambda (b) | |
(with-current-buffer b | |
(cons (buffer-file-name) (point)))) | |
buffers) | |
:window-state ,state | |
:current-file ,(buffer-file-name (current-buffer)))) | |
; re-order and save table | |
(setq session-table (re-order-session name session-table)) | |
(save-session-table) | |
(message "Saved session '%s'" name))) | |
(defun load-session (name &optional single-window) | |
"restore session (name)" | |
(interactive | |
(list (completing-read "Restore session: " (mapcar #'car session-table)))) | |
(load-session-table) | |
(kill-unmodified-buffers) | |
(let* ((session (assoc name session-table)) | |
(buffers (plist-get (cdr session) :buffers)) | |
(state (plist-get (cdr session) :window-state)) | |
(current-file (plist-get (cdr session) :current-file))) | |
; restore cursor pos from buffers | |
(dolist (el buffers) | |
(let ((file (car el)) | |
(pos (cdr el))) | |
(when (file-exists-p file) | |
(with-current-buffer (find-file-noselect file) (goto-char pos))))) | |
; restore session | |
(if (and single-window current-file) | |
(find-file current-file) | |
(window-state-put state (frame-root-window) 'safe)) | |
; re-order table | |
(when re-order-on-load | |
(setq session-table (re-order-session name session-table))) | |
(save-session-table)) | |
(message "%s" name)) | |
(defun load-recent-session (&optional single-window) (interactive) | |
"restore most recent session" | |
(load-session-table) | |
(kill-unmodified-buffers) | |
(when-let ((session (nth 0 session-table))) | |
(let* ((name (car session)) | |
(buffers (plist-get (cdr session) :buffers)) | |
(state (plist-get (cdr session) :window-state)) | |
(current-file (plist-get (cdr session) :current-file))) | |
; restore cursor pos from buffers | |
(dolist (el buffers) | |
(let ((file (car el)) | |
(pos (cdr el))) | |
(when (file-exists-p file) | |
(with-current-buffer (find-file-noselect file) (goto-char pos))))) | |
; restore session | |
(if (and single-window current-file) | |
(find-file current-file) | |
(window-state-put state (frame-root-window) 'safe)) | |
(message "%s" name)))) | |
(defun delete-session (name) | |
"delete session (name)" | |
(interactive | |
(list (completing-read "Delete session: " (mapcar #'car session-table)))) | |
(load-session-table) | |
(unless (assoc name session-table) | |
(user-error "No session named '%s'" name)) | |
(when (yes-or-no-p (format "Really delete session '%s'? " name)) | |
(setq session-table (assoc-delete-all name session-table)) | |
(save-session-table) | |
(message "deleted session '%s'" name))) | |
(defun session-menu-keys (sessions) | |
(let ((map (make-sparse-keymap))) | |
(cl-loop for i from ?1 to (+ ?0 (length sessions)) | |
do (define-key map (vector i) (lambda () (interactive) | |
(let* ((key (this-command-keys)) | |
(digit (- (aref key 0) ?1))) | |
(when-let ((name (nth digit sessions))) | |
(kill-buffer menubuffer) | |
(load-session name)))) )) | |
(define-key map (kbd "q") #'kill-this-buffer) | |
(use-local-map map))) | |
(defun shorten-path (path) | |
(let ((levels (split-string path "/"))) | |
(mapconcat 'identity (last levels 2) "/"))) | |
(defun open-session-menu () | |
"display session menu" | |
(interactive) | |
(load-session-table) | |
(let ((sessions (mapcar #'car session-table))) | |
(let ((buf (get-buffer-create menubuffer))) | |
(with-current-buffer buf | |
(let ((inhibit-read-only t)) | |
(erase-buffer) | |
(remove-overlays) | |
(special-mode) | |
(insert "\n Select a session to load:\n\n") | |
(if (null sessions) (message "No saved sessions.")) | |
(cl-loop for name in sessions | |
for i from 1 | |
do (widget-create | |
'link | |
:tag (format "%d" i) | |
:button-prefix " [" | |
:button-suffix (format "] %s\n" name) | |
:session-name name | |
:action (lambda (widget &optional event) | |
(let ((session (widget-get widget :session-name))) | |
(kill-buffer menubuffer) | |
(load-session session))))) | |
(insert ascii-art)) | |
(when display-recentf | |
(widget-insert "\n\n Recent Files:\n") | |
(cl-loop for f in recentf-list | |
for i from 0 | |
do (widget-create 'link | |
:tag (shorten-path f) | |
:value f | |
:button-prefix " " | |
:button-suffix "" | |
:action (lambda (widget &optional event) (find-file (widget-value widget))) | |
(widget-insert (if (= (mod i 4) 0) "\n" ", "))))) | |
; (widget-setup) | |
(session-menu-keys sessions) | |
(setq buffer-read-only t) | |
(goto-char (point-min)) (goto-char (+ (line-beginning-position 3) 3))) | |
(delete-other-windows) | |
(switch-to-buffer menubuffer)))) | |
(provide 'save-sessions) | |
;;; sessions.el ends here |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%@@@%%%#*#*++=++*#####*++++++*##*+++++******+++++++++++++++++++++++++++**+++************** | |
***###*****+++***+++++++++++++++++++++++++++++++++++++++++++++++++++++*###********##***##* | |
+*++*+*##%%%###*##+++++++++++++++++++++++++++++++++++=++=+++**++++*+++*######*++++*######% | |
+++#####%%######%*+++++++++==+===++=+++=+===++++==++++++++#%#**+++***++**++*##+++++++****# | |
+++*+++*++++***#%**++++=+=========+#**+===++++*++++**#########*+*#**###*+#####*+++*+++**** | |
+++++++++=+++++++=++*+++==========#%#+*##**######*=++++*#%##%%#+++*+*##########**++++++**+ | |
==========--==+===========+*###*******++**#%%%%##**#******#####********######**+++++++++*+ | |
=-======---------=--==++***######*#+=++=+**###***#####****#####+*#***#####*+==+*++++++==++ | |
-====-------------===*#***###*#####*******+***++++*****#**#####*#***+**##*=-=========+=+++ | |
-----::::::--:-=*#*===*##****+**++++==+*##*+**=+**+*+*%%#***+****+*+==++*#--==========++++ | |
:-:::::::::::=**+*****+***#***#+=-+****#*#**#*-===++***##***#*+-----=-====---=-==========+ | |
::::-::::-::+###****+***##*++****+=+*##**#***+====+=====+*####*-::::::-:---==+------====== | |
::::::::::-+%%%###***+####*++++*#**+++++*****+*+++++===+++*+*++*::-::::------==---==--=-== | |
::::::::::-::=#%######****#+*******++*+++**+***++==--:=+*##******::::::::::::----:---:-==- | |
:::::::.:.:.:::*+=+*##*#***+++#***==+====-.:::-:=-+++=+*+*%%%%###+:...::::::::--:::------- | |
:::::...:.:..:::::..:::.==--=:::.:::....................::----=--=:.:::--:.::--:-:::::::-- | |
::.:.....:..:.............................................:...:.....:.::::::..:::::::-:::= |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment