;; Emacs initialization file ;; Remember the initialization directory (setq ravi/init-dir (file-name-directory (or load-file-name (buffer-file-name)))) (setq ravi/init-dir-is-local (let* ((df (executable-find "df")) (ret (call-process df nil nil nil "-l" (or load-file-name (buffer-file-name))))) (eql ret 0))) (defun ravi/emacs-file (filename) (expand-file-name filename ravi/init-dir)) (setq ravi/past-directory (ravi/emacs-file (if ravi/init-dir-is-local "past" (format "past-%s" (system-name))))) (unless (file-accessible-directory-p ravi/past-directory) (make-directory ravi/past-directory)) (defun ravi/past-file (filename) (expand-file-name filename ravi/past-directory)) ;; Initialize some customizations early on to avoid flicker (when window-system (tooltip-mode -1) (tool-bar-mode -1) ;; Open in full-screen of possible (when (fboundp 'toggle-frame-maximized) (setq frame-resize-pixelwise t) (toggle-frame-maximized))) (menu-bar-mode -1) (setq warning-suppress-types nil) (set-face-background 'default "black") (set-face-foreground 'default "white") (add-to-list 'default-frame-alist '(background-mode . dark)) (require 'seq) (when window-system (defun font-candidate (&rest fonts) "Return existing font which first match." (seq-find (lambda (f) (find-font (font-spec :name f))) fonts)) (let ((fontval (font-candidate "Source Code Pro"))) (when fontval (set-face-attribute 'default nil :font fontval :height 110))) (when (find-font (font-spec :name "Symbola")) (set-fontset-font "fontset-default" nil (font-spec :size 20 :name "Symbola")))) (setq custom-file (concat ravi/init-dir "custom.el")) ;; Initialize package handling: currently using only the official repository and MELPA ;; Work around emacs bug 52292 on emacs 28+ ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=52292 (defun faerryn-patch-package-find-file-visit-truename (oldfun &rest r) (let ((find-file-visit-truename nil)) (apply oldfun r))) (advice-add #'package-install :around #'faerryn-patch-package-find-file-visit-truename) (setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/") ("nongnu" . "https://elpa.nongnu.org/nongnu/") ("melpa" . "http://melpa.org/packages/"))) (add-to-list 'load-path (ravi/emacs-file "lisp/")) (add-to-list 'load-path (ravi/emacs-file "site-lisp/")) (setq autoload-file (concat ravi/init-dir "loaddefs.el")) (setq package-user-dir (concat ravi/init-dir "elpa")) (package-initialize) (defvar ravi/default-install-packages (list 'yasnippet 'use-package 'bind-key 'diminish) "Libraries that should be installed by default.") (unless package-archive-contents (package-refresh-contents)) (dolist (package ravi/default-install-packages) (unless (package-installed-p package) (package-install package))) ;; Settings from M-x customize (load custom-file 'noerror) (require 'bind-key) (require 'use-package) (require 'diminish) (setq use-package-always-ensure t use-package-hook-name-suffix nil) ;; (setq use-package-verbose t ;; use-package-compute-statistics t) (defvar ravi/use-selection-system 'vertico "Valid values are 'ido 'helm 'selectrum 'vertico") (when (file-exists-p (ravi/emacs-file "local.el")) (load-file (ravi/emacs-file "local.el"))) (use-package s) (use-package dash) (use-package term/xterm-kitty :init (setq kitty-kbp-modifiers-alist '((1 . shift) (2 . alt) (4 . control) (32 . super) (16 . hyper) (8 . meta))) (setq kitty-kbp-delete-backspace-workaround t) (defun ravi/get-rid-of-xterm-key-translations () (message "Getting rid of xterm key translations") (mapcar (lambda (k) (define-key local-function-key-map (vector k) nil)) '(tab delete return escape)) (global-set-key (kbd "") #'delete-forward-char)) (add-hook 'terminal-init-xterm-kitty-hook #'ravi/get-rid-of-xterm-key-translations) (add-hook 'terminal-init-xterm-kitty-hook #'xterm-kitty-add-select-frame-set-input-focus-advice) (add-hook 'terminal-init-xterm-kitty-hook #'kitty-rc-set-interprogram-cut-function) ;; Don't defer since we will use xterm-kitty-make-binding-sequence elsewhere :ensure nil) (require 's) (require 'dash) (require 'dbus) (require 'ravi-ergodox-mode) (let* ((under-wayland (and window-system (not (s-blank-str-p (getenv "WAYLAND_DISPLAY"))))) (xorg-ergodox (and window-system (if under-wayland (-any? (lambda (n) (s-contains? "Ergodox" (dbus-get-property :session "org.kde.KWin" (concat "/org/kde/KWin/InputDevice/" n) "org.kde.KWin.InputDevice" "name"))) (dbus-get-property :session "org.kde.KWin" "/org/kde/KWin/InputDevice" "org.kde.KWin.InputDeviceManager" "devicesSysNames")) (s-contains? "Ergodox" (shell-command-to-string "xinput"))))) (under-xming (and window-system (or xorg-ergodox (s-contains? "vendor string: Colin Harrison" (shell-command-to-string "xdpyinfo"))))) (using-kitty (and (not window-system) (s-starts-with? "xterm-kitty" (getenv-internal "TERM" initial-environment))))) ;; (message "Under wayland: %s" (prin1-to-string under-wayland)) ;; (message "xorg-ergodox: %s" (prin1-to-string xorg-ergodox)) (if (or xorg-ergodox under-xming using-kitty) (progn (ravi-ergodox-mode) (diminish 'ravi-ergodox-mode) (unless xorg-ergodox ;; We are in Windows remote desktop with XMing (setq x-meta-keysym 'meta) (setq x-super-keysym 'super) (setq x-alt-keysym 'hyper) (setq x-hyper-keysym 'alt))) (progn (pcase ravi/use-selection-system ('helm (bind-key "" 'helm-find-files) (bind-key "" 'helm-mini)) ('ido (bind-key "" 'ido-find-file) (bind-key "" 'ido-switch-buffer)) (_ nil)) ; do nothing for selectrum (bind-key "" 'undo-tree-undo)))) (use-package free-keys :commands free-keys) (defun ravi/add-variables-from-dir-locals (varname hack-varname &optional make-it-local) "Add variable from dir-locals.el to an existing variable as a buffer-local variable" (let ((basic-var (symbol-value varname))) (when (and (boundp hack-varname) (listp (symbol-value hack-varname))) (when make-it-local (make-local-variable varname)) (set varname (append basic-var (symbol-value hack-varname)))))) (require 'ravi-init-maps) (require 'ravi-init-ido) (require 'ravi-init-helm) (require 'ravi-init-completion) (require 'ravi-init-marks) (require 'ravi-init-appearance) (require 'ravi-init-files) (require 'ravi-init-vc) (require 'ravi-init-function) (require 'ravi-init-insertion) (require 'ravi-init-navigation) (require 'ravi-init-lsp) (require 'ravi-init-cpp) (require 'ravi-init-python) (require 'ravi-init-layouts) (require 'ravi-init-org) (require 'ravi-init-tex) (require 'ravi-init-repl) (require 'ravi-init-dired) (require 'ravi-init-mu) (require 'ravi-init-web)