Basic quality of life settings
Settings (mostly) from emacs
;; Highlight matching brackets
(show-paren-mode 1)
;; reduce the frequency of garbage collection by making it happen on
;; each 50MB of allocated data (the default is on every 0.76MB)
(setq gc-cons-threshold 50000000)
;; no start up screen
(setq inhibit-startup-message t)
;; Emacs modes typically provide a standard means to change the
;; indentation width -- eg. c-basic-offset: use that to adjust your
;; personal indentation width, while maintaining the style (and
;; meaning) of any files you load.
(setq-default indent-tabs-mode nil) ;; don't use tabs to indent
(setq tab-width 2) ;; but maintain correct appearance
;; mode line settings
(line-number-mode t)
(column-number-mode t)
(size-indication-mode t)
;; stop making sounds
(setq ring-bell-function 'ignore)
;; none of the bars needed
(tool-bar-mode -1)
(menu-bar-mode -1)
(if window-system
(scroll-bar-mode -1))
;; relative line numbers
(setq display-line-numbers-type 'relative)
(global-display-line-numbers-mode 1)
;; highlight current line
(global-hl-line-mode +1)
;; disable emacs autosave mode because of super-save
(setq auto-save-default nil)
;; automatically insert closing brackets
(setq electric-pair-pairs '(
(?\{ . ?\})
(?\( . ?\))
(?\[ . ?\])
(?\" . ?\")
))
(electric-pair-mode t)
;; Remember window modifications for undo-ing and redo-ing
;; For eg, pressing C-x 1 would effectively mean destroying
;; window configuration. Not anymore.
(when (fboundp 'winner-mode)
(winner-mode 1))
;; Auto revert buffers when they change on disk
(global-auto-revert-mode t)
;; yes or no to y or n
(defalias 'yes-or-no-p 'y-or-n-p)
;; diminish some common minor modes
(use-package emacs
:diminish (visual-line-mode eldoc-mode))
;; store all backup and autosave files in the tmp dir
(setq backup-directory-alist
`((".*" . ,temporary-file-directory)))
(setq auto-save-file-name-transforms
`((".*" ,temporary-file-directory t)))
Keep windows balanced automatically
(defadvice split-window-below (after restore-balanace-below activate)
(balance-windows))
(defadvice split-window-right (after restore-balance-right activate)
(balance-windows))
(defadvice delete-window (after restore-balance activate)
(balance-windows))
Quickly change config
(defun config-visit ()
(interactive)
(find-file (expand-file-name "config.org" user-emacs-directory)))
(global-set-key (kbd "C-c e") 'config-visit)
(defun config-reload ()
"Reloads ~/.emacs.d/init.el at runtime"
(interactive)
(load-file (expand-file-name "init.el" user-emacs-directory)))
(global-set-key (kbd "C-c r") 'config-reload)
Diminish
(use-package diminish
:ensure t)
Which key :)
(use-package which-key
:diminish which-key-mode
:ensure t
:config
(which-key-mode))
Super save
Saves automatically when window loses focus
(use-package super-save
:ensure t
:diminish super-save-mode
:config
(super-save-mode +1)
(setq super-save-auto-save-when-idle t))
Thrift files syntax highlight
(use-package thrift
:ensure t)
Whitespace cleanup
;; Nothing visual, just cleanup before save
(use-package whitespace
:init
(add-hook 'before-save-hook #'whitespace-cleanup))
ibuffer setup
(global-set-key (kbd "C-x C-b") 'ibuffer)
(setq ibuffer-expert t)
(setq ibuffer-saved-filter-groups
'(("home"
("C++" (or (mode . c++-mode) (mode . c-mode)))
("emacs-config" (filename . ".emacs.d"))
("Org" (mode . org-mode)))))
(add-hook 'ibuffer-mode-hook
'(lambda ()
(ibuffer-auto-mode 1)
(ibuffer-switch-to-saved-filter-groups "home")))
Moving between windows
There is windmove, but getting it working with vim-like keybindings is
painful. ace-window
should do the trick for now.
(use-package ace-window
:ensure t
;; use MELPA because ace-window hasn't been uploaded to
;; melpa-stable since mid-2015l
:pin MELPA
:config
(global-set-key (kbd "M-o") 'ace-window)
(global-set-key (kbd "C-x o") 'ace-window)
(setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l))
:custom-face
(aw-leading-char-face
((t (:inherit ace-jump-face-foreground :height 3.0)))))
Key frequency logging
Log key frequency of commands to better assign shortcuts.
(use-package keyfreq
:ensure t
:config (keyfreq-mode 1)
(keyfreq-autosave-mode 1))
Smooth scrolling
(use-package smooth-scrolling
:ensure t
:config
(smooth-scrolling-mode 1))
Expand region
;; One of the best features from Intellij Idea.
(use-package expand-region
:ensure t
:bind (("C-=" . 'er/expand-region)
("C--" . 'er/contract-region)))
Appearance
Theme
(use-package solarized-theme
:ensure t
:config
(load-theme 'solarized-light t))
Status line
(use-package spaceline
:ensure t
:config
(require 'spaceline-config)
(setq spaceline-buffer-size-p nil)
(setq spaceline-buffer-encoding-abbrev-p nil)
(setq spaceline-line-p nil)
(setq powerline-default-separator nil)
(setq spaceline-highlight-face-func 'spaceline-highlight-face-evil-state)
(spaceline-spacemacs-theme))
Rainbow delimiters
(use-package rainbow-delimiters
:ensure t
:pin MELPA
:config
(add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
Yasnippet
(use-package yasnippet
:ensure t
:diminish yas-minor-mode
:config
(use-package yasnippet-snippets
:ensure t)
(yas-reload-all)
(yas-global-mode 1))
(use-package auto-yasnippet
:pin MELPA
:ensure t)
Org
Basic settings
(setq my-org-dir (expand-file-name "~/dbx/org"))
(setq refile-org (expand-file-name "refile.org" my-org-dir))
(use-package org
:ensure org-plus-contrib
:config
(setq org-ellipsis " ⤵")
(setq org-src-fontify-natively t)
(setq org-src-tab-acts-natively t)
(setq org-confirm-babel-evaluate nil)
(setq org-export-with-smart-quotes t)
(setq org-src-window-setup 'current-window)
(setq org-directory my-org-dir)
(setq org-default-notes-file refile-org)
(setq org-capture-templates
(quote (("t" "todo" entry (file refile-org)
"* TODO %?\n%U\n%a\n" :clock-in t :clock-resume t)
("n" "note" entry (file refile-org)
"* %? :NOTE:\n%U\n%a\n" :clock-in t :clock-resume t)
("m" "Meeting" entry (file refile-org)
"* MEETING with %? :MEETING:\n%U" :clock-in t :clock-resume t))))
(setq org-habit-graph-column 50)
(setq org-agenda-files '("~/dbx/org"))
(setq org-agenda-start-with-follow-mode t)
(setq org-refile-targets (quote ((nil :maxlevel . 9)
(org-agenda-files :maxlevel . 9))))
(setq org-modules (quote (org-bbdb
org-bibtex
org-crypt
org-gnus
org-id
org-info
org-habit
org-inlinetask
org-irc
org-mew
org-mhe
org-protocol
org-rmail
org-vm
org-wl
org-w3m)))
(add-hook 'org-mode-hook 'org-indent-mode)
:bind (("C-c a" . org-agenda)
("C-c b" . org-switchb)
("C-c c" . org-capture)
("C-c '" . org-edit-src-code)
("C-c o" . (lambda () (interactive)
(find-file (expand-file-name "main.org" my-org-dir))))))
Org packages
(use-package org-bullets
:ensure t
:config
(add-hook 'org-mode-hook (lambda () (org-bullets-mode))))
(use-package org-journal
:ensure t
:init
(setq org-journal-dir "~/Dropbox/workTODOs")
(setq org-journal-date-format "#+TITLE: Journal Entry: %b %e %Y (%A)")
(setq org-journal-encrypt-journal t)
(setq org-journal-file-header "# -*- mode:org; epa-file-encrypt-to: (\"no@notreal.com\") -*-")
(add-hook 'org-journal-after-entry-create-hook 'normal-mode))
Evil
(use-package undo-tree
:ensure t
:diminish undo-tree-mode)
(use-package evil
:ensure t
:init
;; This messes with org mode <TAB>
;; Can live without this, but not without <TAB> in org
(setq evil-want-C-i-jump nil)
(setq evil-want-C-u-scroll t)
:config
(evil-mode 1))
(use-package evil-surround
:pin MELPA
:ensure t
:config
(global-evil-surround-mode 1))
;; evil's custom surrounds don't work for changes or deletions
;; embrase does the trick here.
(use-package embrace
:ensure t)
(use-package evil-embrace
:ensure t
:after (embrace)
:hook
(c++-mode . (lambda ()
(embrace-add-pair ?* "/* " " */")))
:config
(evil-embrace-enable-evil-surround-integration))
Avy for movement
(use-package avy
:ensure t
:bind
(("C-:" . 'avy-goto-char)
("C-;" . 'avy-goto-char-2)
("M-g g" . 'avy-goto-line)))
Company for autocompletion
(use-package company
:ensure t
;; diminish because it is enabled globally
:diminish company-mode
:config
(global-company-mode)
(setq company-idle-delay 0)
(setq company-minimum-prefix-length 1)
(define-key company-active-map (kbd "C-n") 'company-select-next)
(define-key company-active-map (kbd "C-p") 'company-select-previous))
Ivy + swiper + counsel
(use-package ivy
:pin MELPA
:ensure t
:diminish ivy-mode
:config
(ivy-mode 1)
(setq ivy-use-virtual-buffers t)
(setq ivy-wrap t)
(setq enable-recursive-minibuffers t)
(global-set-key (kbd "C-c C-r") 'ivy-resume))
(use-package swiper
:pin MELPA
:ensure t
:config
(global-set-key "\C-s" 'swiper))
;; TODO: read other features of counsel
(use-package counsel
:pin MELPA
:ensure t
:config
(global-set-key (kbd "C-x C-f") 'counsel-find-file)
(global-set-key (kbd "M-x") 'counsel-M-x))
(use-package smex
:ensure t)
C++ settings
Autocompletion with irony
Irony is super slow for compilation databases with huge number of files because it reads the whole json and tries to find the relevant one
(use-package company-irony
:disabled
:pin MELPA
:requires company
:ensure t
:config
(add-to-list 'company-backends 'company-irony))
(use-package irony
:disabled
:pin MELPA
:ensure t
:config
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
)
Projectile
(use-package projectile
:ensure t
:bind ("s-p" . projectile-command-map)
:config
(setq projectile-completion-system 'ivy)
(setq ivy-count-format "(%d/%d) ")
(projectile-global-mode +1))
Cquery
(use-package cquery
:if
(file-exists-p "/bin/cquery")
:bind
(:map c-mode-base-map
("M-." . xref-find-definitions)
("C-t h c" . cquery-call-hierarchy)
("C-t h i" . cquery-inheritance-hierarchy)
("C-t i" . lsp-ui-sideline-toggle-symbols-info)
("C-t h m" . cquery-member-hierarchy)
("C-t ." . lsp-ui-peek-find-definitions)
("C-t ?" . lsp-ui-peek-find-references))
:preface
(defun cquery//enable ()
(condition-case nil
(lsp-cquery-enable)
(user-error nil)))
:init
(use-package lsp-mode
:config
(setq
lsp-ui-sideline-show-code-actions nil
lsp-ui-sideline-show-hover nil
))
(use-package company-lsp
:config (add-to-list 'company-backends 'company-lsp))
(use-package lsp-ui
:init (add-hook 'lsp-mode-hook 'lsp-ui-mode))
(use-package ivy-xref
:init
(setq xref-show-xrefs-function #'ivy-xref-show-xrefs))
(add-hook 'c-mode-common-hook #'cquery//enable)
:config
(setq
cquery-executable "/bin/cquery"
cquery-extra-args '("--log-file=/tmp/cq.log")
cquery-cache-dir "~/local/.cquery_cached_index"
cquery-extra-init-params '(:completion (:detailedLabel t))
cquery-sem-highlight-method 'font-lock
company-transformers nil
company-lsp-async t
company-lsp-cache-candidates nil
xref-prompt-for-identifier '(not
xref-find-definitions
xref-find-definitions-other-window
xref-find-definitions-other-frame
xref-find-references)))
Local elisp files
Rtags
;; (setq rtags-file (expand-file-name "rtags.el" user-emacs-directory))
;; (when (file-exists-p rtags-file)
;; (load rtags-file))
Clang format
(setq clangformat-file (expand-file-name "clangformat.el" user-emacs-directory))
(when (file-exists-p clangformat-file)
(load clangformat-file))
Yet to figure out
- Try cquery
- Avy mode to move around
- Reliable autocompletion in C++ – Either make irony scale for large cdbs or fix rtags by learning how irony does it