init.el 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. ;;; Emacs config
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;; Prerequisites
  4. (let ((minver "26.1"))
  5. (when (version< emacs-version minver)
  6. (error "Your Emacs is too old -- this config requires v%s or higher" minver)))
  7. ;;; Speed up init.
  8. ;;; Temporarily reduce garbage collection during startup. Inspect `gcs-done'.
  9. (defun ambrevar/reset-gc-cons-threshold ()
  10. (setq gc-cons-threshold (car (get 'gc-cons-threshold 'standard-value))))
  11. (setq gc-cons-threshold (* 64 1024 1024))
  12. (add-hook 'after-init-hook 'ambrevar/reset-gc-cons-threshold)
  13. ;;; Temporarily disable the file name handler.
  14. (setq default-file-name-handler-alist file-name-handler-alist)
  15. (setq file-name-handler-alist nil)
  16. (defun ambrevar/reset-file-name-handler-alist ()
  17. (setq file-name-handler-alist default-file-name-handler-alist))
  18. (add-hook 'after-init-hook 'ambrevar/reset-file-name-handler-alist)
  19. ;;; Avoid the "loaded old bytecode instead of newer source" pitfall.
  20. (setq load-prefer-newer t)
  21. ;;; Store additional config in a 'lisp' subfolder and add it to the load path so
  22. ;;; that `require' can find the files.
  23. ;;; This must be done before moving `user-emacs-directory'.
  24. (add-to-list 'load-path (expand-file-name "lisp/" user-emacs-directory))
  25. ;;; Move user-emacs-directory so that user files don't mix with cache files.
  26. (setq user-emacs-directory "~/.cache/emacs/")
  27. (when (require 'package nil t)
  28. ;; TODO: MELPA's https sometimes return
  29. ;; emacs melpa invalid: certificate host does not match hostname
  30. ;; Try the following:
  31. ;; (setq tls-checktrust nil)
  32. ;; Different Emacs version have different byte code. If a versioned ELPA
  33. ;; directory is found, use it.
  34. (let ((versioned-dir (format "elpa-%s.%s" emacs-major-version emacs-minor-version)))
  35. (when (member versioned-dir (directory-files (expand-file-name ".." package-user-dir)))
  36. (setq package-user-dir (expand-file-name (concat "../" versioned-dir) package-user-dir))))
  37. (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")))
  38. (add-to-list 'package-archives '("melpa" . "https://melpa.milkbox.net/packages/"))
  39. (add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t)
  40. (package-initialize))
  41. ;;; Site Lisp folder for local packages and development.
  42. ;; We need to roll it out manually since we want it first in the `load-path',
  43. ;; while `normal-top-level-add-subdirs-to-load-path' appends it to the very end.
  44. (defun ambrevar/package-refresh-load-path (path)
  45. "Add every non-hidden sub-folder of PATH to `load-path'."
  46. (when (file-directory-p path)
  47. (dolist (dir (directory-files path t "^[^\\.]"))
  48. (when (file-directory-p dir)
  49. (setq load-path (add-to-list 'load-path dir))
  50. (dolist (subdir (directory-files dir t "^[^\\.]"))
  51. (when (file-directory-p subdir)
  52. (setq load-path (add-to-list 'load-path subdir))))))))
  53. (let ((site-lisp (expand-file-name "site-lisp/" "~/.local/share/emacs/")))
  54. (add-to-list 'load-path site-lisp)
  55. (ambrevar/package-refresh-load-path site-lisp))
  56. ;;; Local config. See below for an example usage.
  57. (load "local-before" t)
  58. (require 'functions)
  59. (require 'main)
  60. (require 'visual)
  61. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  62. ;;; Assembly
  63. (push 'nasm-mode package-selected-packages)
  64. ;;; Asymptote
  65. (add-to-list 'load-path "/usr/share/asymptote")
  66. (autoload 'asy-mode "asy-mode" "Asymptote major mode." t)
  67. (autoload 'lasy-mode "asy-mode" "Hybrid Asymptote/Latex major mode." t)
  68. (autoload 'asy-insinuate-latex "asy-mode" "Asymptote insinuate LaTeX." t)
  69. (add-to-list 'auto-mode-alist '("\\.asy$" . asy-mode))
  70. ;;; BBCode
  71. (nconc package-selected-packages '(bbcode-mode))
  72. (with-eval-after-load 'bbcode-mode (require 'init-bbcode))
  73. ;;; Bibtex
  74. (setq bibtex-entry-format '(opts-or-alts required-fields numerical-fields whitespace realign last-comma delimiters braces sort-fields))
  75. (setq bibtex-field-delimiters 'double-quotes)
  76. (add-hook 'bibtex-mode-hook 'ambrevar/turn-off-indent-tabs)
  77. ;;; Bison/Flex
  78. ;; (nconc package-selected-packages '(bison-mode))
  79. ;;; C/C++
  80. (with-eval-after-load 'cc-mode (require 'init-cc))
  81. ;;; ChangeLog
  82. (defun ambrevar/change-log-set-indent-rules ()
  83. (setq tab-width 2 left-margin 2))
  84. (add-hook 'change-log-mode-hook 'ambrevar/change-log-set-indent-rules)
  85. ;;; Completion
  86. (nconc package-selected-packages '(company helm-company))
  87. (when (require 'company nil t)
  88. (setq company-idle-delay nil))
  89. ;;; Debbugs
  90. (nconc package-selected-packages '(debbugs))
  91. (with-eval-after-load 'debbugs
  92. (setq debbugs-gnu-all-severities t))
  93. ;;; Diff
  94. ;;; TODO: In diff-mode, both `[[` and `C-M-a` do not go back to previous index
  95. ;;; once they are at the beginning of an index.
  96. (nconc package-selected-packages '(ztree))
  97. ;;; Dired
  98. ;;; Dired is loaded after init.el, so configure it only then.
  99. ;;; TODO: Improve dired-du:
  100. ;;; - Hangs when the `ls` time format is changed.
  101. ;;; - Cache recursive results.
  102. (nconc package-selected-packages '(dired-du))
  103. (with-eval-after-load 'dired (require 'init-dired))
  104. ;;; Daemons.
  105. (nconc package-selected-packages '(daemons))
  106. ;;; Emms
  107. (nconc package-selected-packages '(emms helm-emms))
  108. (with-eval-after-load 'emms (require 'init-emms))
  109. ;;; Evil
  110. (nconc package-selected-packages '(evil
  111. evil-commentary evil-multiedit
  112. evil-ediff evil-magit evil-mu4e evil-org evil-collection))
  113. (setq evil-want-integration nil)
  114. (when (require 'evil nil t) (require 'init-evil))
  115. ;;; Eshell
  116. ;;; Extend completion.
  117. (nconc package-selected-packages '(fish-completion bash-completion
  118. pcomplete-extension pcmpl-args pcmpl-git))
  119. (nconc package-selected-packages '(esh-autosuggest))
  120. (with-eval-after-load 'bash-completion
  121. ;; REVIEW: Upstream should set path dynamically.
  122. ;; https://github.com/szermatt/emacs-bash-completion/issues/33
  123. ;; Done. Need to update Guix package.
  124. (setq bash-completion-prog (executable-find "bash")))
  125. (when (and (executable-find "fish")
  126. (require 'fish-completion nil t))
  127. (setq fish-completion-fallback-on-bash-p t)
  128. (global-fish-completion-mode))
  129. (with-eval-after-load 'eshell (require 'init-eshell))
  130. (autoload 'ambrevar/eshell-or-new-session "eshell")
  131. ;;; Eww
  132. (with-eval-after-load 'eww (require 'init-eww))
  133. (autoload 'ambrevar/eww-switch-back "eww")
  134. ;;; Expand region.
  135. (nconc package-selected-packages '(expand-region))
  136. (when (require 'expand-region nil t)
  137. (global-set-key (kbd "C-=") 'er/expand-region))
  138. ;;; GLSL
  139. (nconc package-selected-packages '(glsl-mode))
  140. ;;; Go
  141. (nconc package-selected-packages '(go-mode go-eldoc go-guru go-rename helm-go-package company-go))
  142. (with-eval-after-load 'go-mode (require 'init-go))
  143. ;;; Graphviz dot
  144. ;;; The view command is broken but the preview command works (it displays the PNG
  145. ;;; in a new window), which is enough and probably not worth a fix.
  146. (nconc package-selected-packages '(graphviz-dot-mode))
  147. ;;; GUD (GDB, etc.)
  148. (with-eval-after-load 'gud (require 'init-gud))
  149. ;;; Guix
  150. (when (executable-find "guix")
  151. (nconc package-selected-packages '(guix))
  152. (defun ambrevar/init-guix ()
  153. (and buffer-file-name
  154. (string-match "\\<guix\\>" buffer-file-name)
  155. (guix-devel-mode)))
  156. (add-hook 'scheme-mode-hook 'ambrevar/init-guix))
  157. ;;; Helm
  158. (nconc package-selected-packages '(helm helm-descbinds helm-ls-git))
  159. (when (require 'helm-config nil t) (require 'init-helm))
  160. ;;; Hex editing
  161. (nconc package-selected-packages '(nhexl-mode))
  162. ;;; Iedit
  163. (nconc package-selected-packages '(iedit))
  164. (when (require 'iedit nil t)
  165. (global-set-key (kbd "C-;") 'iedit-mode))
  166. ;;; Image
  167. ;;; TODO: Disable white frame.
  168. ;;; I think it's the cursor.
  169. ;;; Evil-mode reverts cursor changes.
  170. ;; (set-face-foreground 'cursor "black")
  171. ;;; TODO: Implement other sxiv features:
  172. ;;; - Gamma
  173. ;;; - Marks
  174. ;;; - Gallery
  175. ;;; TODO: Is it possible to display an image fullscreen?
  176. ;;; TODO: Image+: Dot no auto-adjust animated files
  177. ;;; https://github.com/mhayashi1120/Emacs-imagex/issues/10
  178. ;;; TODO: Image+: Restore animation state
  179. ;;; https://github.com/mhayashi1120/Emacs-imagex/issues/9
  180. (nconc package-selected-packages '(image+))
  181. (with-eval-after-load 'image
  182. (setq image-animate-loop t)
  183. (add-hook 'image-mode-hook 'image-toggle-animation)
  184. (require 'image+ nil t))
  185. ;;; Indentation engine fix.
  186. ;; (require 'smiext "init-smiext")
  187. ;;; Indentation style guessing.
  188. ;; (nconc 'package-selected-packages '(dtrt-indent))
  189. ;;; JavaScript
  190. (add-hook 'js-mode-hook (lambda () (defvaralias 'js-indent-level 'tab-width)))
  191. ;;; Lisp
  192. (nconc package-selected-packages '(lispy lispyville rainbow-delimiters geiser slime))
  193. (with-eval-after-load 'lisp-mode (require 'init-lisp))
  194. ;;; Lua
  195. (nconc package-selected-packages '(lua-mode))
  196. (with-eval-after-load 'lua-mode (require 'init-lua))
  197. ;;; Magit
  198. ;;; Magit can be loaded just-in-time.
  199. (nconc package-selected-packages '(magit))
  200. (with-eval-after-load 'magit
  201. (setq auto-revert-mode-text "")
  202. (set-face-foreground 'magit-branch-remote "orange red")
  203. (setq git-commit-summary-max-length fill-column)
  204. ;; Customize what to fold by default.
  205. ;; (push (cons [* commitbuf] 'hide) magit-section-initial-visibility-alist)
  206. ;; Avoid conflict with WM.
  207. (define-key magit-mode-map (kbd "s-<tab>") nil)
  208. (setq magit-diff-refine-hunk 'all))
  209. (when (fboundp 'magit-status)
  210. (global-set-key (kbd "C-x g") 'magit-status))
  211. ;;; Mail
  212. ;;; mu4e is usually site-local and not part of ELPA.
  213. (when (or (fboundp 'mu4e)
  214. (delq nil (mapcar (lambda (path) (string-match "/mu4e/\\|/mu4e$" path)) load-path)))
  215. ;; (nconc package-selected-packages '(mu4e-maildirs-extension))
  216. (nconc package-selected-packages '(helm-mu)))
  217. (with-eval-after-load 'mu4e (require 'init-mu4e))
  218. (autoload 'ambrevar/mu4e-headers "mu4e")
  219. ;;; Makefile
  220. (with-eval-after-load 'make-mode (require 'init-makefile))
  221. ;;; Markdown
  222. (nconc package-selected-packages '(markdown-mode))
  223. (with-eval-after-load 'markdown-mode (require 'init-markdown))
  224. ;;; Matlab / Octave
  225. (add-to-list 'auto-mode-alist '("\\.m\\'" . octave-mode)) ; matlab
  226. (defun ambrevar/octave-set-comment-start ()
  227. "Set comment character to '%' to be Matlab-compatible."
  228. (set (make-local-variable 'comment-start) "% "))
  229. (add-hook 'octave-mode-hook 'ambrevar/octave-set-comment-start)
  230. ;;; Maxima
  231. (autoload 'maxima-mode "maxima" "Maxima mode" t)
  232. (autoload 'maxima "maxima" "Maxima interaction" t)
  233. (add-to-list 'auto-mode-alist '("\\.mac" . maxima-mode))
  234. ;;; Mediawiki
  235. (nconc package-selected-packages '(mediawiki))
  236. (add-to-list 'auto-mode-alist '("\\.wiki\\'" . mediawiki-mode))
  237. (with-eval-after-load 'mediawiki (require 'init-mediawiki))
  238. ;;; News
  239. (nconc package-selected-packages '(elfeed))
  240. (with-eval-after-load 'elfeed (require 'init-elfeed))
  241. (autoload 'ambrevar/elfeed-switch-back "elfeed")
  242. ;;; Org-mode
  243. (nconc package-selected-packages '(org-plus-contrib org-bullets)) ; org-plus contains latest Org mode.
  244. (with-eval-after-load 'org (require 'init-org))
  245. (autoload 'ambrevar/org-switch-agenda-file "org")
  246. (autoload 'ambrevar/org-switch-agenda-file-other-window "org")
  247. ;;; Packaging
  248. (nconc package-selected-packages '(esup package-lint))
  249. ;;; Pass
  250. (nconc package-selected-packages '(helm-pass))
  251. ;;; PDF
  252. ;;; pdf-tools requires poppler built with cairo support.
  253. ;;; We cannot defer loading as `pdf-tools-install' is required for PDF
  254. ;;; association.
  255. ;;; REVIEW: `save-place' does not seem to work with pdf-tools.
  256. ;;; See https://github.com/politza/pdf-tools/issues/18.
  257. ;;; TODO: windmove fails when selecting text and then moving up/down.
  258. ;;; It only fails in Evil mode.
  259. (nconc package-selected-packages '(pdf-tools))
  260. (when (require 'pdf-tools nil t)
  261. ;; (setq pdf-view-midnight-colors '("#ffffff" . "#000000"))
  262. (setq pdf-view-midnight-colors '("#ff9900" . "#0a0a12" )) ; Amber
  263. (add-hook 'pdf-view-mode-hook 'pdf-view-midnight-minor-mode)
  264. (pdf-tools-install t t t))
  265. ;;; Perl
  266. (defun ambrevar/perl-set-indent-rules ()
  267. (defvaralias 'perl-indent-level 'tab-width))
  268. (defun ambrevar/perl-set-compiler ()
  269. (setq compile-command (concat "perl " (shell-quote-argument buffer-file-name))))
  270. (add-hook 'perl-mode-hook 'ambrevar/perl-set-indent-rules)
  271. (add-hook 'perl-mode-hook 'ambrevar/perl-set-compiler)
  272. ;;; Pinentry
  273. (nconc package-selected-packages '(pinentry)) ; pinentry.el was remombed from Emacs 26.
  274. ;;; po
  275. (nconc package-selected-packages '(po-mode))
  276. ;;; Python
  277. (with-eval-after-load 'python (require 'init-python))
  278. ;;; Rainbow-mode
  279. (nconc package-selected-packages '(rainbow-mode))
  280. (when (require 'rainbow-mode nil t)
  281. (dolist (hook '(css-mode-hook html-mode-hook sass-mode-hook))
  282. (add-hook hook 'rainbow-mode)))
  283. ;;; Roff / Nroff
  284. (with-eval-after-load 'nroff-mode (require 'init-nroff))
  285. ;;; Screencast
  286. ;; (nconc package-selected-packages '(camcorder))
  287. (with-eval-after-load 'camcorder
  288. (setq camcorder-output-directory (expand-file-name "temp" "~")
  289. camcorder-gif-output-directory camcorder-output-directory)
  290. (setq camcorder-recording-command '("recordmydesktop" " --fps 10 --no-sound --windowid " window-id " -o " file))
  291. (add-to-list 'camcorder-gif-conversion-commands '("ffmpeg-slow" "ffmpeg -i " input-file " -vf 'fps=10,scale=1024:-1:flags=lanczos' " gif-file)))
  292. (nconc package-selected-packages '(gif-screencast keycast))
  293. (with-eval-after-load 'gif-screencast
  294. (define-key gif-screencast-mode-map (kbd "<f8>") 'gif-screencast-toggle-pause)
  295. (define-key gif-screencast-mode-map (kbd "<f9>") 'gif-screencast-stop))
  296. ;;; Shell
  297. (with-eval-after-load 'sh-script (require 'init-sh))
  298. ;;; Arch Linux PKGBUILD
  299. (add-to-list 'auto-mode-alist '("PKGBUILD" . sh-mode))
  300. ;;; Gentoo
  301. (add-to-list 'auto-mode-alist '("\\.ebuild\\'" . sh-mode))
  302. (add-to-list 'auto-mode-alist '("\\.eclass\\'" . sh-mode))
  303. (add-to-list 'auto-mode-alist '("package\\.accept_keywords" . sh-mode))
  304. (add-to-list 'auto-mode-alist '("package\\.mask" . sh-mode))
  305. (add-to-list 'auto-mode-alist '("package\\.use" . sh-mode))
  306. ;;; If we ever need to edit exotic shell configs:
  307. ;; (nconc package-selected-packages '(fish-mode rc-mode))
  308. ;;; Srt (subtitles)
  309. (add-to-list 'auto-mode-alist '("\\.srt\\'" . text-mode))
  310. ;;; StackExchange
  311. (nconc package-selected-packages '(sx))
  312. ;;; Syntax checking
  313. (nconc package-selected-packages '(flycheck helm-flycheck))
  314. (when (require 'flycheck nil t) (require 'init-flycheck))
  315. ;;; System packages
  316. (nconc package-selected-packages '(helm-system-packages))
  317. (global-set-key (kbd "C-x c #") 'helm-system-packages)
  318. ;;; Terminal
  319. (with-eval-after-load 'term
  320. ;; (require 'init-term)
  321. (setq term-buffer-maximum-size 0))
  322. ;;; TeX / LaTeX / Texinfo
  323. (nconc package-selected-packages '(auctex latex-math-preview))
  324. (with-eval-after-load 'tex (require 'init-tex))
  325. ;; LaTeX is defined in the same file as TeX. To separate the loading, we add it
  326. ;; to the hook.
  327. (add-hook 'latex-mode-hook (lambda () (require 'init-latex)))
  328. ;;; Torrent
  329. (nconc package-selected-packages '(transmission))
  330. (with-eval-after-load 'transmission
  331. ;; `transmission' will fail to start and will not run any hook if the daemon
  332. ;; is not up yet.
  333. ;; We need to advice the function :before to guarantee it starts.
  334. (defun ambrevar/transmission-start-daemon ()
  335. (unless (member "transmission-da"
  336. (mapcar
  337. (lambda (pid) (alist-get 'comm (process-attributes pid)))
  338. (list-system-processes)))
  339. (call-process "transmission-daemon")
  340. (sleep-for 1)))
  341. (advice-add 'transmission :before 'ambrevar/transmission-start-daemon)
  342. (setq transmission-refresh-modes '(transmission-mode transmission-files-mode transmission-info-mode transmission-peers-mode)
  343. transmission-refresh-interval 1))
  344. ;;; Translator
  345. (nconc package-selected-packages '(google-translate))
  346. (when (require 'google-translate nil t)
  347. (require 'google-translate-default-ui)
  348. ;; (global-set-key "\C-ct" 'google-translate-at-point)
  349. ;; (global-set-key "\C-cT" 'google-translate-query-translate)
  350. (defun ambrevar/google-translate-line ()
  351. "Translate current line and insert result after it, separated by ' = '."
  352. (interactive)
  353. (let* ((langs (google-translate-read-args nil nil))
  354. (source-language (car langs))
  355. (target-language (cadr langs))
  356. text
  357. result)
  358. (end-of-line)
  359. (just-one-space)
  360. (setq text (buffer-substring-no-properties
  361. (line-beginning-position) (line-end-position)))
  362. (setq result (with-temp-buffer
  363. (google-translate-translate
  364. source-language target-language
  365. text
  366. 'current-buffer)
  367. (buffer-string))
  368. (insert "= " result)))))
  369. ;;; Web forms.
  370. ;;; Remove auto-fill in web edits because wikis and forums do not like it.
  371. ;;; This works for qutebrowser, but may need changes for other browsers.
  372. (defun ambrevar/browser-edit ()
  373. (when (require 'with-editor nil t) (with-editor-mode))
  374. (text-mode)
  375. (auto-fill-mode -1))
  376. (add-to-list 'auto-mode-alist `(,(concat (getenv "BROWSER") "-editor-*") . ambrevar/browser-edit))
  377. ;;; Wgrep
  378. (nconc package-selected-packages '(wgrep-helm wgrep-pt))
  379. (when (require 'wgrep nil t)
  380. ;; TODO: wgrep-face is not so pretty.
  381. (set-face-attribute 'wgrep-face nil :inherit 'ediff-current-diff-C :foreground 'unspecified :background 'unspecified :box nil))
  382. ;;; Window manager
  383. (nconc package-selected-packages '(exwm helm-exwm))
  384. (nconc package-selected-packages '(pulseaudio-control))
  385. (with-eval-after-load 'pulseaudio-control
  386. ;; REVIEW: Upstream should set path dynamically.
  387. ;; https://github.com/flexibeast/pulseaudio-control/issues/7
  388. (setq pulseaudio-control-pactl-path (executable-find "pactl")))
  389. (when (require 'exwm nil t) (require 'init-exwm))
  390. ;;; XML / SGML
  391. (defun ambrevar/sgml-setup ()
  392. (setq sgml-xml-mode t)
  393. ;; (toggle-truncate-lines) ; This seems to slow down Emacs.
  394. (turn-off-auto-fill))
  395. (add-hook 'sgml-mode-hook 'ambrevar/sgml-setup)
  396. (with-eval-after-load 'nxml-mode
  397. (set-face-foreground 'nxml-element-local-name "gold1")
  398. (defvaralias 'nxml-child-indent 'tab-width))
  399. ;;; Because XML is hard to read.
  400. (add-hook 'nxml-mode-hook 'ambrevar/turn-on-tab-width-to-4)
  401. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  402. ;;; Finalization
  403. ;;; Don't let `customize' clutter my config.
  404. (setq custom-file
  405. (if (boundp 'server-socket-dir)
  406. (expand-file-name "custom.el" server-socket-dir)
  407. (expand-file-name (format "emacs-custom-%s.el" (user-uid)) temporary-file-directory)))
  408. (load custom-file t)
  409. ;;; Local config. You can use it to set system specific variables, such as the
  410. ;;; external web browser or the geographical coordinates:
  411. ;;
  412. ;; (setq calendar-latitude 20.2158)
  413. ;; (setq calendar-longitude 105.938)
  414. (load "local-after" t)