16 KiB
My Emacs
- Installation
- General stuff
- Theme
- Dashboard
- Zygospore
- Mode-line
- Editing settings
- Undo-tree
- Volatile highlights
- iedit
- Smartparens
- Comment-dwim-2
- Yasnippet
- Expand-region
- Windooze
- Helm
- Old stuff, maybe usefull for lookup later
- TODO

Installation
My personal emacs configuration
(Heavily) Inspired by the following configs:
This configuration requires the installation of :
- the GNU
globalpackage (for gtags) clang(for ivory)cmake(for ivory)llvm-libs(for cmake, somehow not a dependency on Manjaro when installing cmake)- Use python-pip to install
jedi,flake8,importmagicandautopep8(for elpy) ditaa(for ascii to image generation in org-mode)
When first checking out this config, run irony-install-server to make and install the irony-server.
General stuff
Unsorted
Collection of stuff that needs to be sorted…someday….maybe…
(global-set-key (kbd "M-p") 'fill-paragraph)
Macro's
Rebind the macro keys to Fx keys to give them a decent purpose.
(global-set-key [f9] 'start-kbd-macro)
(global-set-key [f10] 'end-kbd-macro)
(global-set-key [f11] 'call-last-kbd-macro)
Goto-line
Starting with Emacs 23.2, M-g g is bound to goto-line.
However, I find this too long. So rebind it:
(global-set-key (kbd "M-g") 'goto-line)
Rectangle
Most rectangle functions are by default mapped to something like C-x r (other-char).
I use string-insert-rectangle and query-replace-regexp quite a lot,
so rebind it to something easy to remember.
(global-set-key (kbd "C-x r i") 'string-insert-rectangle)
(global-set-key (kbd "C-x r r") 'query-replace-regexp)
Garbage collection (gc)
I used to have the following enabled in my init to increase the gc threshold to speed-up emacs startup: (stolen from http://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/)
;; (setq gc-cons-threshold 100000000)
But according to this: https://lists.gnu.org/archive/html/help-gnu-emacs/2007-06/msg00243.html , it is no longer necessary.
Yes-or-no questions
Because I'm lazy, important yes-or-no questions can be answered with y-or-n:
(defalias 'yes-or-no-p 'y-or-n-p)
Emacs fullscreen at startup
(add-to-list 'default-frame-alist '(fullscreen . maximized))
Multi-frame rebindings
Sometimes I have multiple emacs-frames open.
I prefer that the normal C-x o can deal with this.
;; Use C-x o to switch to other frame when using multi-monitor
(global-set-key (kbd "C-x o") 'next-multiframe-window)
Now that next-multiframe-window is bound to C-x o,
Bind C-x p to previous-multiframe-window.
(global-set-key (kbd "\C-x p") 'previous-multiframe-window)
Enable disabled commands
Some commands are disabled to protect the user. Narrow-region/page is a really handy feature, enable it:
(put 'narrow-to-page 'disabled nil)
(put 'narrow-to-region 'disabled nil)
Buffers
Why is this not built-in?
(defun kill-all-buffers ()
"Kill all buffers without regard for their origin."
(interactive)
(mapc 'kill-buffer (buffer-list)))
Helping vim-users
(defconst wq "This is not vi! Use C-x C-c instead.")
(defconst w "This is not vi! Use C-x C-s instead.")
(defconst q! "This is EMACS not vi! Use C-x C-c instead.")
(defconst wq! "This is EMACS not vi! Use C-x C-c instead.")
Backup files
Disable the generation of backup-files, I don't use them.
(setq make-backup-files nil)
Theme
(use-package monokai-theme
:ensure t
:init
(load-theme 'monokai t)
)
Highlight line
Highlight line will highlight the current line we are on. Enable highlight-line globally and replace its background colour.
(global-hl-line-mode 1)
(set-face-background hl-line-face "dark slate grey")
Dashboard
I use the dashboard as start screen.
Since I like it to give me a list of recent files, we need to enable recentf-mode.
(use-package dashboard
:ensure t
:init
(recentf-mode 1)
:config
(dashboard-setup-startup-hook)
(setq dashboard-startup-banner "~/.emacs.d/img/dash_logo.png")
(setq dashboard-items '((recents . 10)
(bookmarks . 5)
))
(setq dashboard-banner-logo-title "")
)
Zygospore
Revert C-x 1 by pressing C-x 1 again:
https://github.com/louiskottmann/zygospore.el
FYI: At one point, used this together with sr-speedbar. They did not play well together…
(use-package zygospore
:ensure t
:config
(global-set-key (kbd "C-x 1") 'zygospore-toggle-delete-other-windows)
)
Mode-line
https://github.com/Malabarba/smart-mode-line
(use-package smart-mode-line
:ensure t
:config
(setq sml/no-confirm-load-theme t)
(setq sml/theme 'respectful)
(sml/setup)
)
Editing settings
Kill-ring customization
Setting kill-whole-line to non-nil means when we execute C-k at the beginning of a line
will the entire line including the following newline will be deleted.
(setq kill-ring-max 5000) ; increase kill-ring capacity
(setq kill-whole-line t)
Newline at end-of-file
(setq mode-require-final-newline t) ; add a newline to end of file
Enable column numbers
(setq column-number-mode 1)
Look-and-feel modifications
Remove scroll-, tool- and menu-bar. I don't use them so free some space.
(scroll-bar-mode -1)
(tool-bar-mode -1)
(menu-bar-mode -1)
Tab-width
Set the default tab width.
(setq-default tab-width 4)
Automatic indent
Automatically indent when pressing RET.
(global-set-key (kbd "RET") 'newline-and-indent)
Delete trailing whitespace
Automatically delete trailing whitespace when saving a file.
(add-hook 'before-save-hook 'delete-trailing-whitespace)
Undo-tree
Undo with C-/.
(use-package undo-tree
:ensure t
:config
(global-undo-tree-mode)
)
Volatile highlights
Show/highlight changes when doing undo/yanks/kills/…
https://github.com/k-talo/volatile-highlights.el
(use-package volatile-highlights
:ensure t
:config
(volatile-highlights-mode t)
)
iedit
Highlight occurences of symbol and replace them simultanously.
Shortkey: C-;
https://github.com/victorhge/iedit
(use-package iedit
:ensure t
)
Smartparens
Smart minor-mode to deal with pairs. Extra options:
show-smartparens-global-mode: highlight corresponding bracket/pair/…smartparens-global-mode: enable smartparens
https://github.com/Fuco1/smartparens
(use-package smartparens
:ensure t
:config
(require 'smartparens-config)
(show-smartparens-global-mode t)
(smartparens-global-mode t)
)
;; old config stuff
;; (setq sp-base-key-bindings 'paredit)
;; (setq sp-autoskip-closing-pair 'always)
;; (setq sp-hybrid-kill-entire-symbol nil)
;; (sp-use-paredit-bindings)
;;
;; (show-smartparens-global-mode +1)
;; (smartparens-global-mode 1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; keybinding management smartparens ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; cl-package contains the loop macro
;; (require 'cl)
;;
;; (defmacro def-pairs (pairs)
;; `(progn
;; ,@(loop for (key . val) in pairs
;; collect
;; `(defun ,(read (concat
;; "wrap-with-"
;; (prin1-to-string key)
;; "s"))
;; (&optional arg)
;; (interactive "p")
;; (sp-wrap-with-pair ,val)))))
;;
;; (def-pairs ((paren . "(")
;; (bracket . "[")
;; (brace . "{")
;; (single-quote . "'")
;; (double-quote . "\"")
;; (underscore . "_")
;; (back-quote . "`")))
;;
;; (define-key smartparens-mode-map (kbd "C-c (") 'wrap-with-parens)
;; (define-key smartparens-mode-map (kbd "C-c [") 'wrap-with-brackets)
;; (define-key smartparens-mode-map (kbd "C-c {") 'wrap-with-braces)
;; (define-key smartparens-mode-map (kbd "C-c '") 'wrap-with-single-quotes)
;; (define-key smartparens-mode-map (kbd "C-c \"") 'wrap-with-double-quotes)
;; (define-key smartparens-mode-map (kbd "C-c _") 'wrap-with-underscores)
;; (define-key smartparens-mode-map (kbd "C-c `") 'wrap-with-back-quotes)
;;
;; (define-key smartparens-mode-map (kbd "C-c s r") 'sp-rewrap-sexp)
;; (define-key smartparens-mode-map (kbd "C-c s u") 'sp-unwrap-sexp)
;;
;; (define-key smartparens-mode-map (kbd "C-M-f") 'sp-forward-sexp)
;; (define-key smartparens-mode-map (kbd "C-M-b") 'sp-backward-sexp)
;;
;; ;; TODO: in manjaro this selects keyboard-layout or something
;; ;;(define-key smartparens-mode-map (kbd "C-M-k") 'sp-kill-sexp)
;; (define-key smartparens-mode-map (kbd "C-M-w") 'sp-copy-sexp)
;;
;; (define-key smartparens-mode-map (kbd "C-M-n") 'sp-next-sexp)
;; (define-key smartparens-mode-map (kbd "C-M-p") 'sp-previous-sexp)
;;
;; ;; TODO: for some reason this does not work
;; (define-key smartparens-mode-map (kbd "C-M-a") 'sp-beginning-of-sexp)
;; (define-key smartparens-mode-map (kbd "C-M-e") 'sp-end-of-sexp)
;;
;; (define-key smartparens-mode-map (kbd "C-M-h") 'mark-defun)
;;
;; (smartparens-global-mode t)
Comment-dwim-2
Replacement for built-in comment-dwim, more comment features.
https://github.com/remyferre/comment-dwim-2
(use-package comment-dwim-2
:ensure t
:config
(global-set-key (kbd "M-;") 'comment-dwim-2)
)
Yasnippet
Template system for Emacs.
https://github.com/joaotavora/yasnippet
(use-package yasnippet
:ensure t
:config
(add-to-list 'load-path
"~/.emacs.d/plugins/yasnippet")
(yas-global-mode 1)
)
Expand-region
Expand region increases the selected region by semantic units.
I also enable pending-delete-mode, this means when we mark a region and start typing,
the text within the mark is deleted with the new typed text and the mark disappears.
https://github.com/magnars/expand-region.el
(use-package expand-region
:ensure t
:init
(pending-delete-mode t)
:config
(global-set-key (kbd "C-=") 'er/expand-region)
)
Windooze
When we use windows as our bootloader, we have to setup some things first:
;; Windows performance tweaks
;;
(when (boundp 'w32-pipe-read-delay)
(setq w32-pipe-read-delay 0))
;; Set the buffer size to 64K on Windows (from the original 4K)
(when (boundp 'w32-pipe-buffer-size)
(setq irony-server-w32-pipe-buffer-size (* 64 1024)))
;; Set pipe delay to 0 to reduce latency of irony
(setq w32-pipe-read-delay 0)
;; From "setting up irony mode on Windows" :
;; Make sure the path to clang.dll is in emacs' exec_path and shell PATH.
(setenv "PATH"
(concat
"C:\\msys64\\usr\\bin" ";"
"C:\\msys64\\mingw64\\bin" ";"
(getenv "PATH")
)
)
(setq exec-path (append '("c:/msys64/usr/bin" "c:/alt/msys64/mingw64/bin")
exec-path))
To be fair, I didn't test this in a while…
Helm
General config
(use-package helm
:ensure t
:bind
("M-x" . 'helm-M-x)
("M-y" . 'helm-show-kill-ring)
("C-x b" . 'helm-mini)
("C-x C-b" . 'helm-mini)
("C-x C-f" . 'helm-find-files)
:init
(helm-mode 1))
:config
(setq helm-M-x-fuzzy-match t
helm-buffers-fuzzy-matching t
helm-recentf-fuzzy-match t
helm-semantic-fuzzy-match t
helm-imenu-fuzzy-match t
helm-split-window-inside-p nil ;; open helm buffer inside current window
helm-scroll-amount 8 ;; scroll 8 lines other window using M-<next>/M-<prior>
;; helm-move-to-line-cycle-in-source nil ;; move to end or beginning of source when reaching to por bottom of source
;; helm-ff-search-library-in-sexp t ;; search for library in 'require' and 'declare-function' sexp
;; helm-echo-input-in-header-line t
)
(require 'helm-config)
;; (helm-autoresize-mode 1)
;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level)
;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action)
;; replace vanilla isearch with helm-swoop
(use-package helm-swoop
:ensure t
:bind
("C-s" . 'helm-swoop')
:config
(define-key helm-swoop-map (kbd "C-s") 'helm-multi-swoop-all-from-helm-swoop)
)
;; rebind tab to do persistent action
;; we use helm-execute-persistent-action more than helm-select-action (default for <tab>)
;; (define-key helm-map (kbd "<tab>") 'helm-execute-persistent-action)
;; make TAB work in terminal
;; (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action)
;; remap helm-select-action: lists actions
;; (define-key helm-map (kbd "C-z") 'helm-select-action)
;; remap calculator
;; (global-set-key (kbd "C-c C-c") 'helm-calcul-expression)
;; TODO: experiment with mark ring (breadcrumbs something?)
;; TODO: experiment with helm-regexp (build and test regexes)
;; TODO: remember helm-top (helm interface for top program)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Next 2 lines make sure when using helm-swoop only the current window/buffer is affected ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; If this value is t, split window inside the current window
;; (setq helm-swoop-split-with-multiple-windows t)
;; Split direcion. 'split-window-vertically or 'split-window-horizontally
;; (setq helm-swoop-split-direction 'split-window-vertically)
Helm-gtags
(use-package helm-gtags
:ensure t
:bind
( "M-." . 'helm-gtags-find-tag-from-here)
( "M-," . 'helm-gtags-pop-stack)
( "C-c f" . 'helm-gtags-find-files)
( "C-c p" . 'helm-gtags-parse-file)
:config
(add-hook 'c-mode-hook 'helm-gtags-mode)
(add-hook 'c++-mode-hook 'helm-gtags-mode)
(add-hook 'python-mode-hook 'helm-gtags-mode)
(add-hook 'java-mode-hook 'helm-gtags-mode)
(add-hook 'asm-mode-hook 'helm-gtags-mode)
(custom-set-variables '(helm-gtags-auto-update t))
)
Old stuff, maybe usefull for lookup later
Diff mode stuff
;; show whitespace in diff-mode
;; (add-hook 'diff-mode-hook (lambda ()
;; (setq-local whitespace-style
;; '(face
;; tabs
;; tab-mark
;; spaces
;; space-mark
;; trailing
;; indentation::space
;; indentation::tab
;; newline
;; newline-mark))
;; (whitespace-mode 1)))
Speedbar
;; Package: sr-speedbar
;;(require 'sr-speedbar)
;; (add-hook 'emacs-startup-hook (lambda () ; Open sr speedbar on startup
;; (sr-speedbar-open)
;; ))
;; (setq speedbar-show-unknown-files t) ; Enable speedbar to show all files
;; (setq speedbar-use-images nil) ; use text for buttons
;; (setq sr-speedbar-right-side nil) ; put on left side
;; (setq sr-speedbar-width 40)
;;
;; (provide 'setup-speedbar)
TODO
stuff i need to look into:
- ibuffer
- switch-window
- split-and-follow-vertically/horizontally
- which-key
- symon
- spaceline
- async
- exwm
- helm-hide-minibuffer