summaryrefslogtreecommitdiffstats
path: root/lisp/ravi-init-appearance.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/ravi-init-appearance.el')
-rw-r--r--lisp/ravi-init-appearance.el315
1 files changed, 315 insertions, 0 deletions
diff --git a/lisp/ravi-init-appearance.el b/lisp/ravi-init-appearance.el
new file mode 100644
index 0000000..035dc1d
--- /dev/null
+++ b/lisp/ravi-init-appearance.el
@@ -0,0 +1,315 @@
+;;; ravi-init-appearance.el --- Emacs appearance
+
+;; Copyright (C) 2013
+
+;; Author: <ravi@nero.lan>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Customization of emacs appearance
+
+;;; Code:
+
+;; No splash screen please
+(setq inhibit-startup-message t)
+
+;; Allow pasting selection outside of Emacs
+(setq x-select-enable-clipboard t)
+
+;; Show keystrokes in progress
+(setq echo-keystrokes 0.1)
+
+;; Real emacs knights don't use shift to mark things
+(setq shift-select-mode nil)
+
+;; Enable syntax highlighting for older Emacsen that have it off
+(global-font-lock-mode t)
+(setq font-lock-maximum-decoration t)
+
+;; Sounds.
+;; Turn off sound.
+(setq bell-volume 0)
+(setq sound-alist nil)
+
+(add-to-list 'default-frame-alist '(cursor-color . "#ffb90f") t)
+
+;; Answering just 'y' or 'n' will do
+(defalias 'yes-or-no-p 'y-or-n-p)
+
+;; Customization of modeline.
+(line-number-mode 1)
+(column-number-mode 1)
+(display-time)
+
+;; Change the way the buffer name is displayed in the modeline.
+(setq-default mode-line-buffer-identification '("%17b"))
+
+;; Undo/redo window configuration with C-c <left>/<right>
+(winner-mode 1)
+
+;; Never insert tabs
+(set-default 'indent-tabs-mode nil)
+
+;; Show me empty lines after buffer end (replaced, see below)
+;(set-default 'indicate-empty-lines t)
+
+(use-package whitespace
+ :init
+ (setq whitespace-style '(face trailing indentation tabs))
+ :config
+ (progn
+ (global-whitespace-mode 1))
+ ; No need for 'ensure: t' since whitespace mode is built in
+ :diminish global-whitespace-mode
+ )
+
+(use-package ws-butler
+ :config
+ (progn
+ (ws-butler-global-mode 1))
+ :diminish ws-butler-mode
+ :ensure t)
+
+(diminish 'abbrev-mode)
+
+;; Handling end of files.
+(setq require-final-newline t)
+;; Prevent addition of lines at end of file when down arrow is pressed.
+(setq next-line-add-newlines nil)
+
+;; Kill the entire line, please
+(setq kill-whole-line t)
+
+;; Delete hungrily
+(use-package hungry-delete
+ :commands (hungry-delete-forward hungry-delete-backward)
+ :bind (("C-d" . hungry-delete-forward))
+ :init
+ (progn
+ (defun jschaf/hungry-delete-backward (n &optional killflag)
+ "Delete non-vertical whitespace backwards on first key press.
+Delete all whitespace on a successive key press."
+ (interactive "p\nP")
+ (if (eq last-command 'jschaf/hungry-delete-backward)
+ (hungry-delete-backward n killflag)
+ (let ((hungry-delete-chars-to-skip " \t\f\v"))
+ (hungry-delete-backward n killflag))))
+ ;;(define-key global-map [remap backward-delete-char-untabify] 'jschaf/hungry-delete-backward)
+ (define-key global-map [remap backward-delete-char-untabify] 'hungry-delete-backward)
+ )
+ :ensure t)
+
+(setq sentence-end-double-space nil)
+(defun sacha/unfill-paragraph (&optional region)
+ "Takes a multi-line paragraph and makes it into a single line of text."
+ (interactive (progn
+ (barf-if-buffer-read-only)
+ (list t)))
+ (let ((fill-column (point-max)))
+ (fill-paragraph nil region)))
+(bind-key "M-Q" 'sacha/unfill-paragraph)
+
+;; Easily navigate sillycased words
+;(global-subword-mode 1)
+
+;; Keep cursor away from edges when scrolling up/down
+(use-package smooth-scrolling
+ :ensure t
+ )
+
+;; Enable automatic indentation, if possible
+(use-package smart-newline
+ :commands (smart-newline)
+ :init
+ (progn
+ (bind-key "<return>" 'smart-newline prog-mode-map)
+ (bind-key "<return>" 'smart-newline emacs-lisp-mode-map))
+ :ensure t)
+
+;; Case toggling: from Oleg Krehel http://oremacs.com/2014/12/25/ode-to-toggle/
+(defun oremacs/char-upcasep (letter)
+ (eq letter (upcase letter)))
+
+(defun oremacs/capitalize-word-toggle ()
+ (interactive)
+ (let ((start
+ (car
+ (save-excursion
+ (backward-word)
+ (bounds-of-thing-at-point 'symbol)))))
+ (if start
+ (save-excursion
+ (goto-char start)
+ (funcall
+ (if (oremacs/char-upcasep (char-after))
+ 'downcase-region
+ 'upcase-region)
+ start (1+ start)))
+ (capitalize-word -1))))
+(bind-key "M-c" 'oremacs/capitalize-word-toggle)
+
+(defun oremacs/upcase-word-toggle ()
+ (interactive)
+ (let ((bounds (bounds-of-thing-at-point 'symbol))
+ beg end
+ (regionp
+ (if (eq this-command last-command)
+ (get this-command 'regionp)
+ (put this-command 'regionp nil))))
+ (cond
+ ((or (region-active-p) regionp)
+ (setq beg (region-beginning)
+ end (region-end))
+ (put this-command 'regionp t))
+ (bounds
+ (setq beg (car bounds)
+ end (cdr bounds)))
+ (t
+ (setq beg (point)
+ end (1+ beg))))
+ (save-excursion
+ (goto-char (1- beg))
+ (and (re-search-forward "[A-Za-z]" end t)
+ (funcall (if (oremacs/char-upcasep (char-before))
+ 'downcase-region
+ 'upcase-region)
+ beg end)))))
+(bind-key "M-l" 'oremacs/upcase-word-toggle)
+
+;; Zap up to char is more useful than zap-char
+(use-package zop-to-char
+ :bind (("M-z" . zop-up-to-char)
+ ("M-Z" . zop-to-char))
+ :ensure t)
+
+;; Automatic indentation of yanked text
+(dolist (command '(yank yank-pop))
+ (eval `(defadvice ,command (after indent-region activate)
+ (and (not current-prefix-arg)
+ (member major-mode '(emacs-lisp-mode lisp-mode
+ clojure-mode scheme-mode
+ haskell-mode ruby-mode
+ rspec-mode python-mode
+ c-mode c++-mode
+ objc-mode latex-mode
+ plain-tex-mode))
+ (let ((mark-even-if-inactive transient-mark-mode))
+ (indent-region (region-beginning) (region-end) nil))))))
+
+(use-package comment-dwim-2
+ :bind (("M-;" . comment-dwim-2))
+ :ensure t)
+
+;; Keep my navigation simple
+(setq line-move-visual nil)
+
+;; Represent undo-history as an actual tree (visualize with C-x u)
+(use-package undo-tree
+ :init
+ (setq undo-tree-mode-lighter "")
+ :config
+ (progn
+ (global-undo-tree-mode)
+ (setq undo-tree-auto-save-history t)
+ (setq undo-tree-history-directory-alist
+ `(("." . ,(expand-file-name "undotree/" (ravi/emacs-file "past")))))
+ )
+ :ensure t
+ )
+
+;; Discover emacs
+;; Since discover.el replaces keymaps wholesale for "C-x r" and "M-s", it overrides
+;; our additions to them. So we use guide-key for "C-x r" and "M-s".
+(use-package discover
+ :config
+ (progn
+ (add-hook 'dired-mode-hook 'discover-turn-on-in-dired)
+ )
+ :disabled t ;; unstable API and hosing user-provided keybindings
+ :ensure t
+ )
+
+;; Help for prefix key-bindings not in discover-mode
+(use-package guide-key
+ :config
+ (progn
+ (setq guide-key/guide-key-sequence '("C-c p" ;; projectile
+ "C-c d" ;; doxymacs
+ "C-x 4" ;; other-window
+ "C-x r" ;; rectangles/registers
+ "M-s" ;; isearch
+ "C-x v" ;; version control
+ "M-g" ;; movement
+ "C-x 5" ;; frames
+ "C-x n" ;; narrowing
+ ))
+ (when (and (boundp ravi/use-helm-instead-of-ido) ravi/use-helm-instead-of-ido)
+ (add-to-list 'guide-key/guide-key-sequence "<escape>"))
+
+ (guide-key-mode 1)
+
+ (use-package guide-key-tip
+ :config
+ (progn
+ (setq guide-key-tip/enabled t))
+ :ensure t
+ :disabled t ;; popups don't always go away; need to file a bug report
+ )
+ )
+ :diminish guide-key-mode
+ :ensure t
+ )
+
+(bind-key "C-h a" 'apropos)
+
+(use-package popwin
+ :init
+ (progn
+ (popwin-mode 1)
+ (push '("*Pp Eval Output*" :height 15) popwin:special-display-config))
+ :ensure t
+ )
+
+(use-package import-popwin
+ :bind (("M-i" . import-popwin))
+ :ensure t
+ )
+
+(use-package ace-window
+ :bind (("M-o" . ace-window))
+ :init
+ (progn
+ (setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l ?i ?e)))
+ :ensure t
+ )
+
+(defun ravi/split-window-vertically-and-switch (prefix)
+ (interactive "P")
+ (split-window-vertically (if (consp prefix) nil prefix))
+ (other-window 1)
+ (unless (consp prefix) (switch-to-next-buffer)))
+(bind-key "C-x 2" 'ravi/split-window-vertically-and-switch)
+
+(defun ravi/split-window-horizontally-and-switch (prefix)
+ (interactive "P")
+ (split-window-horizontally (if (consp prefix) nil prefix))
+ (other-window 1)
+ (unless (consp prefix) (switch-to-next-buffer)))
+(bind-key "C-x 3" 'ravi/split-window-horizontally-and-switch)
+
+(provide 'ravi-init-appearance)
+;;; ravi-init-appearance.el ends here