;;; keybindings.el --- Spacemacs Base Layer key-bindings File ;; ;; Copyright (c) 2012-2016 Sylvain Benner & Contributors ;; ;; Author: Sylvain Benner ;; URL: https://github.com/syl20bnr/spacemacs ;; ;; This file is not part of GNU Emacs. ;; ;;; License: GPLv3 ;; --------------------------------------------------------------------------- ;; Prefixes ;; --------------------------------------------------------------------------- ;; We define prefix commands only for the sake of which-key (setq spacemacs/key-binding-prefixes '(("a" "applications") ("ai" "irc") ("as" "shells") ("b" "buffers") ("c" "compile/comments") ("C" "capture/colors") ("e" "errors") ("f" "files") ("fC" "files/convert") ("fe" "emacs(spacemacs)") ("fv" "variables") ("g" "git/versions-control") ("h" "help") ("hd" "help-describe") ("i" "insertion") ("j" "jump/join/split") ("k" "lisp") ("kd" "delete") ("kD" "delete-backward") ("k`" "hybrid") ("n" "narrow/numbers") ("p" "projects") ("p$" "projects/shell") ("q" "quit") ("r" "registers/rings/resume") ("Re" "elisp") ("Rp" "pcre") ("s" "search/symbol") ("sa" "ag") ("sg" "grep") ("sk" "ack") ("st" "pt") ("sw" "web") ("t" "toggles") ("tC" "colors") ("tE" "editing-styles") ("th" "highlight") ("tm" "modeline") ("T" "UI toggles/themes") ("C-t" "other toggles") ("w" "windows") ("wp" "popup") ("x" "text") ("xa" "align") ("xd" "delete") ("xg" "google-translate") ("xl" "lines") ("xm" "move") ("xt" "transpose") ("xw" "words") ("z" "zoom"))) (mapc (lambda (x) (apply #'spacemacs/declare-prefix x)) spacemacs/key-binding-prefixes) ;; instantly display current keystrokes in mini buffer (setq echo-keystrokes 0.02) ;; auto-indent on RET (define-key global-map (kbd "RET") 'newline-and-indent) ;; improve delete-other-windows (define-key global-map (kbd "C-x 1") 'spacemacs/toggle-maximize-buffer) ;; alternate binding to search next occurrence with isearch without ;; exiting isearch (define-key isearch-mode-map (kbd "S-") 'isearch-repeat-forward) (define-key isearch-mode-map (kbd "M-S-") 'isearch-repeat-backward) ;; Escape from isearch-mode("/" and "?" in evil-mode) like vim (define-key isearch-mode-map (kbd "") 'isearch-cancel) ;; Make quit as much as possible (define-key minibuffer-local-map (kbd "") 'keyboard-escape-quit) (define-key minibuffer-local-ns-map (kbd "") 'keyboard-escape-quit) (define-key minibuffer-local-completion-map (kbd "") 'keyboard-escape-quit) (define-key minibuffer-local-must-match-map (kbd "") 'keyboard-escape-quit) (define-key minibuffer-local-isearch-map (kbd "") 'keyboard-escape-quit) ;; linum margin bindings------------------------------------------------------- (global-set-key (kbd " ") 'spacemacs/md-select-linum) (global-set-key (kbd " ") 'spacemacs/mu-select-linum) (global-set-key (kbd " ") 'spacemacs/select-current-block) (global-set-key (kbd " ") 'spacemacs/mu-select-linum) ;; --------------------------------------------------------------------------- ;; spacemacs leader key bindings ;; --------------------------------------------------------------------------- ;; Universal argument --------------------------------------------------------- (spacemacs/set-leader-keys "u" 'universal-argument) (when (memq dotspacemacs-editing-style '(vim hybrid)) (define-key universal-argument-map (kbd (concat dotspacemacs-leader-key " u")) 'universal-argument-more)) ;; shell command ------------------------------------------------------------- (spacemacs/set-leader-keys "!" 'shell-command) ;; applications --------------------------------------------------------------- (spacemacs/set-leader-keys "ac" 'calc-dispatch "ap" 'list-processes "aP" 'proced "au" 'undo-tree-visualize) ;; buffers -------------------------------------------------------------------- (spacemacs/set-leader-keys "TAB" 'spacemacs/alternate-buffer "bd" 'spacemacs/kill-this-buffer "be" 'spacemacs/safe-erase-buffer "bh" 'spacemacs/home "bk" 'spacemacs/kill-matching-buffers-rudely "bn" 'spacemacs/next-useful-buffer "bm" 'spacemacs/kill-other-buffers "bN" 'spacemacs/new-empty-buffer "bP" 'spacemacs/copy-clipboard-to-whole-buffer "bp" 'spacemacs/previous-useful-buffer "bR" 'spacemacs/safe-revert-buffer "bs" 'spacemacs/switch-to-scratch-buffer "bY" 'spacemacs/copy-whole-buffer-to-clipboard "bw" 'read-only-mode) ;; Cycling settings ----------------------------------------------------------- (spacemacs/set-leader-keys "Tn" 'spacemacs/cycle-spacemacs-theme) ;; errors --------------------------------------------------------------------- (spacemacs/set-leader-keys "en" 'spacemacs/next-error "eN" 'spacemacs/previous-error "ep" 'spacemacs/previous-error) (spacemacs|define-transient-state error :title "Error transient state" :hint-is-doc t :dynamic-hint (let ((sys (spacemacs//error-delegate))) (cond ((eq 'flycheck sys) "\nBrowsing flycheck errors from this buffer.") ((eq 'emacs sys) (let ((buf (next-error-find-buffer))) (if buf (concat "\nBrowsing entries from \"" (buffer-name buf) "\"" (with-current-buffer buf (when spacemacs--gne-line-func (format " (%d of %d)" (max 1 (1+ (- spacemacs--gne-cur-line spacemacs--gne-min-line))) (1+ (- spacemacs--gne-max-line spacemacs--gne-min-line)))))) "\nNo next-error capable buffer found."))))) :bindings ("n" spacemacs/next-error "next") ("p" spacemacs/previous-error "prev") ("q" nil "quit" :exit t) :evil-leader "e.") ;; file ----------------------------------------------------------------------- (spacemacs/set-leader-keys "fc" 'spacemacs/copy-file "fD" 'spacemacs/delete-current-buffer-file "fei" 'spacemacs/find-user-init-file "fed" 'spacemacs/find-dotfile "feD" 'spacemacs/ediff-dotfile-and-template "feR" 'dotspacemacs/sync-configuration-layers "fev" 'spacemacs/display-and-copy-version "fCd" 'spacemacs/unix2dos "fCu" 'spacemacs/dos2unix "fg" 'rgrep "fl" 'find-file-literally "fE" 'spacemacs/sudo-edit "fo" 'spacemacs/open-in-external-app "fR" 'spacemacs/rename-current-buffer-file "fS" 'evil-write-all "fs" 'save-buffer "fvd" 'add-dir-local-variable "fvf" 'add-file-local-variable "fvp" 'add-file-local-variable-prop-line "fy" 'spacemacs/show-and-copy-buffer-filename) ;; help ----------------------------------------------------------------------- (spacemacs/set-leader-keys "hdb" 'describe-bindings "hdc" 'describe-char "hdf" 'describe-function "hdk" 'describe-key "hdl" 'spacemacs/describe-last-keys "hdp" 'describe-package "hdP" 'configuration-layer/describe-package "hds" 'spacemacs/describe-system-info "hdt" 'describe-theme "hdv" 'describe-variable "hI" 'spacemacs/report-issue "hn" 'view-emacs-news) ;; insert stuff --------------------------------------------------------------- (spacemacs/set-leader-keys "iJ" 'spacemacs/insert-line-below-no-indent "iK" 'spacemacs/insert-line-above-no-indent "ik" 'spacemacs/evil-insert-line-above "ij" 'spacemacs/evil-insert-line-below) ;; format --------------------------------------------------------------------- ;; `SPC j k' key binding for a frequent action: go and indent line below the point ;; `SPC J' split the current line at point and indent it (spacemacs/set-leader-keys "jo" 'open-line "j=" 'spacemacs/indent-region-or-buffer "jS" 'spacemacs/split-and-new-line "jk" 'spacemacs/evil-goto-next-line-and-indent) ;; navigation/jumping --------------------------------------------------------- (spacemacs/set-leader-keys "j0" 'spacemacs/push-mark-and-goto-beginning-of-line "j$" 'spacemacs/push-mark-and-goto-end-of-line "jF" 'find-function-at-point "jf" 'find-function "ji" 'spacemacs/jump-in-buffer "jv" 'find-variable "jV" 'find-variable-at-point) ;; Compilation ---------------------------------------------------------------- (spacemacs/set-leader-keys "cC" 'compile "ck" 'kill-compilation "cr" 'recompile "cd" 'spacemacs/close-compilation-window) (with-eval-after-load 'compile (define-key compilation-mode-map "r" 'recompile) (define-key compilation-mode-map "g" nil)) ;; narrow & widen ------------------------------------------------------------- (spacemacs/set-leader-keys "nr" 'narrow-to-region "np" 'narrow-to-page "nf" 'narrow-to-defun "nw" 'widen) ;; toggle --------------------------------------------------------------------- (spacemacs|add-toggle highlight-current-line-globally :mode global-hl-line-mode :documentation "Globally highlight the current line." :evil-leader "thh") (spacemacs|add-toggle truncate-lines :status truncate-lines :on (toggle-truncate-lines) :off (toggle-truncate-lines -1) :documentation "Truncate long lines (no wrap)." :evil-leader "tl") (spacemacs|add-toggle visual-line-navigation :status visual-line-mode :on (progn (visual-line-mode) (evil-define-minor-mode-key 'motion 'visual-line-mode "j" 'evil-next-visual-line) (evil-define-minor-mode-key 'motion 'visual-line-mode "k" 'evil-previous-visual-line) (when (bound-and-true-p evil-escape-mode) (evil-escape-mode -1) (setq evil-escape-motion-state-shadowed-func nil) (evil-define-minor-mode-key 'motion 'visual-line-mode "j" 'evil-next-visual-line) (evil-define-minor-mode-key 'motion 'visual-line-mode "k" 'evil-previous-visual-line) (evil-escape-mode)) (evil-normalize-keymaps)) :off (progn (visual-line-mode -1) (evil-normalize-keymaps)) :documentation "Move point according to visual lines." :evil-leader "tL") (spacemacs|add-toggle auto-fill-mode :status auto-fill-function :on (auto-fill-mode) :off (auto-fill-mode -1) :documentation "Break line beyond `current-fill-column` while editing." :evil-leader "tF") (spacemacs|add-toggle debug-on-error :status debug-on-error :on (setq debug-on-error t) :off (setq debug-on-error nil) :documentation "Toggle display of backtrace when an error happens." :evil-leader "tD") (spacemacs|add-toggle fringe :status (not (equal fringe-mode 0)) :on (call-interactively 'fringe-mode) :off (fringe-mode 0) :documentation "Display the fringe in GUI mode." :evil-leader "Tf") (spacemacs|add-toggle fullscreen-frame :status (memq (frame-parameter nil 'fullscreen) '(fullscreen fullboth)) :on (spacemacs/toggle-frame-fullscreen) :off (spacemacs/toggle-frame-fullscreen) :documentation "Display the current frame in full screen." :evil-leader "TF") (spacemacs|add-toggle maximize-frame :status (eq (frame-parameter nil 'fullscreen) 'maximized) :on (toggle-frame-maximized) :off (toggle-frame-maximized) :documentation "Maximize the current frame." :evil-leader "TM") (spacemacs|add-toggle mode-line :status (not hidden-mode-line-mode) :on (hidden-mode-line-mode -1) :off (hidden-mode-line-mode) :documentation "Toggle the visibility of modeline." :evil-leader "tmt") (spacemacs|add-toggle transparent-frame :status nil :on (spacemacs/toggle-transparency) :documentation "Make the current frame non-opaque." :evil-leader "TT") (spacemacs|add-toggle tool-bar :if window-system :mode tool-bar-mode :documentation "Display the tool bar in GUI mode." :evil-leader "Tt") (spacemacs|add-toggle menu-bar :if window-system :mode menu-bar-mode :documentation "Display the menu bar." :evil-leader "Tm") (spacemacs|add-toggle semantic-stickyfunc :mode semantic-stickyfunc-mode :documentation "Enable semantic-stickyfunc." :evil-leader "TS") (spacemacs|add-toggle semantic-stickyfunc-globally :mode global-semantic-stickyfunc-mode :documentation "Enable semantic-stickyfunc globally." :evil-leader "T C-S") ;; quit ----------------------------------------------------------------------- (spacemacs/set-leader-keys "qs" 'spacemacs/save-buffers-kill-emacs "qq" 'spacemacs/prompt-kill-emacs "qQ" 'spacemacs/kill-emacs "qz" 'spacemacs/frame-killer) ;; window --------------------------------------------------------------------- (defun split-window-below-and-focus () "Split the window vertically and focus the new window." (interactive) (split-window-below) (windmove-down) (when (and (boundp 'golden-ratio-mode) (symbol-value golden-ratio-mode)) (golden-ratio))) (defun split-window-right-and-focus () "Split the window horizontally and focus the new window." (interactive) (split-window-right) (windmove-right) (when (and (boundp 'golden-ratio-mode) (symbol-value golden-ratio-mode)) (golden-ratio))) (spacemacs/set-leader-keys "w2" 'spacemacs/layout-double-columns "w3" 'spacemacs/layout-triple-columns "wb" 'spacemacs/switch-to-minibuffer-window "wd" 'spacemacs/delete-window "wt" 'spacemacs/toggle-current-window-dedication "wf" 'follow-mode "wF" 'make-frame "wH" 'evil-window-move-far-left "w " 'evil-window-move-far-left "wh" 'evil-window-left "w " 'evil-window-left "wJ" 'evil-window-move-very-bottom "w " 'evil-window-move-very-bottom "wj" 'evil-window-down "w " 'evil-window-down "wK" 'evil-window-move-very-top "w " 'evil-window-move-very-top "wk" 'evil-window-up "w " 'evil-window-up "wL" 'evil-window-move-far-right "w " 'evil-window-move-far-right "wl" 'evil-window-right "w " 'evil-window-right "wm" 'spacemacs/toggle-maximize-buffer "wc" 'spacemacs/toggle-centered-buffer-mode "wC" 'spacemacs/centered-buffer-mode-full-width "wo" 'other-frame "wr" 'spacemacs/rotate-windows "wR" 'spacemacs/rotate-windows-backward "ws" 'split-window-below "wS" 'split-window-below-and-focus "w-" 'split-window-below "wU" 'winner-redo "wu" 'winner-undo "wv" 'split-window-right "wV" 'split-window-right-and-focus "ww" 'other-window "w/" 'split-window-right "w=" 'balance-windows "w_" 'spacemacs/maximize-horizontally) ;; text ----------------------------------------------------------------------- (defalias 'count-region 'count-words-region) (spacemacs/set-leader-keys "xa&" 'spacemacs/align-repeat-ampersand "xa(" 'spacemacs/align-repeat-left-paren "xa)" 'spacemacs/align-repeat-right-paren "xa," 'spacemacs/align-repeat-comma "xa." 'spacemacs/align-repeat-decimal "xa:" 'spacemacs/align-repeat-colon "xa;" 'spacemacs/align-repeat-semicolon "xa=" 'spacemacs/align-repeat-equal "xa\\" 'spacemacs/align-repeat-backslash "xaa" 'align "xac" 'align-current "xam" 'spacemacs/align-repeat-math-oper "xar" 'spacemacs/align-repeat "xa|" 'spacemacs/align-repeat-bar "xc" 'count-region "xdw" 'delete-trailing-whitespace "xjc" 'set-justification-center "xjf" 'set-justification-full "xjl" 'set-justification-left "xjn" 'set-justification-none "xjr" 'set-justification-right "xls" 'spacemacs/sort-lines "xlu" 'spacemacs/uniquify-lines "xtc" 'transpose-chars "xtl" 'transpose-lines "xtw" 'transpose-words "xU" 'upcase-region "xu" 'downcase-region "xwc" 'spacemacs/count-words-analysis "x TAB" 'indent-rigidly) (define-key indent-rigidly-map "h" 'indent-rigidly-left) (define-key indent-rigidly-map "l" 'indent-rigidly-right) (define-key indent-rigidly-map "H" 'indent-rigidly-left-to-tab-stop) (define-key indent-rigidly-map "L" 'indent-rigidly-right-to-tab-stop) ;; shell ---------------------------------------------------------------------- (with-eval-after-load 'shell (evil-define-key 'insert comint-mode-map [up] 'comint-previous-input) (evil-define-key 'insert comint-mode-map [down] 'comint-next-input)) ;; --------------------------------------------------------------------------- ;; Transient-states ;; --------------------------------------------------------------------------- ;; Buffer transient state (spacemacs|define-transient-state buffer :title "Buffer Selection Transient State" :bindings ("n" spacemacs/next-useful-buffer "next") ("N" spacemacs/previous-useful-buffer "previous") ("p" spacemacs/previous-useful-buffer "previous") ("K" spacemacs/kill-this-buffer "kill") ("q" nil "quit" :exit t)) (spacemacs/set-leader-keys "b." 'spacemacs/buffer-transient-state/body) ;; end of Buffer transient state ;; Window Manipulation Transient State (defun spacemacs/shrink-window-horizontally (delta) "Wrap `spacemacs/shrink-window-horizontally'." (interactive "p") (shrink-window delta t)) (defun spacemacs/shrink-window (delta) "Wrap `spacemacs/shrink-window'." (interactive "p") (shrink-window delta)) (defun spacemacs/enlarge-window (delta) "Wrap `spacemacs/enlarge-window'." (interactive "p") (enlarge-window delta)) (defun spacemacs/enlarge-window-horizontally (delta) "Wrap `spacemacs/enlarge-window-horizontally'." (interactive "p") (enlarge-window delta t)) (spacemacs|define-transient-state window-manipulation :title "Window Manipulation Transient State" :doc " Select^^^^ Move^^^^ Split^^ Resize^^ Other^^ ──────^^^^───────────── ────^^^^───────────── ─────^^─────────────── ──────^^──────────────────── ─────^^────────────────────────────── [_j_/_k_] down/up [_J_/_K_] down/up [_s_] vertical [_[_] shrink horizontally [_q_] quit [_h_/_l_] left/right [_H_/_L_] left/right [_S_] vert & follow [_]_] enlarge horizontally [_u_] restore prev layout [_0_-_9_] window N [_R_]^^ rotate [_v_] horizontal [_{_] shrink vertically [_U_] restore next layout [_w_]^^ other window ^^^^ [_V_] horiz & follow [_}_] enlarge vertically [_d_] close current [_o_]^^ other frame ^^^^ ^^ ^^ [_D_] close other ^^^^ ^^^^ ^^ ^^ [_g_] golden-ratio %`golden-ratio-mode" :bindings ("q" nil :exit t) ("0" select-window-0) ("1" select-window-1) ("2" select-window-2) ("3" select-window-3) ("4" select-window-4) ("5" select-window-5) ("6" select-window-6) ("7" select-window-7) ("8" select-window-8) ("9" select-window-9) ("-" split-window-below-and-focus) ("/" split-window-right-and-focus) ("[" spacemacs/shrink-window-horizontally) ("]" spacemacs/enlarge-window-horizontally) ("{" spacemacs/shrink-window) ("}" spacemacs/enlarge-window) ("d" delete-window) ("D" delete-other-windows) ("g" spacemacs/toggle-golden-ratio) ("h" evil-window-left) ("" evil-window-left) ("j" evil-window-down) ("" evil-window-down) ("k" evil-window-up) ("" evil-window-up) ("l" evil-window-right) ("" evil-window-right) ("H" evil-window-move-far-left) ("" evil-window-move-far-left) ("J" evil-window-move-very-bottom) ("" evil-window-move-very-bottom) ("K" evil-window-move-very-top) ("" evil-window-move-very-top) ("L" evil-window-move-far-right) ("" evil-window-move-far-right) ("o" other-frame) ("R" spacemacs/rotate-windows) ("s" split-window-below) ("S" split-window-below-and-focus) ("u" winner-undo) ("U" winner-redo) ("v" split-window-right) ("V" split-window-right-and-focus) ("w" other-window)) (spacemacs/set-leader-keys "w." 'spacemacs/window-manipulation-transient-state/body) ;; end of Window Manipulation Transient State ;; text Manipulation Transient State (defun spacemacs/scale-up-or-down-font-size (direction) "Scale the font. If DIRECTION is positive or zero the font is scaled up, otherwise it is scaled down." (interactive) (let ((scale 0.5)) (if (eq direction 0) (text-scale-set 0) (if (< direction 0) (text-scale-decrease scale) (text-scale-increase scale))))) (defun spacemacs/scale-up-font () "Scale up the font." (interactive) (spacemacs/scale-up-or-down-font-size 1)) (defun spacemacs/scale-down-font () "Scale up the font." (interactive) (spacemacs/scale-up-or-down-font-size -1)) (defun spacemacs/reset-font-size () "Reset the font size." (interactive) (spacemacs/scale-up-or-down-font-size 0)) (spacemacs|define-transient-state scale-font :title "Font Scaling Transient State" :doc "\n[_+_/_=_] scale up [_-_] scale down [_0_] reset font [_q_] quit" :bindings ("+" spacemacs/scale-up-font) ("=" spacemacs/scale-up-font) ("-" spacemacs/scale-down-font) ("0" spacemacs/reset-font-size) ("q" nil :exit t)) (spacemacs/set-leader-keys "zx" 'spacemacs/scale-font-transient-state/body) ;; end of Text Manipulation Transient State ;; Transparency transient-state (defun spacemacs/toggle-transparency () "Toggle between transparent or opaque display." (interactive) (let* ((frame (selected-frame)) (alpha (frame-parameter frame 'alpha)) (dotfile-setting (cons dotspacemacs-active-transparency dotspacemacs-inactive-transparency))) (set-frame-parameter frame 'alpha (if (not (equal alpha dotfile-setting)) dotfile-setting '(100 . 100))))) (defun spacemacs/increase-transparency () "Increase transparency of current frame." (interactive) (let* ((current-alpha (car (frame-parameter (selected-frame) 'alpha))) (increased-alpha (- current-alpha 5))) (when (>= increased-alpha frame-alpha-lower-limit) (set-frame-parameter (selected-frame) 'alpha (cons increased-alpha increased-alpha))))) (defun spacemacs/decrease-transparency () "Decrease transparency of current frame." (interactive) (let* ((current-alpha (car (frame-parameter (selected-frame) 'alpha))) (decreased-alpha (+ current-alpha 5))) (when (<= decreased-alpha 100) (set-frame-parameter (selected-frame) 'alpha (cons decreased-alpha decreased-alpha))))) (spacemacs|define-transient-state scale-transparency :title "Frame Transparency Transient State" :doc "\n[_+_/_=_] increase transparency [_-_] decrease [_T_] toggle [_q_] quit" :bindings ("+" spacemacs/increase-transparency) ("=" spacemacs/increase-transparency) ("-" spacemacs/decrease-transparency) ("T" spacemacs/toggle-transparency) ("q" nil :exit t)) (spacemacs/set-leader-keys "TT" 'spacemacs/scale-transparency-transient-state/spacemacs/toggle-transparency) ;; end of Transparency Transient State