(require-package 'unfill) (when (fboundp 'electric-pair-mode) (electric-pair-mode)) (when (fboundp 'electric-indent-mode) (electric-indent-mode)) ;;---------------------------------------------------------------------------- ;; Some basic preferences ;;---------------------------------------------------------------------------- (setq-default blink-cursor-delay 0 blink-cursor-interval 0.4 bookmark-default-file (expand-file-name ".bookmarks.el" user-emacs-directory) buffers-menu-max-size 30 case-fold-search t column-number-mode t delete-selection-mode t ediff-split-window-function 'split-window-horizontally ediff-window-setup-function 'ediff-setup-windows-plain indent-tabs-mode nil make-backup-files nil mouse-yank-at-point t save-interprogram-paste-before-kill t scroll-preserve-screen-position 'always set-mark-command-repeat-pop t show-trailing-whitespace t tooltip-delay 1.5 truncate-lines nil truncate-partial-width-windows nil visible-bell t) (global-auto-revert-mode) (setq global-auto-revert-non-file-buffers t auto-revert-verbose nil) (transient-mark-mode t) ;;; Whitespace (defun sanityinc/no-trailing-whitespace () "Turn off display of trailing whitespace in this buffer." (setq show-trailing-whitespace nil)) ;; But don't show trailing whitespace in SQLi, inf-ruby etc. (dolist (hook '(special-mode-hook eww-mode-hook term-mode-hook comint-mode-hook compilation-mode-hook twittering-mode-hook minibuffer-setup-hook)) (add-hook hook #'sanityinc/no-trailing-whitespace)) (require-package 'whitespace-cleanup-mode) (global-whitespace-cleanup-mode t) (when (eval-when-compile (string< "24.3.1" emacs-version)) ;; https://github.com/purcell/emacs.d/issues/138 (after-load 'subword (diminish 'subword-mode))) (when (fboundp 'global-prettify-symbols-mode) (global-prettify-symbols-mode)) (require-package 'undo-tree) (global-undo-tree-mode) (diminish 'undo-tree-mode) (require-package 'highlight-symbol) (dolist (hook '(prog-mode-hook html-mode-hook css-mode-hook)) (add-hook hook 'highlight-symbol-mode) (add-hook hook 'highlight-symbol-nav-mode)) (eval-after-load 'highlight-symbol '(diminish 'highlight-symbol-mode)) ;;---------------------------------------------------------------------------- ;; Zap *up* to char is a handy pair for zap-to-char ;;---------------------------------------------------------------------------- (autoload 'zap-up-to-char "misc" "Kill up to, but not including ARGth occurrence of CHAR.") (global-set-key (kbd "M-Z") 'zap-up-to-char) (require-package 'browse-kill-ring) ;;---------------------------------------------------------------------------- ;; Don't disable narrowing commands ;;---------------------------------------------------------------------------- (put 'narrow-to-region 'disabled nil) (put 'narrow-to-page 'disabled nil) (put 'narrow-to-defun 'disabled nil) ;;---------------------------------------------------------------------------- ;; Show matching parens ;;---------------------------------------------------------------------------- (show-paren-mode 1) ;;---------------------------------------------------------------------------- ;; Expand region ;;---------------------------------------------------------------------------- (require-package 'expand-region) (global-set-key (kbd "C-=") 'er/expand-region) ;;---------------------------------------------------------------------------- ;; Don't disable case-change functions ;;---------------------------------------------------------------------------- (put 'upcase-region 'disabled nil) (put 'downcase-region 'disabled nil) ;;---------------------------------------------------------------------------- ;; Rectangle selections, and overwrite text when the selection is active ;;---------------------------------------------------------------------------- (cua-selection-mode t) ; for rectangles, CUA is nice ;;---------------------------------------------------------------------------- ;; Handy key bindings ;;---------------------------------------------------------------------------- ;; To be able to M-x without meta (global-set-key (kbd "C-x C-m") 'execute-extended-command) ;; Vimmy alternatives to M-^ and C-u M-^ (global-set-key (kbd "C-c j") 'join-line) (global-set-key (kbd "C-c J") (lambda () (interactive) (join-line 1))) (global-set-key (kbd "C-.") 'set-mark-command) (global-set-key (kbd "C-x C-.") 'pop-global-mark) (require-package 'ace-jump-mode) (global-set-key (kbd "C-;") 'ace-jump-mode) (global-set-key (kbd "C-:") 'ace-jump-word-mode) (require-package 'multiple-cursors) ;; multiple-cursors (global-set-key (kbd "C-<") 'mc/mark-previous-like-this) (global-set-key (kbd "C->") 'mc/mark-next-like-this) (global-set-key (kbd "C-+") 'mc/mark-next-like-this) (global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this) ;; From active region to multiple cursors: (global-set-key (kbd "C-c c r") 'set-rectangular-region-anchor) (global-set-key (kbd "C-c c c") 'mc/edit-lines) (global-set-key (kbd "C-c c e") 'mc/edit-ends-of-lines) (global-set-key (kbd "C-c c a") 'mc/edit-beginnings-of-lines) ;; Train myself to use M-f and M-b instead (global-unset-key [M-left]) (global-unset-key [M-right]) (defun kill-back-to-indentation () "Kill from point back to the first non-whitespace character on the line." (interactive) (let ((prev-pos (point))) (back-to-indentation) (kill-region (point) prev-pos))) (global-set-key (kbd "C-M-") 'kill-back-to-indentation) ;;---------------------------------------------------------------------------- ;; Page break lines ;;---------------------------------------------------------------------------- (require-package 'page-break-lines) (global-page-break-lines-mode) (diminish 'page-break-lines-mode) ;;---------------------------------------------------------------------------- ;; Fill column indicator ;;---------------------------------------------------------------------------- (when (eval-when-compile (> emacs-major-version 23)) (require-package 'fill-column-indicator) (defun sanityinc/prog-mode-fci-settings () (turn-on-fci-mode) (when show-trailing-whitespace (set (make-local-variable 'whitespace-style) '(face trailing)) (whitespace-mode 1))) ;;(add-hook 'prog-mode-hook 'sanityinc/prog-mode-fci-settings) (defun sanityinc/fci-enabled-p () (and (boundp 'fci-mode) fci-mode)) (defvar sanityinc/fci-mode-suppressed nil) (defadvice popup-create (before suppress-fci-mode activate) "Suspend fci-mode while popups are visible" (let ((fci-enabled (sanityinc/fci-enabled-p))) (when fci-enabled (set (make-local-variable 'sanityinc/fci-mode-suppressed) fci-enabled) (turn-off-fci-mode)))) (defadvice popup-delete (after restore-fci-mode activate) "Restore fci-mode when all popups have closed" (when (and sanityinc/fci-mode-suppressed (null popup-instances)) (setq sanityinc/fci-mode-suppressed nil) (turn-on-fci-mode))) ;; Regenerate fci-mode line images after switching themes (defadvice enable-theme (after recompute-fci-face activate) (dolist (buffer (buffer-list)) (with-current-buffer buffer (when (sanityinc/fci-enabled-p) (turn-on-fci-mode)))))) ;;---------------------------------------------------------------------------- ;; Shift lines up and down with M-up and M-down. When paredit is enabled, ;; it will use those keybindings. For this reason, you might prefer to ;; use M-S-up and M-S-down, which will work even in lisp modes. ;;---------------------------------------------------------------------------- (require-package 'move-dup) (global-set-key [M-up] 'md/move-lines-up) (global-set-key [M-down] 'md/move-lines-down) (global-set-key [M-S-up] 'md/move-lines-up) (global-set-key [M-S-down] 'md/move-lines-down) (global-set-key (kbd "C-c p") 'md/duplicate-down) (global-set-key (kbd "C-c P") 'md/duplicate-up) ;;---------------------------------------------------------------------------- ;; Fix backward-up-list to understand quotes, see http://bit.ly/h7mdIL ;;---------------------------------------------------------------------------- (defun backward-up-sexp (arg) "Jump up to the start of the ARG'th enclosing sexp." (interactive "p") (let ((ppss (syntax-ppss))) (cond ((elt ppss 3) (goto-char (elt ppss 8)) (backward-up-sexp (1- arg))) ((backward-up-list arg))))) (global-set-key [remap backward-up-list] 'backward-up-sexp) ; C-M-u, C-M-up ;;---------------------------------------------------------------------------- ;; Cut/copy the current line if no region is active ;;---------------------------------------------------------------------------- (require-package 'whole-line-or-region) (whole-line-or-region-mode t) (diminish 'whole-line-or-region-mode) (make-variable-buffer-local 'whole-line-or-region-mode) (defun suspend-mode-during-cua-rect-selection (mode-name) "Add an advice to suspend `MODE-NAME' while selecting a CUA rectangle." (let ((flagvar (intern (format "%s-was-active-before-cua-rectangle" mode-name))) (advice-name (intern (format "suspend-%s" mode-name)))) (eval-after-load 'cua-rect `(progn (defvar ,flagvar nil) (make-variable-buffer-local ',flagvar) (defadvice cua--activate-rectangle (after ,advice-name activate) (setq ,flagvar (and (boundp ',mode-name) ,mode-name)) (when ,flagvar (,mode-name 0))) (defadvice cua--deactivate-rectangle (after ,advice-name activate) (when ,flagvar (,mode-name 1))))))) (suspend-mode-during-cua-rect-selection 'whole-line-or-region-mode) (defun sanityinc/open-line-with-reindent (n) "A version of `open-line' which reindents the start and end positions. If there is a fill prefix and/or a `left-margin', insert them on the new line if the line would have been blank. With arg N, insert N newlines." (interactive "*p") (let* ((do-fill-prefix (and fill-prefix (bolp))) (do-left-margin (and (bolp) (> (current-left-margin) 0))) (loc (point-marker)) ;; Don't expand an abbrev before point. (abbrev-mode nil)) (delete-horizontal-space t) (newline n) (indent-according-to-mode) (when (eolp) (delete-horizontal-space t)) (goto-char loc) (while (> n 0) (cond ((bolp) (if do-left-margin (indent-to (current-left-margin))) (if do-fill-prefix (insert-and-inherit fill-prefix)))) (forward-line 1) (setq n (1- n))) (goto-char loc) (end-of-line) (indent-according-to-mode))) (global-set-key (kbd "C-o") 'sanityinc/open-line-with-reindent) ;;---------------------------------------------------------------------------- ;; Random line sorting ;;---------------------------------------------------------------------------- (defun sort-lines-random (beg end) "Sort lines in region randomly." (interactive "r") (save-excursion (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (let ;; To make `end-of-line' and etc. to ignore fields. ((inhibit-field-text-motion t)) (sort-subr nil 'forward-line 'end-of-line nil nil (lambda (s1 s2) (eq (random 2) 0))))))) (require-package 'highlight-escape-sequences) (hes-mode) (require-package 'guide-key) (setq guide-key/guide-key-sequence '("C-x r" "C-x 4" "C-x 5" "C-c ;" "C-c ; f" "C-c ' f" "C-x n")) (guide-key-mode 1) (diminish 'guide-key-mode) (provide 'init-editing-utils)