|
@@ -0,0 +1,306 @@
|
|
1
|
+; me
|
|
2
|
+(setq user-full-name "Cullum Smith"
|
|
3
|
+ user-mail-address "cullum@c0ffee.net")
|
|
4
|
+
|
|
5
|
+; gotta go fast
|
|
6
|
+(setq gc-cons-threshold (* 50 1000 1000))
|
|
7
|
+
|
|
8
|
+; remove menubar, scrollbar, etc
|
|
9
|
+(menu-bar-mode -1)
|
|
10
|
+(when (fboundp 'tool-bar-mode)
|
|
11
|
+ (tool-bar-mode -1))
|
|
12
|
+(when (fboundp 'scroll-bar-mode)
|
|
13
|
+ (scroll-bar-mode -1))
|
|
14
|
+(when (fboundp 'horizontal-scroll-bar-mode)
|
|
15
|
+ (horizontal-scroll-bar-mode -1))
|
|
16
|
+
|
|
17
|
+; dark window border on OS X
|
|
18
|
+(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
|
|
19
|
+(add-to-list 'default-frame-alist '(ns-appearance . dark))
|
|
20
|
+
|
|
21
|
+; UTF-8 everywhere
|
|
22
|
+(prefer-coding-system 'utf-8)
|
|
23
|
+(set-default-coding-systems 'utf-8)
|
|
24
|
+(set-terminal-coding-system 'utf-8)
|
|
25
|
+(set-keyboard-coding-system 'utf-8)
|
|
26
|
+
|
|
27
|
+; some sensible defaults
|
|
28
|
+(setq save-interprogram-paste-before-kill t) ; preserve OS clipboard before killing text
|
|
29
|
+(setq redisplay-dont-pause t) ; increase rendering performance
|
|
30
|
+(setq inhibit-startup-message t) ; don't show splash screen
|
|
31
|
+(setq initial-scratch-message nil) ; don't show scratch buffer message
|
|
32
|
+(setq vc-follow-symlinks t) ; don't ask before visiting symlinks
|
|
33
|
+(setq sentence-end-double-space nil) ; don't enforce two spaces to end sentences
|
|
34
|
+(setq require-final-newline t) ; put newlines at the end of every file
|
|
35
|
+(setq mouse-yank-at-point t) ; paste text wherever the point is
|
|
36
|
+(setq ns-pop-up-frames nil) ; open all files in the same emacs window
|
|
37
|
+(setq ring-bell-function 'ignore) ; no visual or audible bell
|
|
38
|
+(setq apropos-do-all t) ; search all defined documentation strings
|
|
39
|
+(setq load-prefer-newer t) ; don't load outdated bytecode files
|
|
40
|
+(show-paren-mode 1) ; show matching parens
|
|
41
|
+(setq show-paren-delay 0) ; ... but don't make me wait for it
|
|
42
|
+(fset 'yes-or-no-p 'y-or-n-p) ; ask y/n instead of full yes/no
|
|
43
|
+(global-hl-line-mode 1) ; highlight current line
|
|
44
|
+(column-number-mode t) ; show column number in modeline
|
|
45
|
+(line-number-mode t) ; show line number in modeline
|
|
46
|
+(size-indication-mode t) ; show filesize in modeline
|
|
47
|
+(delete-selection-mode t) ; replace highlighted text when typing
|
|
48
|
+(global-auto-revert-mode t) ; update buffer when file changes
|
|
49
|
+(setq-default indent-tabs-mode nil) ; use spaces instead of tabs
|
|
50
|
+(setq-default tab-width 2) ; 2-space tabs
|
|
51
|
+(setq-default fill-column 80) ; 80 character line width
|
|
52
|
+(save-place-mode 1) ; save cursor location in files
|
|
53
|
+(global-linum-mode t) ; show line numbers in left column
|
|
54
|
+(electric-indent-mode 1) ; smart auto-indent
|
|
55
|
+(setq-default electric-indent-inhibit t) ; ... disable indenting previous line (WHY?!)
|
|
56
|
+(electric-pair-mode 1) ; smart matching parens/braces
|
|
57
|
+(setq ediff-window-setup-function 'ediff-setup-windows-plain) ; keep all windows in one frame
|
|
58
|
+
|
|
59
|
+; nice scrolling
|
|
60
|
+(setq scroll-margin 0
|
|
61
|
+ scroll-conservatively 100000
|
|
62
|
+ scroll-preserve-screen-position 1)
|
|
63
|
+
|
|
64
|
+; vim-style delete-to-char
|
|
65
|
+(autoload 'zap-up-to-char "misc" "Kill up to, but not including ARGth occurrence of CHAR." t)
|
|
66
|
+
|
|
67
|
+; better searching/completion
|
|
68
|
+(global-set-key (kbd "M-/") 'hippie-expand)
|
|
69
|
+(global-set-key (kbd "C-x C-b") 'ibuffer)
|
|
70
|
+(global-set-key (kbd "M-z") 'zap-up-to-char)
|
|
71
|
+(global-set-key (kbd "C-M-s") 'isearch-forward)
|
|
72
|
+(global-set-key (kbd "C-M-r") 'isearch-backward)
|
|
73
|
+
|
|
74
|
+; ls command for dired view
|
|
75
|
+(setq-default dired-listing-switches
|
|
76
|
+ (cond
|
|
77
|
+ ((string-equal system-type "gnu/linux") "-alh --group-directories-first")
|
|
78
|
+ (t "-alh")))
|
|
79
|
+
|
|
80
|
+; navigate windows with shift + arrow keys
|
|
81
|
+(when (fboundp 'windmove-default-keybindings) (windmove-default-keybindings))
|
|
82
|
+
|
|
83
|
+; no littering the filesystem with temp files
|
|
84
|
+(unless (file-directory-p (concat user-emacs-directory "backups"))
|
|
85
|
+ (make-directory (concat user-emacs-directory "backups")))
|
|
86
|
+(unless (file-directory-p (concat user-emacs-directory "autosave"))
|
|
87
|
+ (make-directory (concat user-emacs-directory "autosave")))
|
|
88
|
+(setq save-place-file (concat user-emacs-directory "places"))
|
|
89
|
+(setq backup-directory-alist `((".*" . ,(concat user-emacs-directory "backups"))))
|
|
90
|
+(setq tramp-backup-directory-alist `((".*" . ,(concat user-emacs-directory "backups"))))
|
|
91
|
+(setq auto-save-file-name-transforms `((".*" ,(concat user-emacs-directory "autosave/") t)))
|
|
92
|
+
|
|
93
|
+; hippie expand
|
|
94
|
+(setq hippie-expand-try-functions-list '(try-expand-dabbrev
|
|
95
|
+ try-expand-dabbrev-all-buffers
|
|
96
|
+ try-expand-dabbrev-from-kill
|
|
97
|
+ try-complete-file-name-partially
|
|
98
|
+ try-complete-file-name
|
|
99
|
+ try-expand-all-abbrevs
|
|
100
|
+ try-expand-list
|
|
101
|
+ try-expand-line
|
|
102
|
+ try-complete-lisp-symbol-partially
|
|
103
|
+ try-complete-lisp-symbol))
|
|
104
|
+(global-set-key (kbd "M-/") #'hippie-expand)
|
|
105
|
+(global-set-key (kbd "s-/") #'hippie-expand)
|
|
106
|
+
|
|
107
|
+; smart tab - indent or complete
|
|
108
|
+(setq tab-always-indent 'complete)
|
|
109
|
+
|
|
110
|
+; replace buffer menu with ibuffer
|
|
111
|
+(global-set-key (kbd "C-x C-b") #'ibuffer)
|
|
112
|
+
|
|
113
|
+; disable bold/italic fonts on linux (bitmapped fonts)
|
|
114
|
+(cond ((string-equal system-type "gnu/linux") (progn
|
|
115
|
+ (defun remap-faces-default-attributes ()
|
|
116
|
+ (let ((family (face-attribute 'default :family))
|
|
117
|
+ (height (face-attribute 'default :height)))
|
|
118
|
+ (mapcar (lambda (face)
|
|
119
|
+ (face-remap-add-relative
|
|
120
|
+ face :family family :weight 'normal :slant 'normal :height height))
|
|
121
|
+ (face-list))))
|
|
122
|
+ (when (display-graphic-p)
|
|
123
|
+ (add-hook 'minibuffer-setup-hook 'remap-faces-default-attributes)
|
|
124
|
+ (add-hook 'change-major-mode-after-body-hook 'remap-faces-default-attributes)))))
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+;;;;; mode customizations ;;;;;
|
|
128
|
+(setq sh-basic-offset 2) ; 2-space indents for shell scripts
|
|
129
|
+
|
|
130
|
+;;;;; packages ;;;;;
|
|
131
|
+
|
|
132
|
+; enable package repositories
|
|
133
|
+(require 'package)
|
|
134
|
+(setq package-enable-at-startup nil)
|
|
135
|
+(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
|
|
136
|
+(add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/"))
|
|
137
|
+(package-initialize)
|
|
138
|
+
|
|
139
|
+; bootstrap use-package
|
|
140
|
+(unless (package-installed-p 'use-package)
|
|
141
|
+ (package-refresh-contents)
|
|
142
|
+ (package-install 'use-package))
|
|
143
|
+(eval-when-compile (require 'use-package))
|
|
144
|
+
|
|
145
|
+; uniqify - better disambiguation for same-named files
|
|
146
|
+(require 'uniquify)
|
|
147
|
+(setq uniquify-buffer-name-style 'forward)
|
|
148
|
+
|
|
149
|
+(use-package uniquify
|
|
150
|
+ :config
|
|
151
|
+ (setq uniquify-buffer-name-style 'forward)
|
|
152
|
+ (setq uniquify-separator "/")
|
|
153
|
+ ; rename after killing uniquified
|
|
154
|
+ (setq uniquify-after-kill-buffer-p t)
|
|
155
|
+ ; don't muck with special buffers
|
|
156
|
+ (setq uniquify-ignore-buffers-re "^\\*"))
|
|
157
|
+
|
|
158
|
+; zenburn
|
|
159
|
+(use-package zenburn-theme
|
|
160
|
+ :ensure t
|
|
161
|
+ :config
|
|
162
|
+ (if (not (display-graphic-p)) (progn (setq linum-format "%d ")))
|
|
163
|
+ :init (load-theme 'zenburn t))
|
|
164
|
+
|
|
165
|
+; evil mode
|
|
166
|
+(use-package evil
|
|
167
|
+ :ensure t
|
|
168
|
+ :init
|
|
169
|
+ (setq evil-want-integration nil)
|
|
170
|
+ (setq evil-search-module 'evil-search) ; vim-style searching
|
|
171
|
+ (setq evil-want-C-i-jump nil) ; restore tab functionality in org mode
|
|
172
|
+ (setq evil-want-C-u-scroll t) ; ctrl-U scrolls up
|
|
173
|
+ :config
|
|
174
|
+ (evil-mode)
|
|
175
|
+ (define-key evil-normal-state-map (kbd "C-h") #'evil-window-left)
|
|
176
|
+ (define-key evil-normal-state-map (kbd "C-j") #'evil-window-down)
|
|
177
|
+ (define-key evil-normal-state-map (kbd "C-k") #'evil-window-up)
|
|
178
|
+ (define-key evil-normal-state-map (kbd "C-l") #'evil-window-right))
|
|
179
|
+
|
|
180
|
+; evil org mode
|
|
181
|
+(use-package evil-org
|
|
182
|
+ :ensure t
|
|
183
|
+ :after org
|
|
184
|
+ :config
|
|
185
|
+ (add-hook 'org-mode-hook 'evil-org-mode)
|
|
186
|
+ (add-hook 'evil-org-mode-hook (lambda () (evil-org-set-key-theme)))
|
|
187
|
+ (require 'evil-org-agenda)
|
|
188
|
+ (evil-org-agenda-set-keys))
|
|
189
|
+
|
|
190
|
+; evil collection
|
|
191
|
+(use-package evil-collection
|
|
192
|
+ :after evil
|
|
193
|
+ :ensure t
|
|
194
|
+ :init
|
|
195
|
+ (setq evil-want-integration nil)
|
|
196
|
+ :config
|
|
197
|
+ (evil-collection-init))
|
|
198
|
+
|
|
199
|
+; magit
|
|
200
|
+(use-package magit
|
|
201
|
+ :ensure t
|
|
202
|
+ :bind (("C-x g" . magit-status)))
|
|
203
|
+
|
|
204
|
+; evil magit
|
|
205
|
+(use-package evil-magit
|
|
206
|
+ :ensure t
|
|
207
|
+ :after magit)
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+; projectile
|
|
211
|
+(use-package projectile
|
|
212
|
+ :ensure t
|
|
213
|
+ :init
|
|
214
|
+ (setq projectile-completion-system 'ivy)
|
|
215
|
+ :config
|
|
216
|
+ (projectile-mode +1)
|
|
217
|
+ (define-key projectile-mode-map (kbd "s-p") 'projectile-command-map)
|
|
218
|
+ (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map))
|
|
219
|
+
|
|
220
|
+; company
|
|
221
|
+(use-package company
|
|
222
|
+ :ensure t
|
|
223
|
+ :config
|
|
224
|
+ (setq company-idle-delay 0.3)
|
|
225
|
+ (setq company-minimum-prefix-length 2)
|
|
226
|
+ (setq company-show-numbers t)
|
|
227
|
+ (setq company-tooltip-align-annotations t)
|
|
228
|
+ (setq company-tooltip-flip-when-above t)
|
|
229
|
+ (global-company-mode))
|
|
230
|
+
|
|
231
|
+; ivy
|
|
232
|
+(use-package ivy
|
|
233
|
+ :ensure t
|
|
234
|
+ :config
|
|
235
|
+ (ivy-mode 1)
|
|
236
|
+ (setq ivy-use-virtual-buffers t)
|
|
237
|
+ (setq enable-recursive-minibuffers t)
|
|
238
|
+ (global-set-key (kbd "C-c C-r") 'ivy-resume)
|
|
239
|
+ (global-set-key (kbd "<f6>") 'ivy-resume))
|
|
240
|
+
|
|
241
|
+; counsel
|
|
242
|
+(use-package counsel
|
|
243
|
+ :ensure t
|
|
244
|
+ :config
|
|
245
|
+ (global-set-key (kbd "M-x") 'counsel-M-x)
|
|
246
|
+ (global-set-key (kbd "C-x C-f") 'counsel-find-file)
|
|
247
|
+ (global-set-key (kbd "<f1> f") 'counsel-describe-function)
|
|
248
|
+ (global-set-key (kbd "<f1> v") 'counsel-describe-variable)
|
|
249
|
+ (global-set-key (kbd "<f1> l") 'counsel-find-library)
|
|
250
|
+ (global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
|
|
251
|
+ (global-set-key (kbd "<f2> u") 'counsel-unicode-char)
|
|
252
|
+ (global-set-key (kbd "C-c g") 'counsel-git)
|
|
253
|
+ (global-set-key (kbd "C-c j") 'counsel-git-grep)
|
|
254
|
+ (global-set-key (kbd "C-c a") 'counsel-ag)
|
|
255
|
+ (global-set-key (kbd "C-x l") 'counsel-locate)
|
|
256
|
+ (define-key minibuffer-local-map (kbd "C-r") 'counsel-minibuffer-history))
|
|
257
|
+
|
|
258
|
+; swiper
|
|
259
|
+(use-package swiper
|
|
260
|
+ :ensure t
|
|
261
|
+ :config
|
|
262
|
+ (global-set-key "\C-s" 'swiper)
|
|
263
|
+ (global-set-key "\C-r" 'swiper))
|
|
264
|
+
|
|
265
|
+; undo tree
|
|
266
|
+(use-package undo-tree
|
|
267
|
+ :ensure t
|
|
268
|
+ :config
|
|
269
|
+ ; persistent undo
|
|
270
|
+ (unless (file-directory-p (concat user-emacs-directory "undo"))
|
|
271
|
+ (make-directory (concat user-emacs-directory "undo")))
|
|
272
|
+ (setq undo-tree-history-directory-alist `((".*" . ,(concat user-emacs-directory "undo"))))
|
|
273
|
+ (setq undo-tree-auto-save-history t))
|
|
274
|
+
|
|
275
|
+; highlight todos
|
|
276
|
+(use-package hl-todo
|
|
277
|
+ :ensure t
|
|
278
|
+ :config
|
|
279
|
+ (global-hl-todo-mode))
|
|
280
|
+
|
|
281
|
+; which key
|
|
282
|
+(use-package which-key
|
|
283
|
+ :ensure t
|
|
284
|
+ :config
|
|
285
|
+ (setq which-key-idle-delay 0.5)
|
|
286
|
+ (cond ((string-equal system-type "gnu/linux") (progn
|
|
287
|
+ (set-face-attribute 'which-key-key-face nil :inherit font-lock-function-name-face)
|
|
288
|
+ (set-face-attribute 'which-key-note-face nil :inherit font-lock-comment-face :slant 'normal))))
|
|
289
|
+ (which-key-mode +1))
|
|
290
|
+
|
|
291
|
+; highlight VC diffs
|
|
292
|
+(use-package diff-hl
|
|
293
|
+ :ensure t
|
|
294
|
+ :config
|
|
295
|
+ (global-diff-hl-mode +1)
|
|
296
|
+ (add-hook 'dired-mode-hook 'diff-hl-dired-mode)
|
|
297
|
+ (add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh))
|
|
298
|
+
|
|
299
|
+; imenu anywhere
|
|
300
|
+(use-package imenu-anywhere
|
|
301
|
+ :ensure t
|
|
302
|
+ :bind (("C-c ." . imenu-anywhere)))
|
|
303
|
+
|
|
304
|
+; yaml mode
|
|
305
|
+(use-package yaml-mode
|
|
306
|
+ :ensure t)
|