forked from ghoseb/dotemacs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
defuns.el
278 lines (230 loc) · 8.44 KB
/
defuns.el
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
;;; defuns.el --- Local Functions -*- lexical-binding: t; -*-
;; mostly from https://raw.githubusercontent.com/rejeep/emacs/master/defuns.el
(defun nuke-all-buffers ()
"Kill all buffers, leaving *scratch* only."
(interactive)
(mapc
(lambda (buffer)
(kill-buffer buffer))
(buffer-list))
(delete-other-windows))
(defun open-line-below ()
"Open a line below the line the point is at.
Then move to that line and indent accordning to mode"
(interactive)
(move-end-of-line 1)
(newline)
(indent-according-to-mode))
(defun open-line-above ()
"Open a line above the line the point is at.
Then move to that line and indent accordning to mode"
(interactive)
(move-beginning-of-line 1)
(newline)
(forward-line -1)
(indent-according-to-mode))
;; NOTE: (region-beginning) and (region-end) are not saved in
;; variables since they can change after each clean step.
(defun clean-up-buffer-or-region ()
"Untabifies, indents and deletes trailing whitespace from buffer or region."
(interactive)
(save-excursion
(unless (region-active-p)
(mark-whole-buffer))
(unless (or (eq major-mode 'coffee-mode)
(eq major-mode 'feature-mode))
(untabify (region-beginning) (region-end))
(indent-region (region-beginning) (region-end)))
(save-restriction
(narrow-to-region (region-beginning) (region-end))
(delete-trailing-whitespace))))
(defun back-to-indentation-or-beginning-of-line ()
"Moves point back to indentation if there is any
non blank characters to the left of the cursor.
Otherwise point moves to beginning of line."
(interactive)
(if (= (point) (save-excursion (back-to-indentation) (point)))
(beginning-of-line)
(back-to-indentation)))
(defun duplicate-current-line-or-region (arg)
"Duplicates the current line or region ARG times.
If there's no region, the current line will be duplicated. However, if
there's a region, all lines that region covers will be duplicated."
(interactive "p")
(let (beg end (origin (point)))
(if (and (region-active-p) (> (point) (mark)))
(exchange-point-and-mark))
(setq beg (line-beginning-position))
(if (region-active-p)
(exchange-point-and-mark))
(setq end (line-end-position))
(let ((region (buffer-substring-no-properties beg end)))
(dotimes (i arg)
(goto-char end)
(newline)
(insert region)
(setq end (point)))
(goto-char (+ origin (* (length region) arg) arg)))))
(defun swap-windows ()
"If you have 2 windows, it swaps them."
(interactive)
(cond ((/= (count-windows) 2)
(message "You need exactly 2 windows to do this."))
(t
(let* ((w1 (first (window-list)))
(w2 (second (window-list)))
(b1 (window-buffer w1))
(b2 (window-buffer w2))
(s1 (window-start w1))
(s2 (window-start w2)))
(set-window-buffer w1 b2)
(set-window-buffer w2 b1)
(set-window-start w1 s2)
(set-window-start w2 s1))))
(other-window 1))
(defun rename-buffer-and-file ()
"Renames current buffer and file it is visiting."
(interactive)
(let ((name (buffer-name))
(filename (buffer-file-name))
(read-file-name-function 'read-file-name-default))
(if (not (and filename (file-exists-p filename)))
(error "Buffer '%s' is not visiting a file!" name)
(let ((new-name (read-file-name "New name: " filename)))
(cond ((get-buffer new-name)
(error "A buffer named '%s' already exists!" new-name))
(t
(rename-file filename new-name 1)
(rename-buffer new-name)
(set-visited-file-name new-name)
(set-buffer-modified-p nil)
(message "File '%s' successfully renamed to '%s'" name (file-name-nondirectory new-name))))))))
(defun delete-buffer-and-file ()
"Removes file connected to current buffer and kills buffer."
(interactive)
(let ((filename (buffer-file-name))
(buffer (current-buffer))
(name (buffer-name)))
(if (not (and filename (file-exists-p filename)))
(error "Buffer '%s' is not visiting a file!" name)
(when (yes-or-no-p "Are you sure you want to remove this file? ")
(delete-file filename)
(kill-buffer buffer)
(message "File '%s' successfully removed" filename)))))
(defun google (arg)
"Googles a query or region if any.
With prefix argument, wrap search query in quotes."
(interactive "P")
(let ((query
(if (region-active-p)
(buffer-substring (region-beginning) (region-end))
(read-string "Query: "))))
(when arg (setq query (concat "\"" query "\"")))
(browse-url
(concat "http://www.google.com/search?ie=utf-8&oe=utf-8&q=" query))))
(defun comment-or-uncomment-current-line-or-region ()
"Comments or uncomments current current line or whole lines in region."
(interactive)
(save-excursion
(let (min max)
(if (region-active-p)
(setq min (region-beginning) max (region-end))
(setq min (point) max (point)))
(comment-or-uncomment-region
(progn (goto-char min) (line-beginning-position))
(progn (goto-char max) (line-end-position))))))
(defun join-line-or-lines-in-region ()
"Join this line or the lines in the selected region."
(interactive)
(cond ((region-active-p)
(let ((min (line-number-at-pos (region-beginning))))
(goto-char (region-end))
(while (> (line-number-at-pos) min)
(join-line))))
(t (call-interactively 'join-line))))
(defun scroll-down-five ()
"Scrolls down five rows."
(interactive)
(scroll-down 5))
(defun scroll-up-five ()
"Scrolls up five rows."
(interactive)
(scroll-up 5))
(defun re-builder-large ()
"Just like `re-builder', only make the font and window larger."
(interactive)
(re-builder)
(text-scale-increase 5)
(set-window-text-height (selected-window) 7))
(defun url-decode-region (beg end)
(interactive "r")
(let ((content (url-unhex-string (buffer-substring beg end))))
(goto-char end)
(newline)
(insert content)))
(defun url-encode-region (beg end)
(interactive "r")
(let ((content (url-hexify-string (buffer-substring beg end))))
(goto-char end)
(newline)
(insert content)))
(defun dired-open-marked-files ()
"Open marked files."
(interactive)
(let ((distinguish-one-marked nil))
(mapc 'find-file
(dired-map-over-marks (dired-get-file-for-visit)
current-prefix-arg))))
(defun find-project-root (dir)
(f--traverse-upwards (f-dir? (f-expand ".git" it)) dir))
(defun projectile-completion-fn (prompt choises)
"Projectile completion function that only shows file name.
If two files have same name, new completion appears to select between
them. These include the path relative to the project root."
(interactive)
(let* ((stripped-choises
(-uniq (--map (file-name-nondirectory it) choises)))
(choise
(ido-completing-read prompt stripped-choises))
(matching-files
(-filter
(lambda (file)
(equal (file-name-nondirectory file) choise))
choises)))
(if (> (length matching-files) 1)
(ido-completing-read prompt matching-files)
(car matching-files))))
(defun magit-just-amend ()
(interactive)
(save-window-excursion
(shell-command "git --no-pager commit --amend --reuse-message=HEAD")
(magit-refresh)))
(defun sp-kill-sexp-with-a-twist-of-lime ()
(interactive)
(if (sp-point-in-string)
(let ((end (plist-get (sp-get-string) :end)))
(kill-region (point) (1- end)))
(let ((beg (line-beginning-position))
(end (line-end-position)))
(if (or (comment-only-p beg end)
(s-matches? "\\s+" (buffer-substring-no-properties beg end)))
(kill-line)
(sp-kill-sexp)))))
(defun eval-and-replace ()
"Replace the preceding sexp with its value."
(interactive)
(backward-kill-sexp)
(condition-case nil
(prin1 (eval (read (current-kill 0)))
(current-buffer))
(error (message "Invalid expression")
(insert (current-kill 0)))))
(defun kill-region-or-thing-at-point (beg end)
"Kill region or word at point."
(interactive "r")
(unless (region-active-p)
(save-excursion
(setq beg (re-search-backward "\\_<" nil t))
(setq end (re-search-forward "\\_>" nil t))))
(kill-ring-save beg end))
(provide 'defuns)