Skip to content

Instantly share code, notes, and snippets.

@orazdow
Last active May 9, 2025 09:05
Show Gist options
  • Save orazdow/98d85929a70d58729e1ef0a97a754b14 to your computer and use it in GitHub Desktop.
Save orazdow/98d85929a70d58729e1ef0a97a754b14 to your computer and use it in GitHub Desktop.
init.el
;; -- 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")
(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)
(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)))
(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.
)
;;; 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
%@@@%%%#*#*++=++*#####*++++++*##*+++++******+++++++++++++++++++++++++++**+++**************
***###*****+++***+++++++++++++++++++++++++++++++++++++++++++++++++++++*###********##***##*
+*++*+*##%%%###*##+++++++++++++++++++++++++++++++++++=++=+++**++++*+++*######*++++*######%
+++#####%%######%*+++++++++==+===++=+++=+===++++==++++++++#%#**+++***++**++*##+++++++****#
+++*+++*++++***#%**++++=+=========+#**+===++++*++++**#########*+*#**###*+#####*+++*+++****
+++++++++=+++++++=++*+++==========#%#+*##**######*=++++*#%##%%#+++*+*##########**++++++**+
==========--==+===========+*###*******++**#%%%%##**#******#####********######**+++++++++*+
=-======---------=--==++***######*#+=++=+**###***#####****#####+*#***#####*+==+*++++++==++
-====-------------===*#***###*#####*******+***++++*****#**#####*#***+**##*=-=========+=+++
-----::::::--:-=*#*===*##****+**++++==+*##*+**=+**+*+*%%#***+****+*+==++*#--==========++++
:-:::::::::::=**+*****+***#***#+=-+****#*#**#*-===++***##***#*+-----=-====---=-==========+
::::-::::-::+###****+***##*++****+=+*##**#***+====+=====+*####*-::::::-:---==+------======
::::::::::-+%%%###***+####*++++*#**+++++*****+*+++++===+++*+*++*::-::::------==---==--=-==
::::::::::-::=#%######****#+*******++*+++**+***++==--:=+*##******::::::::::::----:---:-==-
:::::::.:.:.:::*+=+*##*#***+++#***==+====-.:::-:=-+++=+*+*%%%%###+:...::::::::--:::-------
:::::...:.:..:::::..:::.==--=:::.:::....................::----=--=:.:::--:.::--:-:::::::--
::.:.....:..:.............................................:...:.....:.::::::..:::::::-:::=
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment