aru777 / .emacs.d

Personal emacs setup

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

About

Personal emacs setup


Languages

Language:Emacs Lisp 91.9%Language:YASnippet 8.1%