summaryrefslogtreecommitdiffstats
path: root/init.el
blob: 4909704f7ef8971e61ac6348edc0adb10d4903c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
;; 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 'cl)
(when window-system
  (defun font-candidate (&rest fonts)
    "Return existing font which first match."
    (find-if (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
(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)

(defvar ravi/use-selection-system 'selectrum
  "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>") #'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 "<f9>" 'helm-find-files)
               (bind-key "<f8>" 'helm-mini))
        ('ido (bind-key "<f9>" 'ido-find-file)
              (bind-key "<f8>" 'ido-switch-buffer))
        (_ nil))                        ; do nothing for selectrum
      (bind-key "<f12>" '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)