-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinit-file.el
154 lines (139 loc) · 6.58 KB
/
init-file.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
(require 'recentf)
(setq recentf-max-saved-items 1000
recentf-exclude
(append recentf-exclude (list "/tmp/" "/ssh:" "COMMIT_EDITMSG\\'"
;; (recentf-expand-file-name package-user-dir)
)))
(add-to-list 'recentf-filename-handlers 'abbreviate-file-name)
(jester/with-leader
"f f" 'find-file
"f s" 'save-buffer
"f S" 'evil-write-all
"f D" 'jester/delete-buffer-file
"f R" 'jester/rename-buffer-file
"f y" 'jester/show-and-copy-buffer-filename)
(setq auto-save-default nil)
(defvar jester-auto-save-idle 1 "Time in seconds before auto-saving all buffers.")
(run-with-idle-timer jester-auto-save-idle t #'jester/save-all-buffers)
;; (cancel-function-timers 'jester/save-all-buffers) ; for debugging
(add-hook 'focus-out-hook #'jester/save-all-buffers)
;;----------------------------------------------------------------------------
;; Save all buffers.
;;----------------------------------------------------------------------------
(defun jester/save-all-buffers ()
"Save all buffers."
;; yas overlay and company-select-next has problem with this.
(when (and (or (not (boundp 'yas--active-snippets)) (not yas--active-snippets))
;; (not company-candidates)
(or (not (boundp 'acm-mode)) (not acm-mode))
(not (eq major-mode 'snippet-mode)))
;; https://github.com/manateelazycat/lazycat-emacs/commit/da13a688ef89f8ab2c577a3e9d2a7bcf0ef9b71d
;; https://emacs-china.org/t/topic/7687/30?u=jjpandari
;; this prevents blink of eldoc
(with-temp-message
(with-current-buffer " *Minibuf-0*" (buffer-string))
;; this prevents blink of ivy
(let ((inhibit-message t))
(save-some-buffers t #'(lambda () (and (buffer-file-name) (buffer-modified-p))))))))
;;----------------------------------------------------------------------------
;; Delete the current file
;;----------------------------------------------------------------------------
(defun jester/delete-buffer-file ()
"Trash the current file, and kill the buffer."
(interactive)
(unless (buffer-file-name)
(error "No file is currently being edited"))
(when (yes-or-no-p (format "Really delete '%s'?"
(file-name-nondirectory buffer-file-name)))
(delete-file (buffer-file-name) t)
(kill-this-buffer)))
;;----------------------------------------------------------------------------
;; Rename the current file
;;----------------------------------------------------------------------------
(defun jester/rename-buffer-file ()
"Renames both current buffer and file it's visiting to NEW-NAME."
(interactive)
(let ((name (buffer-name))
(filename (buffer-file-name)))
(unless filename
(error "Buffer '%s' is not visiting a file!" name))
(let ((new-name (read-from-minibuffer "rename file to: " (file-name-nondirectory filename))))
(progn
(when (file-exists-p filename)
(rename-file filename new-name 1))
(set-visited-file-name new-name)
(rename-buffer new-name)))))
;;----------------------------------------------------------------------------
;; Browse current HTML file
;;----------------------------------------------------------------------------
(defun jester/browse-current-file ()
"Open the current file as a URL using `browse-url'."
(interactive)
(let ((file-name (buffer-file-name)))
(if (and (fboundp 'tramp-tramp-file-p)
(tramp-tramp-file-p file-name))
(error "Cannot open tramp file")
(browse-url (concat "file://" file-name)))))
;;----------------------------------------------------------------------------
;; check when opening large files - literal file open
;;----------------------------------------------------------------------------
(defconst jester-large-file-size-MB 1)
(defvar jester-large-file-modes-list
'(archive-mode tar-mode jka-compr git-commit-mode image-mode
doc-view-mode doc-view-mode-maybe ebrowse-tree-mode
pdf-view-mode))
(defun jester/check-large-file ()
(let* ((filename (buffer-file-name))
(size (nth 7 (file-attributes filename))))
(when (and
(not (memq major-mode jester-large-file-modes-list))
size (> size (* 1024 1024 jester-large-file-size-MB))
(y-or-n-p (format (concat "%s is a large file, open literally to "
"avoid performance issues?")
filename)))
(setq buffer-read-only t)
(buffer-disable-undo)
(fundamental-mode))))
(add-hook 'find-file-hook 'jester/check-large-file)
;;----------------------------------------------------------------------------
;; sudo edit file
;;----------------------------------------------------------------------------
(defun jester/sudo-edit (&optional arg)
(interactive "P")
(require 'tramp)
(let ((fname (if (or arg (not buffer-file-name))
(read-file-name "File: ")
buffer-file-name)))
(find-file
(if (not (tramp-tramp-file-p fname))
(concat "/sudo:root@localhost:" fname)
(with-parsed-tramp-file-name fname parsed
(when (equal parsed-user "root")
(error "Already root!"))
(let* ((new-hop (tramp-make-tramp-file-name parsed-method
parsed-user
parsed-host
nil
parsed-hop
))
(new-hop (substring new-hop 1 -1))
(new-hop (concat new-hop "|"))
(new-fname (tramp-make-tramp-file-name "sudo"
"root"
parsed-host
parsed-localname
new-hop)))
new-fname))))))
;;----------------------------------------------------------------------------
;; show file path
;;----------------------------------------------------------------------------
;; http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(defun jester/show-and-copy-buffer-filename ()
"Show and copy the full path to the current file in the minibuffer."
(interactive)
;; list-buffers-directory is the variable set in dired buffers
(let ((file-name (or (buffer-file-name) list-buffers-directory)))
(if file-name
(kill-new (message file-name))
(error "Buffer not visiting a file"))))
(provide 'init-file)