2017-05-28 12:32:48 +02:00
;;; Main options
2012-10-12 22:02:52 +02:00
2017-06-16 21:33:53 +02:00
( require 'functions )
2017-05-28 12:32:48 +02:00
;;; Minimal UI. Run early to hide it as soon as possible.
2014-03-08 11:48:35 +01:00
( setq inhibit-startup-screen t )
( menu-bar-mode -1 )
2017-05-28 12:32:48 +02:00
;;; `tool-bar-mode' and `scroll-bar-mode' might not be compiled in.
( when ( fboundp 'tool-bar-mode ) ( tool-bar-mode -1 ) )
( when ( fboundp 'scroll-bar-mode ) ( scroll-bar-mode -1 ) )
2014-03-08 11:48:35 +01:00
2017-05-28 12:32:48 +02:00
;;; Remember last cursor position.
2013-05-31 19:01:32 +02:00
( require 'saveplace )
( setq save-place-file ( concat emacs-cache-folder " saveplace " ) )
2016-10-05 06:56:16 +02:00
( setq-default save-place-mode t )
2017-05-28 12:32:48 +02:00
;;; When the daemon is killed abruptly, places are not saved. Adding this hook
;;; allows to save places at a strategic moment.
2014-03-03 21:05:09 +01:00
( add-hook 'before-save-hook 'save-place-kill-emacs-hook )
2013-05-31 19:01:32 +02:00
2017-05-28 12:32:48 +02:00
;;; url-cookie
2014-03-10 11:26:12 +01:00
( setq url-cookie-file ( concat emacs-cache-folder " url.cookies " ) )
2017-05-28 12:32:48 +02:00
;;; Bookmark file to cache folder.
2014-02-21 20:14:50 +01:00
( setq bookmark-default-file ( concat emacs-cache-folder " emacs.bmk " ) )
2017-05-28 12:32:48 +02:00
;;; Recent files.
2016-06-09 18:20:38 +02:00
( setq recentf-save-file ( concat emacs-cache-folder " recentf " ) )
2017-05-28 12:32:48 +02:00
;;; Disable autosave features.
2013-05-31 19:01:32 +02:00
( setq auto-save-default nil )
2013-06-04 20:51:04 +02:00
( setq auto-save-list-file-prefix nil )
2013-05-31 19:01:32 +02:00
2017-05-28 12:32:48 +02:00
;;; Place backup files in specific directory.
2013-05-31 19:01:32 +02:00
( setq backup-directory-alist
2017-06-03 14:47:14 +02:00
` ( ( " . " . , ( concat emacs-cache-folder " backups/ " ) ) ) )
2013-05-31 19:01:32 +02:00
2017-05-28 12:32:48 +02:00
;;; Default mode
2017-05-24 00:27:02 +02:00
( setq-default major-mode 'text-mode )
2013-02-28 22:09:31 +01:00
2017-05-28 12:32:48 +02:00
;;; Disable suspend key since it is useless on Emacs server.
2013-06-12 17:05:10 +02:00
( global-unset-key ( kbd " C-z " ) )
( global-unset-key ( kbd " C-x C-z " ) )
2017-05-28 12:32:48 +02:00
;;; Make questions less annoying.
2013-01-10 17:33:33 +01:00
( defalias 'yes-or-no-p 'y-or-n-p )
2012-10-12 15:23:36 +02:00
2017-05-28 12:32:48 +02:00
;;; Allow some protected functions.
2013-10-20 18:19:19 +02:00
( put 'upcase-region 'disabled nil )
( put 'downcase-region 'disabled nil )
2014-02-23 13:54:39 +01:00
( put 'narrow-to-page 'disabled nil )
2017-05-29 11:57:35 +02:00
( put 'dired-find-alternate-file 'disabled nil )
2013-10-20 18:19:19 +02:00
2017-05-28 12:32:48 +02:00
;;; Print column number in mode line.
2013-01-10 17:33:33 +01:00
( column-number-mode 1 )
2012-10-12 15:23:36 +02:00
2017-05-28 12:32:48 +02:00
;;; Print buffer size in mode line.
2013-06-27 17:06:07 +02:00
( size-indication-mode 1 )
2017-05-28 12:32:48 +02:00
;;; Kill whole line including \n.
2013-01-10 17:33:33 +01:00
( setq kill-whole-line t )
2012-10-12 15:23:36 +02:00
2017-05-28 12:32:48 +02:00
;;; Alternative scrolling
2017-05-08 09:00:14 +02:00
( setq scroll-error-top-bottom t )
2012-10-12 15:23:36 +02:00
2017-05-28 12:32:48 +02:00
;;; Narrow page navigation.
2017-06-16 21:33:53 +02:00
( define-keys mickey-minor-mode-map
" C-x M-n " ( lambda ( ) ( interactive ) ( narrow-to-page 1 ) )
" C-x M-p " ( lambda ( ) ( interactive ) ( narrow-to-page -1 ) ) )
2014-02-23 13:54:39 +01:00
2017-05-28 12:32:48 +02:00
;;; Line numbers
;;; Adding to `find-file-hook' ensures it will work for every file, regardless of
;;; the mode, but it won't work for buffers without files nor on mode change.
2017-05-25 12:12:23 +02:00
( add-hook 'prog-mode-hook 'linum-mode )
( add-hook 'text-mode-hook 'linum-mode )
2017-05-28 12:32:48 +02:00
;;; Emacs-nox does not display a fringe after the linum: Setting linum-format in
;;; linum-before-numbering-hook is not the right approach as it will change the
;;; type of linum-format in the middle. See linum-update-window.
;;; See http://stackoverflow.com/questions/3626632/right-align-line-numbers-with-linum-mode
;;; and http://stackoverflow.com/questions/3626632/right-align-line-numbers-with-linum-mode.
;;; The complexity is not worth the benefit.
;;; Indentation
2014-10-24 14:58:38 +02:00
( setq-default tab-width 2 )
( defvaralias 'standard-indent 'tab-width )
( setq-default indent-tabs-mode t )
2014-10-30 18:18:08 +01:00
2017-05-28 12:32:48 +02:00
;;; This needs to be set globally since they are defined as local variable and
;;; Emacs does not know how to set an alias on a local variable.
2014-10-30 18:18:08 +01:00
( defvaralias 'c-basic-offset 'tab-width )
( defvaralias 'sh-basic-offset 'tab-width )
2012-10-12 15:23:36 +02:00
2017-05-28 12:32:48 +02:00
;;; Line by line scrolling
2012-10-12 15:23:36 +02:00
( setq scroll-step 1 )
2017-05-28 12:32:48 +02:00
;;; There is no prog-mode-hook on Emacs<24.
2017-06-02 19:15:17 +02:00
( require 'tool-page ) ; for `page-number-mode'
2017-05-28 12:03:28 +02:00
( add-hook 'prog-mode-hook 'page-number-mode )
2014-03-05 10:58:42 +01:00
2017-05-23 20:58:46 +02:00
( define-key mickey-minor-mode-map ( kbd " <f5> " ) 'whitespace-mode )
2014-11-12 15:09:14 +01:00
( setq
whitespace-style
2016-06-10 18:05:05 +02:00
' ( face empty indentation space-after-tab space-before-tab tab-mark trailing ) )
2017-05-28 12:32:48 +02:00
;;; `whitespace-report' will mistakenly always report empty lines at
;;; beginning and end of buffer as long as there is at least one empty line.
;;; `whitespace-cleanup' works properly however.
;;; DONE: Reported at http://debbugs.gnu.org/cgi/bugreport.cgi?bug=23740.
;; (setq whitespace-action '(report-on-bogus))
;;; WARNING: this can break some configuration files needing whitespaces at the
2017-06-03 12:47:23 +02:00
;;; end. This can also slow down saving on big files. Some modes (e.g. lisp) run
;;; `fmt' in their local hook, which is redundant with this.
2017-05-28 12:32:48 +02:00
;; (require 'functions) ; for `fmt'
;; (add-hook 'before-save-hook 'fmt)
2016-10-17 09:11:51 +02:00
( add-hook 'before-save-hook 'delete-trailing-whitespace )
2013-03-08 15:46:03 +01:00
2017-06-03 12:47:23 +02:00
;;; Hippie expand
2016-06-09 11:27:24 +02:00
;; (define-key mickey-minor-mode-map (kbd "M-/") 'hippie-expand)
2014-02-21 20:41:11 +01:00
2017-05-28 12:32:48 +02:00
;;; Abbreviation support
2014-02-13 17:30:36 +01:00
( setq-default abbrev-mode t )
2012-10-12 15:23:36 +02:00
2017-06-03 12:46:09 +02:00
;;; Auto-fill
( when ( getenv " MANWIDTH " )
( setq-default fill-column ( string-to-number ( getenv " MANWIDTH " ) ) ) )
2012-10-12 15:23:36 +02:00
( add-hook 'text-mode-hook 'turn-on-auto-fill )
2017-06-03 12:47:23 +02:00
;; (setq sentence-end-double-space nil)
2012-10-12 15:23:36 +02:00
2017-05-28 12:32:48 +02:00
;;; Enforce horizontal splitting. 140 means that the window is large enough to
;;; hold 2 other windows of 70 columns.
2016-07-21 13:37:46 +02:00
( setq split-height-threshold nil )
( setq split-width-threshold 140 )
2017-05-28 12:32:48 +02:00
;;; Windmove mode
;; By default, it allows easy window switching with Shift+arrows. I like to
;; stick to the home-row, but to avoid shadowing other binding I exceptionaly use
;; 'super' (normally reserved to the WM).
2012-10-12 15:23:36 +02:00
( when ( fboundp 'windmove-default-keybindings )
2017-06-16 21:33:53 +02:00
( define-keys mickey-minor-mode-map
" M-s-h " 'windmove-left
" M-s-j " 'windmove-down
" M-s-k " 'windmove-up
" M-s-l " 'windmove-right ) )
2012-10-12 15:23:36 +02:00
2017-05-28 12:32:48 +02:00
;;; Make Emacs use environment browser, or w3m if BROWSER is not set.
2013-02-26 18:30:31 +01:00
( setq browse-url-generic-program
( executable-find
( let ( ( b ( getenv " BROWSER " ) ) )
( if b b " w3m " ) ) )
browse-url-browser-function 'browse-url-generic )
2012-11-13 18:46:20 +01:00
2017-05-28 12:32:48 +02:00
;;; Default ispell dictionary. If not set, Emacs uses the current locale.
2015-04-17 15:47:48 +02:00
( setq ispell-dictionary " english " )
2012-12-21 21:30:54 +01:00
2017-05-28 12:32:48 +02:00
;;; Long paragraphs. Useful for quick navigation with backward-paragraph and
;;; forward-paragraph.
2013-01-08 00:36:02 +01:00
( setq paragraph-start "
" )
2013-01-10 15:57:07 +01:00
2017-05-28 12:32:48 +02:00
;;; Show matching parenthesis
2013-01-10 15:57:07 +01:00
( show-paren-mode 1 )
2017-05-28 12:32:48 +02:00
;;; By default, there’ s a small delay before showing a matching parenthesis. Set
;;; it to 0 to deactivate.
2013-01-10 15:57:07 +01:00
( setq show-paren-delay 0 )
2016-10-05 06:56:16 +02:00
( setq show-paren-when-point-inside-paren t )
2013-01-10 15:57:07 +01:00
2017-05-28 12:32:48 +02:00
;;; Electric Pairs to auto-complete () [] {} "" etc. You can use it on regions.
2017-06-03 19:41:19 +02:00
;; (electric-pair-mode)
2013-02-27 22:35:16 +01:00
2017-05-28 12:32:48 +02:00
;;; Spawn terminal shortcut: WM's binding is s+RET.
2017-05-23 19:06:06 +02:00
( define-key mickey-minor-mode-map ( kbd " C-x M-RET " ) 'spawn-terminal )
2016-11-27 12:40:13 +01:00
2017-05-28 12:32:48 +02:00
;;; Calendar ISO display.
2013-02-27 22:35:16 +01:00
( setq calendar-week-start-day 1 )
( setq calendar-date-style 'iso )
2013-02-28 22:09:31 +01:00
2017-05-28 12:32:48 +02:00
;;; Compilation bindings and conveniences.
2014-03-13 13:50:56 +01:00
( setq compilation-ask-about-save nil )
2017-05-28 12:03:28 +02:00
( setq compilation-scroll-output 'first-error )
2017-05-22 16:12:30 +02:00
( with-eval-after-load 'compile
;; Making `compilation-directory' local only works with `recompile'
;; and if `compile' is never used. In such a scenario,
;; `compile-command' is not saved by `recompile' itself which adds a
;; lot of bookkeeping.
;; (make-variable-buffer-local 'compilation-directory)
;; (make-variable-buffer-local 'compile-history)
( make-variable-buffer-local 'compile-command ) )
2017-06-12 22:29:30 +02:00
;;; Some commands ignore that compilation-mode is a "dumb" terminal and still display colors.
;;; Thus we render those colors.
( require 'ansi-color )
( defun compilation-colorize-buffer ( )
( when ( eq major-mode 'compilation-mode )
( ansi-color-apply-on-region compilation-filter-start ( point-max ) ) ) )
( add-hook 'compilation-filter-hook 'compilation-colorize-buffer )
2017-05-28 12:32:48 +02:00
;;; Don't set these bindings in mickey as we might have to override them from
;;; mode hooks.
2017-05-08 11:51:23 +02:00
( global-set-key ( kbd " C-<f10> " ) 'compile )
2017-05-11 19:38:28 +02:00
( global-set-key ( kbd " <f10> " ) ( lambda ( ) ( interactive ) ( compile compile-command ) ) ) ; Do not use recompile since we want to change de compilation folder to the current buffer.
2017-05-08 11:51:23 +02:00
( global-set-key ( kbd " <f11> " ) 'previous-error )
( global-set-key ( kbd " <f12> " ) 'next-error )
2014-03-13 13:50:56 +01:00
2015-04-25 13:47:00 +02:00
( defadvice desktop-owner ( after pry-from-cold-dead-hands activate )
" Don't allow dead emacsen to own the desktop file. "
( when ( not ( emacs-process-p ad-return-value ) )
( setq ad-return-value nil ) ) )
2017-05-28 12:32:48 +02:00
;;; Desktop-mode
;;; Let Emacs auto-load/save sessions only when running the daemon.
;;; `server-running-p' is only useful once the daemon is started and cannot be
;;; used for initialization. We use `daemonp' instead.
2017-04-28 07:24:51 +02:00
( when ( daemonp )
2013-06-16 16:57:23 +02:00
( setq history-length 250 )
( setq desktop-dirname ( concat emacs-cache-folder " desktop " ) )
2015-04-17 16:16:10 +02:00
( unless ( file-directory-p desktop-dirname )
( make-directory desktop-dirname t ) )
2017-05-22 16:26:52 +02:00
( setq desktop-path ( list desktop-dirname ) )
2017-05-12 08:34:17 +02:00
;; TODO: `compile-history' should be buffer local but that does not work.
;; http://user42.tuxfamily.org/compile-history-local/index.html
;; http://stackoverflow.com/questions/22995203/one-compile-command-per-buffer-not-directory
2017-05-28 12:32:48 +02:00
;; (add-to-list 'desktop-locals-to-save 'compile-history)
2017-05-22 16:26:52 +02:00
( add-to-list 'desktop-locals-to-save 'compile-command )
2017-05-23 20:58:46 +02:00
( add-to-list 'desktop-locals-to-save 'ispell-local-dictionary )
2017-05-22 16:26:52 +02:00
( desktop-save-mode 1 ) )
2013-06-16 16:57:23 +02:00
2017-05-28 12:32:48 +02:00
;;; GMP documentation
2017-05-22 16:12:30 +02:00
( with-eval-after-load " info-look "
( let ( ( mode-value ( assoc 'c-mode ( assoc 'symbol info-lookup-alist ) ) ) )
( setcar ( nthcdr 3 mode-value )
( cons ' ( " (gmp)Function Index " nil " ^ -.* " " \\ > " )
( nth 3 mode-value ) ) ) ) )
2013-11-11 13:51:16 +01:00
2017-05-28 12:32:48 +02:00
;;; Buffer names.
2014-02-21 20:14:50 +01:00
( require 'uniquify )
( setq uniquify-buffer-name-style 'forward )
2013-07-04 10:37:18 +02:00
2017-05-28 12:32:48 +02:00
;;; Skeleton settings
;;; Do not expand abbrevs in skeletons.
2014-03-13 16:13:21 +01:00
( setq-default skeleton-further-elements ' ( ( abbrev-mode nil ) ) )
2017-05-28 12:03:28 +02:00
( turn-on-skeleton-markers )
2017-06-16 21:33:53 +02:00
( define-keys mickey-minor-mode-map
" C-> " 'skeleton-next-position
" C-< " ( lambda ( ) ( interactive ) ( skeleton-next-position t ) ) )
2014-03-13 16:13:21 +01:00
2017-05-28 12:32:48 +02:00
;;; Disable prompt (but leave warning) on git symlink.
2014-02-12 18:31:00 +01:00
( setq vc-follow-symlinks t )
2017-05-28 12:32:48 +02:00
;;; Clipboard and primary selection.
;; (setq select-enable-clipboard t)
2017-05-08 09:00:14 +02:00
( setq select-enable-primary t )
2014-03-20 09:03:53 +01:00
2017-05-28 12:32:48 +02:00
;;; Easy code folding toggle.
;; (add-hook 'prog-mode-hook 'hs-minor-mode)
;; (add-hook 'prog-mode-hook (lambda () (local-set-key (kbd "C-c h") 'hs-toggle-hiding)))
2015-04-17 16:16:10 +02:00
2017-05-28 12:32:48 +02:00
;;; Move mouse away.
2017-06-18 16:28:15 +02:00
( mouse-avoidance-mode 'banish )
2017-05-28 18:37:54 +02:00
;;; That binding is not very useful and gets in the way of C-<mouse-1>.
( global-unset-key ( kbd " C-<down-mouse-1> " ) )
2015-05-09 13:16:10 +02:00
2017-05-28 12:32:48 +02:00
;;; Display defun in mode line.
2015-05-11 19:38:16 +02:00
( which-function-mode )
2017-05-28 12:32:48 +02:00
;;; Replace maximized binding for fullscreen.
;; (define-key mickey-minor-mode-map (kbd "M-<f10>") 'toggle-frame-fullscreen)
2015-05-11 19:38:16 +02:00
2017-05-28 12:32:48 +02:00
;;; Scroll zooming.
2017-06-16 21:33:53 +02:00
( define-keys mickey-minor-mode-map
" C-<wheel-down> " 'text-scale-decrease
" C-<mouse-5> " 'text-scale-decrease
" C-<wheel-up> " 'text-scale-increase
" C-<mouse-4> " 'text-scale-increase )
2015-06-02 10:05:14 +02:00
( setq text-scale-mode-step 1.1 )
2017-05-28 12:32:48 +02:00
;;; Sort
2015-11-02 13:34:04 +01:00
( setq sort-fold-case t )
2017-05-28 12:32:48 +02:00
;;; Replace not-so-useful comment-dwim binding.
2017-06-16 11:40:21 +02:00
( global-set-key " \M -; " 'comment-line )
2016-10-05 06:56:16 +02:00
2017-06-18 14:50:40 +02:00
;;; Eldoc: In case you find it too distracting.
2016-10-06 14:37:53 +02:00
;; (global-eldoc-mode 0)
2016-09-23 15:26:24 +02:00
2017-05-28 12:32:48 +02:00
;;; Replace `kill-buffer' binding by `kill-this-buffer'.
2016-11-06 06:48:41 +01:00
( define-key mickey-minor-mode-map ( kbd " C-x k " ) 'kill-this-buffer )
2017-06-15 21:08:38 +02:00
;;; Ediff
2016-12-10 17:53:59 +01:00
( setq ediff-window-setup-function 'ediff-setup-windows-plain
ediff-split-window-function 'split-window-horizontally )
2017-06-15 21:08:38 +02:00
;;; Trash
( setq delete-by-moving-to-trash t )
2017-06-18 14:26:26 +02:00
;;; Display Time
( setq
zoneinfo-style-world-list
' ( ( " UTC " " - " )
( " Europe/Paris " " France Germany Sweden " )
( " Asia/Calcutta " " India " )
( " Indian/Mauritius " " Mauritius " )
( " Africa/Tunis " " Tunisia " )
( " Asia/Ho_Chi_Minh " " Vietnam " )
( " Australia/Melbourne " " Melbourne " )
( " Africa/Nairobi " " Uganda " ) ) )
2017-06-18 14:50:40 +02:00
;;; Tramp
( setq tramp-persistency-file-name ( concat emacs-cache-folder " tramp " ) )
2014-03-08 11:48:35 +01:00
( provide 'main )