Skip to content

Latest commit

 

History

History
1348 lines (1281 loc) · 45 KB

init.org

File metadata and controls

1348 lines (1281 loc) · 45 KB

Emacs configuration file

init.el template

;; This file replaces itself with the actual configuration at first run.

;; We can't tangle without org!
(require 'org)
;; Open the configuration
(find-file (concat user-emacs-directory "init.org"))
;; tangle it
(org-babel-tangle)
;; load it
(load-file (concat user-emacs-directory "init.el"))
;; finally byte-compile it
(byte-compile-file (concat user-emacs-directory "init.el"))

Package repositories

(require 'package)

(unless (assoc-default "melpa" package-archives)
  (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
  (add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t))

(package-initialize)

Use package

https://github.com/jwiegley/use-package/blob/master/README.md

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))
(eval-when-compile
  (require 'use-package))
(require 'bind-key)                ;; if you use any :bind variant

(setq use-package-always-ensure t)

;; Enable ensure-system-package keyword
(use-package use-package-ensure-system-package)
;; Auto-install missing system packages
(use-package system-packages)

General settings

Frame and font size

(add-to-list 'default-frame-alist '(height . 47))
(add-to-list 'default-frame-alist '(width . 110))
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
;; (set-fontset-font "fontset-default" '(#x1d4d0 . #x1d4e2) "Symbola")
;; Use DejaVu Sans Mono as a fallback in fontset-startup
;; before resorting to fontset-default.
(set-fontset-font "fontset-startup" nil "DejaVu Sans Mono" nil 'append)
(when (member "Meslo LG M for Powerline" (font-family-list))
  (set-frame-font "Meslo LG M for Powerline 13" t t))

Disable eye-candy

(scroll-bar-mode -1)
(tool-bar-mode -1)
(setq ring-bell-function 'ignore)
(setq inhibit-startup-screen t)
(fset 'yes-or-no-p 'y-or-n-p)

Disable weird 2. selection

(global-unset-key (kbd "<M-drag-mouse-1>"))   ; was mouse-set-secondary
(global-unset-key (kbd "<M-down-mouse-1>"))   ; was mouse-drag-secondary
(global-unset-key (kbd "<M-mouse-1>"))    ; was mouse-start-secondary
(global-unset-key (kbd "<M-mouse-2>"))    ; was mouse-yank-secondary
(global-unset-key (kbd "<M-mouse-3>"))    ; was mouse-secondary-save-then-kill

Time

(setq-default
 display-time 1
 display-time-24hr-format t
 display-time-day-and-date nil
 display-time-default-load-average nil
 battery−mode−line−format " [%L %p%% %dC]")
(display-time-mode)

Autosaves and Backup

(setq auto-save-file-name-transforms
      `((".*" ,temporary-file-directory t))
      save-place-file (concat user-emacs-directory "places")
      backup-directory-alist `(("." . ,(concat user-emacs-directory "backups"))))
(setq backup-by-copying t)
(setq delete-old-versions t
  kept-new-versions 6
  kept-old-versions 2
  version-control t)

Enable global clipboard

(setq
x-select-enable-clipboard t
x-select-enable-primary t)

Uniquify

Make all buffers have unique names

(require 'uniquify)
(setq uniquify-buffer-name-style 'forward)

Mode line

(line-number-mode t)
(column-number-mode t)
;(size-indication-mode t)

macOS specific settings

(setq mac-command-modifier 'meta)
(setq mac-option-modifier nil)
(setq locate-command "mdfind")
(setq ns-pop-up-frames nil)
;; Some mac-bindings interfere with Emacs bindings.
(when (boundp 'mac-pass-command-to-system)
(setq browse-url-browser-function 'browse-url-default-macosx-browser)
(setq mac-pass-command-to-system nil))

Scrolling

Preserve more lines

(setq next-screen-context-lines 8)

Misc

(global-set-key (kbd "C-x k") 'kill-this-buffer)
(global-set-key (kbd "C-x C-b") 'bury-buffer)

(set-language-environment "UTF-8")
(set-default-coding-systems 'utf-8)

(add-hook 'text-mode-hook 'flyspell-mode)
;;(add-hook 'prog-mode-hook 'flyspell-prog-mode)
(setq flyspell-issue-message-flag nil)


(setq tramp-default-method "ssh")
(setq explicit-shell-file-name "/bin/bash")

(setq-default indent-tabs-mode nil)

(setq-default fill-column 120)
(setq-default sentence-end-double-space nil)
(setq paragraph-start "\f\\|[ \t]*$\\|[ \t]*[-+*] ")

(add-to-list 'ignored-local-variables 'preview-scale-function)

(setq custom-safe-themes t)

(show-paren-mode)
(setq show-paren-style 'expression)

(setq recenter-positions '(middle top bottom))

(remove-hook 'text-mode-hook 'turn-on-auto-fill)
(add-hook 'mu4e-compose-mode-hook 'turn-off-auto-fill)
;;(setq browse-url-browser-function 'eww-browse-url)

Spelling

;; Set $DICPATH to "$HOME/Library/Spelling" for hunspell.
;; (setenv
;;   "DICPATH"
;;   (concat (getenv "HOME") "/Library/Spelling"))
;; Tell ispell-mode to use hunspell.
(setq ispell-local-dictionary-alist '(("dansk"
                                       "[[:alpha:]]"
                                       "[^[:alpha:]]"
                                       "[']"
                                       t
                                       ("-d" "da_DK"); Dictionary file name
                                       nil
                                       iso-8859-1)

                                      ("american"
                                       "[[:alpha:]]"
                                       "[^[:alpha:]]"
                                       "[']"
                                       t
                                       ("-d" "en_US") ; Dictionary file name
                                       nil
                                       iso-8859-1)))
(setq ispell-dictionary "american")
(setq
  ispell-program-name
  "/usr/local/bin/hunspell")

Comments

Add bullets to comment blocks

(setq paragraph-start "\f\\|[ \t]*$\\|[ \t]*[-+*] ")

Fix comment-dwim such that whole line is (un)commented when no region is active

(defun xah-comment-dwim ()
  "Like `comment-dwim', but toggle comment if cursor is not at end of line.

URL `http://ergoemacs.org/emacs/emacs_toggle_comment_by_line.html'
Version 2016-10-25"
  (interactive)
  (if (region-active-p)
      (comment-dwim nil)
    (let ((-lbp (line-beginning-position))
          (-lep (line-end-position)))
      (if (eq -lbp -lep)
          (progn
            (comment-dwim nil))
        (if (eq (point) -lep)
            (progn
              (comment-dwim nil))
          (progn
            (comment-or-uncomment-region -lbp -lep)
            (forward-line )))))))

(global-set-key (kbd "M-;") 'xah-comment-dwim)
(global-set-key (kbd "C-æ") 'xah-comment-dwim)

Hydra

(use-package hydra
  :bind*
  (
   ("C-M-k" . hydra-pause-resume)
   ("C-c C-h" . hydra-proof-general/body)
   ("C-x o" . hydra-window/body)
   ("C-c C-m" . hydra-multiple-cursors/body)
   ("C-c T" . hydra-toggle-simple/body)
   ;; ("C-x SPC" . hydra-rectangle/body)
   ("C-c h" . hydra-apropos/body)
   :map Buffer-menu-mode-map
   ("h" . hydra-buffer-menu/body)
   :map org-mode-map
   )
  :config
  (defhydra hydra-zoom (global-map "<f2>")
    "zoom"
    ("g" text-scale-increase "in")
    ("l" text-scale-decrease "out"))
  ;; (require 'hydra-examples)
  (defhydra hydra-toggle-simple (:color blue)
    "toggle"
    ("a" abbrev-mode "abbrev")
    ("d" toggle-debug-on-error "debug")
    ("f" auto-fill-mode "fill")
    ("t" toggle-truncate-lines "truncate")
    ("w" whitespace-mode "whitespace")
    ("q" nil "cancel"))
  (defhydra hydra-window (:color red
                                 :hint nil)
    "
 Split: _v_ert _x_:horz
Delete: _o_nly  _da_ce  _dw_indow  _db_uffer  _df_rame
  Move: _s_wap
Frames: _f_rame new  _df_ delete
  Misc: _m_ark _a_ce  _u_ndo  _r_edo"
    ("h" windmove-left)
    ("j" windmove-down)
    ("k" windmove-up)
    ("l" windmove-right)
    ("H" hydra-move-splitter-left)
    ("J" hydra-move-splitter-down)
    ("K" hydra-move-splitter-up)
    ("L" hydra-move-splitter-right)
    ("|" (lambda ()
           (interactive)
           (split-window-right)
           (windmove-right)))
    ("_" (lambda ()
           (interactive)
           (split-window-below)
           (windmove-down)))
    ("v" split-window-right)
    ("x" split-window-below)
                                        ;("t" transpose-frame "'")
    ;; winner-mode must be enabled
    ("u" winner-undo)
    ("r" winner-redo) ;;Fixme, not working?
    ("o" delete-other-windows :exit t)
    ("a" ace-window :exit t)
    ("f" new-frame :exit t)
    ("s" ace-swap-window)
    ("da" ace-delete-window)
    ("dw" delete-window)
    ("db" kill-this-buffer)
    ("df" delete-frame :exit t)
    ("q" nil)
                                        ;("i" ace-maximize-window "ace-one" :color blue)
                                        ;("b" ido-switch-buffer "buf")
    ("m" headlong-bookmark-jump))
  (require 'multiple-cursors)

  (defhydra hydra-multiple-cursors (:hint nil)
    "
 Up^^             Down^^           Miscellaneous           % 2(mc/num-cursors) cursor%s(if (> (mc/num-cursors) 1) \"s\" \"\")
------------------------------------------------------------------
 [_p_]   Next     [_n_]   Next     [_l_] Edit lines  [_0_] Insert numbers
 [_P_]   Skip     [_N_]   Skip     [_a_] Mark all    [_A_] Insert letters
 [_M-p_] Unmark   [_M-n_] Unmark   [_s_] Search
 [Click] Cursor at point       [_q_] Quit"
    ("l" mc/edit-lines :exit t)
    ("a" mc/mark-all-like-this :exit t)
    ("n" mc/mark-next-like-this)
    ("N" mc/skip-to-next-like-this)
    ("M-n" mc/unmark-next-like-this)
    ("p" mc/mark-previous-like-this)
    ("P" mc/skip-to-previous-like-this)
    ("M-p" mc/unmark-previous-like-this)
    ("s" mc/mark-all-in-region-regexp :exit t)
    ("0" mc/insert-numbers :exit t)
    ("A" mc/insert-letters :exit t)
    ("<mouse-1>" mc/add-cursor-on-click)
    ;; Help with click recognition in this hydra
    ("<down-mouse-1>" ignore)
    ("<drag-mouse-1>" ignore)
    ("q" nil))
  )

Org

(use-package org
  :diminish visual-line-mode org-cdlatex-mode org-indent-mode
  :ensure org-plus-contrib
  :mode (("\\.\\(org\\|org_archive\\|txt\\)$" . org-mode))
  :bind* (
         ("C-c l" . org-store-link)
         ("C-c c" . org-capture)
         ("C-c a" . org-agenda)
         ("C-c b" . org-iswitchb)
         ("C-'"   . org-cycle-agenda-files)
         :map org-mode-map
         ("<f8>" . org-toggle-latex-fragment)
         ("C-M-o" . ace-link-org)
         )
  :config
  ;;  (add-hook 'org-mode-hook 'worf-mode)
  (add-to-list 'org-speed-commands-user '("a" . org-attach))
  (require 'org-tempo)
  (load (concat user-emacs-directory "ob-troupe.el"))
  (require 'ob-troupe)
  (setq org-use-speed-commands t)
  (add-hook 'org-mode-hook 'visual-line-mode)
  (add-hook 'org-mode-hook 'add-pcomplete-to-capf)
  (plist-put org-format-latex-options :scale 1.6)
  (setq org-fontify-whole-heading-line t)
  (setq org-hide-leading-stars t)
  (setq org-src-fontify-natively t)
  (setq org-src-preserve-indentation t)
  (org-babel-do-load-languages
   'org-babel-load-languages
   '((calc . t)
     (dot . t)
     (ditaa . t)
     ;; (sh . t)
     (shell . t)
     (troupe . t)
     (latex . t)))
  (add-to-list 'org-src-lang-modes '("troupe" . "sml"))
  (add-to-list 'org-src-lang-modes '("dot" . graphviz-dot))
   )

Crux

(use-package crux
  :bind*  (("C-c o"  . crux-open-with)
           ;; ("C-c e"   . crux-eval-and-replace)
           ("C-c t"   . eshell)
           ("C-^"     . crux-top-join-line)
           ("C-c d"   . crux-duplicate-current-line-or-region)
           ("C-a"     . crux-move-beginning-of-line))
  :bind (
         ("M-O"    . crux-smart-open-line-above)
         ("M-o"    . crux-smart-open-line)
         )
  :config
  (setq pcomplete-ignore-case t))

Undo tree

(use-package undo-tree
  :diminish undo-tree-mode
  :bind (("C-x u" . undo-tree-visualize)
         ("C--" . undo))
  :config
  (global-undo-tree-mode))

Autorevert

(use-package autorevert
  :diminish auto-revert-mode
  :config
  (global-auto-revert-mode 1))

Discover my major

(use-package discover-my-major
  :bind ("C-h C-m" . discover-my-major))

Popwin

(use-package popwin
  :config
  (global-set-key (kbd "C-z") popwin:keymap)
  (setq popwin:special-display-config
        '((completion-list-mode :noselect t)
          (compilation-mode :noselect t)
          (grep-mode :noselect t)
          (occur-mode :noselect t)
          ("*Swoop*" :height 0.5 :position bottom)
          ("\*.* output\*" :regexp t :height 0.5 :noselect t :position bottom)
          ("*Warnings*" :height 0.5 :noselect t)
          ("*TeX Help*" :height 0.5 :noselect t)
          ("*ENSIME Welcome*" :height 0.5 :noselect t)
          ("\*sbt\*" :regexp t :height 0.2 :position bottom)
          ("*Procces List*" :height 0.5)
          ("*Python Doc*" :height 0.5 :noselect t)
          ("*Messages*" :height 0.5 :noselect t)
          ("*Help*" :height 0.5 :noselect nil)
          ("*Backtrace*" :height 0.5)
          ("*Compile-Log*" :height 0.5 :noselect t)
          ("*Remember*" :height 0.5)
          ("*ansi-term*" :height 0.5 :position top)
          ("*All*" :height 0.5)
          ("*Go Test*" :height 0.3)
          ("*undo-tree*" :width 0.3 :position right)
          ("*Slack -" :regexp t :height 0.5 :position bottom)
          (flycheck-error-list-mode :height 0.5 :regexp t :position bottom)))
  (popwin-mode t))

Magit

(use-package magit
  :bind (("C-x g" . magit-status)))

Diff hightlight

(use-package diff-hl
  :config
  (add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh)
  (global-diff-hl-mode))

Execute path from shell

(use-package exec-path-from-shell
  :config
  (exec-path-from-shell-initialize)
  (setq exec-path-from-shell-check-startup-files nil)
  (exec-path-from-shell-copy-envs '("GPG_AGENT_INFO" "LC_ALL" "LC_CTYPE" "SSH_AUTH_SOCK")))

OPAM

(use-package opam
  :config
  (opam-init))

Smex

(use-package smex)

Company mode

(use-package company
  :diminish company-mode
  :init
  ;; https://github.com/company-mode/company-mode/issues/50#issuecomment-33338334
  (defun add-pcomplete-to-capf ()
    (add-hook 'completion-at-point-functions 'pcomplete-completions-at-point nil t))
  :bind*
  (("C-M-i" . company-complete)
   :map company-active-map
   ("C-n" . company-select-next)
   ("C-p" . company-select-previous))
  :config
  (setq company-idle-delay 0.2)
  (setq company-minimum-prefix-length 4)
  (global-company-mode))

Expand region

(use-package expand-region
  :bind
  ("M-e" . er/expand-region))

Multiple cursors

(use-package multiple-cursors
  :bind
  (("C->" . mc/mark-next-like-this)
   ("C-<" . mc/mark-previous-like-this)
   ("C-c C-<" . mc/mark-all-like-this)
   ("M-<mouse-1>" . mc/add-cursor-on-click))
  :config)

Smart-parens

(use-package smartparens-config
    :diminish smartparens-mode
    :ensure smartparens
    :config (show-smartparens-global-mode t)
    :hook ((prog-mode markdown-mode org-mode LaTeX-mode) . turn-on-smartparens-mode))

Which key

(use-package which-key
  :diminish which-key-mode
  :config
  (which-key-mode)
  (which-key-setup-minibuffer)
  ;; (which-key-setup-side-window-right-bottom)
  (setq which-key-idle-delay 1)
  (setq which-key-special-keys nil))

Avy

Avy Base

(use-package avy
  :bind* (("C-,"     . avy-pop-mark)
          ("M-j"     . avy-goto-char)
          ("M-k"     . avy-goto-word-1)
          ("M-g n"   . avy-resume)
          ("M-g w"   . avy-goto-word-1)
          ("M-g f"   . avy-goto-line)
          ("M-g l c" . avy-copy-line)
          ("M-g l m" . avy-move-line)
          ("M-g r c" . avy-copy-region)
          ("M-g r m" . avy-move-region)
          ("M-g p"   . avy-goto-paren)
          ("M-g c"   . avy-goto-conditional)
          ("M-g M-g" . avy-goto-line))
  :config
  (defun avy-goto-paren ()
    (interactive)
    (avy--generic-jump "\\s(" nil 'pre))
  (defun avy-goto-conditional ()
    (interactive)
    (avy--generic-jump "\\s(\\(if\\|cond\\|when\\|unless\\)\\b" nil 'pre))
  (setq avy-timeout-seconds 0.3)
  (setq avy-all-windows 'all-frames)
  ;; (defun avy-action-copy-and-yank (pt)
  ;;   "Copy and yank sexp starting on PT."
  ;;   (avy-action-copy pt)
  ;;   (yank))
  ;; (defun avy-action-kill-and-yank (pt)
  ;;   "Kill and yank sexp starting on PT."
  ;;   (avy-action-kill-stay pt)
  ;;   (yank))
  ;; (setq avy-dispatch-alist
  ;;       '((?w . avy-action-copy)
  ;;         (?k . avy-action-kill-move)
  ;;         (?K . avy-action-kill-stay)
  ;;         (?m . avy-action-mark)
  ;;         (?n . avy-action-copy)
  ;;         (?y . avy-action-copy-and-yank)
  ;;         (?Y . avy-action-kill-and-yank)))
  ;; (setq avy-keys
  ;;       '(?c ?a ?s ?d ?e ?f ?h ?w ?y ?j ?k ?l ?n ?m ?v ?r ?u ?p))
  )

Link hint

(use-package link-hint
  :bind*
  ("M-g l o" . link-hint-open-link)
  ("M-g l w" . link-hint-copy-link))

Ace popup menu

(use-package ace-popup-menu
  :config
  (ace-popup-menu-mode 1))

Ace window

(use-package ace-window
  :bind* ("C-o" . ace-window)
  :config
  (setq aw-keys '(?a ?s ?d ?f ?g ?j ?k ?l))
  (setq aw-scope 'global)
  (defun aw-switch-buffer (window)
    "Swift buffer in WINDOW."
    (select-window window)
    (ivy-switch-buffer))
  (setq aw-dispatch-alist
     '((?x aw-delete-window " Ace - Delete Window")
       (?m aw-swap-window " Ace - Swap Window")
       (?n aw-flip-window)
       (?c aw-split-window-fair " Ace - Split Fair Window")
       (?v aw-split-window-vert " Ace - Split Vert Window")
       (?h aw-split-window-horz " Ace - Split Horz Window")
       (?i delete-other-windows " Ace - Maximize Window")
       (?b aw-switch-buffer " Ace - Switch Buffer")
       (?o delete-other-windows))))

Visual regexp steroids

(use-package visual-regexp
  :bind
  (("C-c r" . vr/replace)
   ("C-c q" . vr/query-replace)
   ;; if you use multiple-cursors, this is for you:
   ("C-c e" . vr/mc-mark))
   :config
   (use-package visual-regexp-steroids))

Latex

Auctex package

(use-package tex
  :ensure auctex
  :diminish reftex-mode
  :mode ("\\.tex\\'" . latex-mode)
  :bind
  (:map TeX-mode-map
        ("M-q" . ales/fill-paragraph))
  :config
  (setq TeX-auto-save t)
  (setq TeX-parse-self t)
  (setq TeX-save-query nil)
  ;; (add-hook 'LaTeX-mode-hook 'visual-line-mode) ;; makes swiper super slow
  (add-hook 'LaTeX-mode-hook 'flyspell-mode)
  (setq LaTeX-math-abbrev-prefix "~")
  (add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)
  (add-hook 'LaTeX-mode-hook 'turn-on-reftex)
  (define-auto-insert "\\.tex$" "latex-template.tex")
  (setq reftex-plug-into-AUCTeX t)
  (setq preview-scale-function 1)
  (setq reftex-ref-macro-prompt nil)
  (setq TeX-PDF-mode t)

  (add-hook
   'LaTeX-mode-hook
   (lambda ()
     (TeX-auto-add-type "theorem" "mg-LaTeX")
     ;; Self Parsing -- see (info "(auctex)Hacking the Parser").
     (defvar mg-LaTeX-theorem-regexp
       (concat "\\\\newtheorem{\\(" TeX-token-char "+\\)}")
       "Matches new theorems.")
     (defvar mg-LaTeX-auto-theorem nil
       "Temporary for parsing theorems.")
     (defun mg-LaTeX-theorem-prepare ()
       "Clear `mg-LaTex-auto-theorem' before use."
       (setq mg-LaTeX-auto-theorem nil))
     (defun mg-LaTeX-theorem-cleanup ()
       "Move theorems from `mg-LaTeX-auto-theorem' to `mg-LaTeX-theorem-list'.
      Add theorem to the environment list with an optional argument."
       (mapcar (lambda (theorem)
                 (add-to-list 'mg-LaTeX-theorem-list (list theorem))
                 (LaTeX-add-environments
                  `(,theorem ["Name"])))
               mg-LaTeX-auto-theorem))
     ;; FIXME: This does not seem to work unless one does a manual reparse.
     (add-hook 'TeX-auto-prepare-hook 'mg-LaTeX-theorem-prepare)
     (add-hook 'TeX-auto-cleanup-hook 'mg-LaTeX-theorem-cleanup)
     (TeX-auto-add-regexp `(,mg-LaTeX-theorem-regexp 1 mg-LaTeX-auto-theorem))))
  (add-hook 'TeX-language-dk-hook
            (lambda () (ispell-change-dictionary "dansk")))

  ;; Use Skim as viewer, enable source <-> PDF sync
  ;; make latexmk available via C-c C-c
  ;; Note: SyncTeX is setup via ~/.latexmkrc (see below)
  (add-to-list 'TeX-command-list '("latexmk" "latexmk -pdf %s" TeX-run-TeX nil t
                                   :help "Run latexmk on file"))
  (add-to-list 'TeX-command-list '("make" "make" TeX-run-TeX nil t
                                   :help "Runs make"))
  (add-hook 'TeX-mode-hook '(lambda () (setq TeX-command-default "latexmk")))
  (add-hook 'TeX-mode-hook '(lambda () (setq company-minimum-prefix-length 2)))

  (defun ales/fill-paragraph (&optional P)
    "When called with prefix argument call `fill-paragraph'.
       Otherwise split the current paragraph into one sentence per line."
    (interactive "P")
    (if (not P)
        (save-excursion
          (let ((fill-column 12345678)) ;; relies on dynamic binding
            (fill-paragraph) ;; this will not work correctly if the paragraph is
            ;; longer than 12345678 characters (in which case the
            ;; file must be at least 12MB long. This is unlikely.)
            (let ((end (save-excursion
                         (forward-paragraph 1)
                         (backward-sentence)
                         (point-marker))))  ;; remember where to stop
              (beginning-of-line)
              (while (progn (forward-sentence)
                            (<= (point) (marker-position end)))
                (just-one-space) ;; leaves only one space, point is after it
                (delete-char -1) ;; delete the space
                (newline)        ;; and insert a newline
                (LaTeX-indent-line) ;; TODO: fix-this
                ))))
      ;; otherwise do ordinary fill paragraph
      (fill-paragraph P)))

  ;; use Skim as default pdf viewer
  ;; Skim's displayline is used for forward search (from .tex to .pdf)
  ;; option -b highlights the current line; option -g opens Skim in the background
  (setq TeX-view-program-selection '((output-pdf "PDF Viewer")))
  (setq TeX-view-program-list
        '(("PDF Viewer" "/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")))
  (setq TeX-source-correlate-method 'synctex
        TeX-source-correlate-mode t
        TeX-source-correlate-start-server t))

Cdlatex

;; (use-package cdlatex
;;   :hooks LaTeX-mode
;;   :config
;;   (add-to-list 'cdlatex-math-modify-alist
;;              '(?B "\\mathbb" nil t nil nil))
;;   (setq cdlatex-env-alist
;;       '(("tikz-cd" "\\begin{tikz-cd}\n?\n\end{tikz-cd}\n" "\\\\?")
;;         ("tikz" "\\begin{tikz-cd}\n?\n\end{tikz}\n" "\\\\?")))
;;   (add-hook 'LaTeX-mode-hook 'turn-on-cdlatex)   ; with AUCTeX LaTeX mode
;;   (setq cdlatex-command-alist
;;         '(("ww" "Insert \\text{}" "\\text{?}" cdlatex-position-cursor nil nil t)
;;           ("bb" "Insert \\mathbb{}" "\\mathbb{?}" cdlatex-position-cursor nil nil t)
;;           ("lm" "Insert \\lim_{}" "\\lim_{?}" cdlatex-position-cursor nil nil t)
;;           ("dm" "Insert display math equation" "\\[\n?\n\\]" cdlatex-position-cursor nil t nil)
;;           ("equ*" "Insert equation* environment" "\\begin{equation*}\n?\n\\end{equation*}" cdlatex-position-cursor nil t nil)))
;;   )

Preview Pane

;; (use-package latex-preview-pane
;;   :hook (LaTeX-mode . latex-preview-pane-mode))

Recentf

(use-package recentf
  :config
  (setq recentf-exclude '("COMMIT_MSG" "COMMIT_EDITMSG" "github.*txt$"
                          ".*png$" ".*cache$"))
  (setq recentf-max-saved-items 50))

Projectile

(use-package projectile
  :bind-keymap
  ("C-c p" . projectile-command-map)
  :config
  (setq projectile-mode-line
        '(:eval (if (projectile-project-p)
                    (format " [%s]"
                            (projectile-project-name))
                  "")))
  (projectile-mode)
  )

Ivy + Swiper + Counsel

Ivy Base

(use-package ivy
  :demand
  :diminish ivy-mode
  :ensure t
  :init
  (unbind-key "M-i")
  :bind*
  (( "C-r" . ivy-resume)
   ( "C-c v" . ivy-push-view)
   ( "C-c V" . ivy-pop-view)
   :map ivy-minibuffer-map
   ("M-y" . ivy-next-line)
   ("<return>" . ivy-alt-done)
   ("C-M-h" . ivy-previous-line-and-call)
   ("C-:" . ivy-dired)
   ("C-c o" . ivy-occur)
   ("M-o" . ivy-dispatching-done)
   ("C-M-o" . ivy-dispatching-call)
   )
  :config
  (ivy-mode 1)
  (setq ivy-use-virtual-buffers t)
  (setq ivy-height 12)
  (setq ivy-count-format "%d/%d | ")
  (setq ivy-extra-directories nil)
  (setq ivy-display-style 'fancy)
  (setq magit-completing-read-function 'ivy-completing-read)
  (setq projectile-completion-system 'ivy)
  ;; (setq ivy-switch-buffer-faces-alist
  ;;       '((emacs-lisp-mode . swiper-match-face-1)
  ;;         (dired-mode . ivy-subdir)
  ;;         (org-mode . org-level-5)))

  (defun ora-insert (x)
    (insert
     (if (stringp x)
         x
       (car x))))

  (defun ora-kill-new (x)
    (kill-new
     (if (stringp x)
         x
       (car x))))

  (ivy-set-actions
   t
   '(("i" ora-insert "insert")
     ("w" ora-kill-new "copy"))))

Swiper

(use-package swiper
  :demand
  :config
  )

Counsel

(use-package counsel
  ;;:ensure-system-package (rg . ripgrep)
  :demand
  :bind
  (( "C-s" . counsel-grep-or-swiper)
   ;; ( "C-c c" . counsel-org-capture)
   ( "M-g g" . counsel-rg)
   ( "M-i" . counsel-imenu)
   ( "M-x" . counsel-M-x)
   ( "C-x C-f" . counsel-find-file)
   ( "<f1> f" . counsel-describe-function)
   ( "<f1> v" . counsel-describe-variable)
   ( "<f1> l" . counsel-load-library)
   ( "<f2> i" . counsel-info-lookup-symbol)
   ( "<f2> u" . counsel-unicode-char)
   ( "C-h b" . counsel-descbinds)
   ( "C-c g" . counsel-git)
   ( "C-c k" . counsel-ag)
   ( "C-x l" . locate-counsel)
   ( "C-c g" . counsel-git)
   ( "C-c j" . counsel-git-grep)
   ("M-y" . counsel-yank-pop)
   :map ivy-minibuffer-map
   ("M-y" . ivy-next-line)
   )
  :config
  (setq imenu-auto-rescan t)
  (advice-add 'counsel-grep-or-swiper :before 'avy-push-mark)
  (advice-add 'counsel-rg :before (lambda (&rest _) (xref-push-marker-stack)))
  (setq counsel-locate-cmd 'counsel-locate-cmd-mdfind)
  (setq counsel-find-file-ignore-regexp "\\.|\\.DS_Store")
  (defun ivy-copy-to-buffer-action (x)
    (with-ivy-window
      (insert x)))
  (ivy-set-actions 'counsel-imenu
                   '(("I" ivy-copy-to-buffer-action "insert"))))

Flyspell Correct Ivy

(use-package flyspell-correct-ivy
  :bind ("C-M-;" . flyspell-correct-wrapper)
  :init
  (setq flyspell-correct-interface #'flyspell-correct-ivy))

Ivy hydra

(use-package ivy-hydra)

wgrep

(use-package wgrep)

Presentation Mode

(use-package presentation)

Symbol overlay

(use-package symbol-overlay
  :commands (symbol-overlay-mode)

  :bind (("M-p"      . symbol-overlay-jump-prev)
         ("M-p"      . symbol-overlay-jump-next)
         ("M-<up>"   . symbol-overlay-jump-prev)
         ("M-<down>" . symbol-overlay-jump-next)
         ("M-g o"    . symbol-overlay-hydra/body))

  :hook ((prog-mode . symbol-overlay-mode))

  :config

  (defhydra symbol-overlay-hydra (:color pink :hint nil :timeout 5)
    "
  _p_   ^^   _b_  back         _h_  highlight  _i_  isearch
_<_   _>_    _d_  definition   _R_  remove     _Q_  query-replace
  _n_   ^^   _w_  save         ^^              _r_  rename
"
    ("<"      symbol-overlay-jump-first)
    (">"      symbol-overlay-jump-last)
    ("p"      symbol-overlay-jump-prev)
    ("n"      symbol-overlay-jump-next)

    ("d"      symbol-overlay-jump-to-definition)
    ("b"      symbol-overlay-echo-mark)

    ("h" symbol-overlay-put :color blue)
    ("R" symbol-overlay-remove-all :color blue)

    ("w" symbol-overlay-save-symbol :color blue)
    ("t" symbol-overlay-toggle-in-scope)

    ("i" symbol-overlay-isearch-literally :color blue)
    ("Q" symbol-overlay-query-replace :color blue)
    ("r" symbol-overlay-rename  :color blue)
    ("q" nil)
    )
  )

Moe theme

(use-package moe-theme
  :config
  (setq moe-theme-resize-markdown-title '(2.0 1.7 1.5 1.3 1.0 1.0))
  (setq moe-theme-resize-org-title '(1.4 1.2 1.1 1.0 1.0 1.0 1.0 1.0 1.0))
  (setq moe-theme-resize-rst-title '(2.0 1.7 1.5 1.3 1.1 1.0))
  (moe-light))

Solarized theme

(use-package solarized-theme
  :config
  ;; make the fringe stand out from the background
  ;; (setq solarized-distinct-fringe-background t)

  ;; Don't change the font for some headings and titles
  (setq solarized-use-variable-pitch nil)

  ;; make the modeline high contrast
  (setq solarized-high-contrast-mode-line t)

  ;; Use less bolding
  ;; (setq solarized-use-less-bold t)

  ;; Use more italics
  ;; (setq solarized-use-more-italic t)

  ;; Use less colors for indicators such as git:gutter, flycheck and similar
  ;; (setq solarized-emphasize-indicators nil)

  ;; Don't change size of org-mode headlines (but keep other size-changes)
  ;; (setq solarized-scale-org-headlines nil)

  ;; Avoid all font-size changes
  ;; (setq solarized-height-minus-1 1.0)
  ;; (setq solarized-height-plus-1 1.0)
  ;; (setq solarized-height-plus-2 1.0)
  ;; (setq solarized-height-plus-3 1.0)
  ;; (setq solarized-height-plus-4 1.0)
  ;; (load-theme 'solarized-light t)
)

Iterm

(defun get-file-dir-or-home ()
  "If inside a file buffer, return the directory, else return home"
  (interactive)
  (let ((filename (buffer-file-name)))
    (if (not (and filename (file-exists-p filename)))
	"~/"
      (file-name-directory filename))))
(defun iterm-goto-filedir-or-home ()
  "Go to present working dir and focus iterm"
  (interactive)
  (do-applescript
   (concat
    " tell application \"iTerm2\"\n"
    "   tell the current session of current window\n"
    (format "     write text \"cd %s\" \n"
            ;; string escaping madness for applescript
            (replace-regexp-in-string "\\\\" "\\\\\\\\"
                                      (shell-quote-argument (or default-directory "~"))))
    "   end tell\n"
    " end tell\n"
    " do shell script \"open -a iTerm\"\n"
    ))
  )
(defun iterm-focus ()
  (interactive)
  (do-applescript
   " do shell script \"open -a iTerm\"\n"
   ))

Languages

ML

(use-package sml-mode
  :mode ("\\.sml\\'" "\\.pico\\'" "\\.picox\\'" "\\.femto\\'" "\\.atto\\'" "\\.trp\\'")
  :interpreter "sml")

Ocaml

(use-package tuareg
  :config
  (let ((opam-share (ignore-errors (car (process-lines "opam" "config" "var" "share")))))
    (when (and opam-share (file-directory-p opam-share))
      ;; Register Merlin
      (add-to-list 'load-path (expand-file-name "emacs/site-lisp" opam-share))
      (autoload 'merlin-mode "merlin" nil t nil)
      ;; Automatically start it in OCaml buffers
      (add-hook 'tuareg-mode-hook 'merlin-mode t)
      (add-hook 'caml-mode-hook 'merlin-mode t)
      ;; Use opam switch to lookup ocamlmerlin binary
      (setq merlin-command 'opam)))

  ;; (dolist
  ;;     (var (car (read-from-string
  ;;           (shell-command-to-string "opam config env --sexp"))))
  ;;   (setenv (car var) (cadr var)))
  ;; Update the emacs path
  ;; (setq exec-path (split-string (getenv "PATH") path-separator))
  ;; Update the emacs load path
  ;; (push (concat (getenv "OCAML_TOPLEVEL_PATH")
  ;;          "/../../share/emacs/site-lisp") load-path)
  ;; Automatically load utop.el
  ;; Add the opam lisp dir to the emacs load path
  (add-to-list
   'load-path
   (replace-regexp-in-string
    "\n" "/share/emacs/site-lisp"
    (shell-command-to-string "opam config var prefix")))

  ;; Automatically load utop.el
  (autoload 'utop "utop" "Toplevel for OCaml" t)
  (autoload 'utop-minor-mode "utop" "Minor mode for utop" t)
  (add-hook 'tuareg-mode-hook 'utop-minor-mode)
  )
(require 'opam-user-setup "~/.emacs.d/opam-user-setup.el")
(use-package reason-mode
  :config
  ;;----------------------------------------------------------------------------
  ;; Reason setup
  ;;----------------------------------------------------------------------------

  (defun shell-cmd (cmd)
    "Returns the stdout output of a shell command or nil if the command returned
   an error"
    (car (ignore-errors (apply 'process-lines (split-string cmd)))))

  (defun reason-cmd-where (cmd)
    (let ((where (shell-cmd cmd)))
      (if (not (string-equal "unknown flag ----where" where))
          where)))

  (let* ((refmt-bin (or (reason-cmd-where "refmt ----where")
                        (shell-cmd "which refmt")
                        (shell-cmd "which bsrefmt")))
         (merlin-bin (or (reason-cmd-where "ocamlmerlin ----where")
                         (shell-cmd "which ocamlmerlin")))
         (merlin-base-dir (when merlin-bin
                            (replace-regexp-in-string "bin/ocamlmerlin$" "" merlin-bin))))
    ;; Add merlin.el to the emacs load path and tell emacs where to find ocamlmerlin
    (when merlin-bin
      (add-to-list 'load-path (concat merlin-base-dir "share/emacs/site-lisp/"))
      (setq merlin-command merlin-bin))

    (when refmt-bin
      (setq refmt-command refmt-bin)))

  (require 'reason-mode)
  (require 'merlin)
  (add-hook 'reason-mode-hook (lambda ()
                                (add-hook 'before-save-hook 'refmt-before-save)
                                (merlin-mode)))

  (setq merlin-ac-setup t)
  )

Elixir

(use-package alchemist)

Scheme

(setq scheme-program-name "petite")
(defun scheme-send-buffer-and-go ()
  "Send entire content of the buffer to the Inferior Scheme process\
   and goto the Inferior Scheme buffer."
  (interactive)
  (scheme-send-region-and-go (point-min) (point-max)))
;; Configuration run when scheme-mode is loaded
(add-hook 'scheme-mode-hook
          (lambda ()
            ;; indent with spaces
            (setq indent-tabs-mode nil)
            (setq-local comment-start ";;; ")
            ;; Danvy-style key bindings
            (local-set-key (kbd "C-c d")   'scheme-send-definition-and-go)
            (local-set-key (kbd "C-c C-b") 'scheme-send-buffer-and-go)
            ;; fix indentation of some special forms
            (put 'cond   'scheme-indent-hook 0)
            (put 'guard  'scheme-indent-hook 1)
            (put 'when   'scheme-indent-hook 1)
            (put 'unless 'scheme-indent-hook 1)
            ;; special forms from Petite Chez Scheme
            (put 'trace-lambda  'scheme-indent-hook 2)
            (put 'extend-syntax 'scheme-indent-hook 1)
            (put 'with          'scheme-indent-hook 0)
            (put 'parameterize  'scheme-indent-hook 0)
            (put 'define-syntax 'scheme-indent-hook 1)
            (put 'syntax-case   'scheme-indent-hook 0)
            ;; special forms for Schelog
            (put '%rel   'scheme-indent-hook 1)
            (put '%which 'scheme-indent-hook 1)
            ))

;; (defun my-pretty-lambda ()
;;   "make some word or string show as pretty Unicode symbols"
;;   (setq prettify-symbols-alist
;;         '(
;;           ("lambda" . 955) ; λ
;;           ))
;;   (prettify-symbols-mode 1))
;; (add-hook 'scheme-mode-hook 'my-pretty-lambda)

(add-hook 'inferior-scheme-mode-hook
          (lambda ()
            ;; Overwrite the standard 'switch-to-buffer' to use
            ;; 'switch-to-buffer-other-window'
            (defun switch-to-scheme (eob-p)
              "Switch to the scheme process buffer.
     With argument, position cursor at end of buffer."
              (interactive "P")
              (if (or (and scheme-buffer (get-buffer scheme-buffer))
                      (scheme-interactively-start-process))
                  (switch-to-buffer-other-window scheme-buffer)
                (error "No current process buffer.  See variable `scheme-buffer'"))
              (when eob-p
                (push-mark)
                (goto-char (point-max))))))

(setq auto-mode-alist
      (append '(("\\.ss$" . scheme-mode)
                ("\\.scm$" . scheme-mode)
                ("\\.sim$" . scheme-mode))
              auto-mode-alist))
(setenv "TEXINPUTS" (concat "~/.latex/scheme-listings/:" (getenv "TEXINPUTS")))

Proof general

(use-package proof-general
  :defines proof-mode
  :mode ("\\.v\\'" . coq-mode)
  :bind (
         :map coq-mode-map
         ("C-c C-." . 'proof-goto-point)
         ("C-.".  proof-goto-point)
         ("C-c .".  proof-goto-end-of-locked)
         ("M-n".  proof-assert-next-command-interactive)
         )
  :init
   (eval-after-load "proof-script"
   '(progn
      (define-key proof-mode-map (kbd "C-c C-.") 'proof-goto-point)
      (define-key proof-mode-map (kbd "C-.") 'proof-goto-point)
      (define-key proof-mode-map (kbd "C-c .") 'proof-goto-end-of-locked)
      (define-key proof-mode-map (kbd "M-n") 'proof-assert-next-command-interactive)
      (setq proof-three-window-mode-policy 'hybrid)
      (setq proof-script-fly-past-comments t)))

  ;; (with-eval-after-load 'coq
  ;;   (setq coq-compile-before-require nil)
  ;;   ;; Small convenience for commonly written commands.
  ;;   (define-key coq-mode-map "\C-c\C-m" "\nend\t")
  ;;   (define-key coq-mode-map "\C-c\C-e"
  ;;     'endless/qed)
  ;;   (defun endless/qed ()
  ;;     (interactive)
  ;;     ;; (unless (memq (char-before) '(?\s ?\n ?\r))
  ;;     ;;   (insert " "))
  ;;     (insert "Qed.")
  ;;     (proof-assert-next-command-interactive)))
  ;; (define-abbrev-table 'coq-mode-abbrev-table '())
  ;;(define-abbrev coq-mode-abbrev-table "re" "reflexivity.")
  ;;(define-abbrev coq-mode-abbrev-table "id" "induction")
  ;;(define-abbrev coq-mode-abbrev-table "si" "simpl.")
  ;;(advice-add 'proof-assert-next-command-interactive
  ;;            :before #'expand-abbrev)
  ;;(defun open-after-coq-command ()
  ;;  (when (looking-at-p " *(\\*")
  ;;    (open-line 1)))
  ;;(advice-add 'proof-assert-next-command-interactive
  ;;            :after #'open-after-coq-command)
  )

Company Coq

(use-package company-coq
  :init
  (setq company-coq-live-on-the-edge t) 
  :hook (coq-mode . company-coq-mode))

Scala

(use-package ensime
  :config
  (setq ensime-startup-notification nil)
  (defun tarao/ensime-sbt-ansi-color-workaround (&rest args)
    "https://github.com/ensime/emacs-sbt-mode/issues/150"
    (with-current-buffer (sbt:buffer-name)
      (remove-hook 'comint-output-filter-functions 'ensime-inf-postoutput-filter)
      (add-hook 'comint-output-filter-functions 'ensime-inf-postoutput-filter t)))
  (advice-add 'ensime-sbt :after #'tarao/ensime-sbt-ansi-color-workaround))
  (use-package scala-mode
    :interpreter
    ("scala" . scala-mode))

Haskell

(use-package haskell-mode
  :mode "\\.hs\\'"
  :config
  (let ((my-cabal-path (expand-file-name "~/.cabal/bin")))
    (setenv "PATH" (concat my-cabal-path path-separator (getenv "PATH")))
    (add-to-list 'exec-path my-cabal-path))
  (setq haskell-tags-on-save t)
  (setq haskell-process-type 'cabal-repl)

  (add-hook 'haskell-mode-hook
            (lambda ()
              (set (make-local-variable 'company-backends)
                   (append '((company-capf company-dabbrev-code))
                           company-backends))))

  (setq
   haskell-process-suggest-remove-import-lines t
   haskell-process-auto-import-loaded-modules t
   haskell-process-log t)

  (define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-or-reload)
  (define-key haskell-mode-map (kbd "C-c C-z") 'haskell-interactive-switch)
  (define-key haskell-mode-map (kbd "C-c C-n C-t") 'haskell-process-do-type)
  (define-key haskell-mode-map (kbd "C-c C-n C-i") 'haskell-process-do-info)
  (define-key haskell-mode-map (kbd "C-c C-n C-c") 'haskell-process-cabal-build)
  (define-key haskell-mode-map (kbd "C-c C-n c") 'haskell-process-cabal)

  (define-key haskell-cabal-mode-map (kbd "C-c C-z") 'haskell-interactive-switch)
  (define-key haskell-cabal-mode-map (kbd "C-c C-k") 'haskell-interactive-mode-clear)
  (define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build)
  (define-key haskell-cabal-mode-map (kbd "C-c c") 'haskell-process-cabal)
  (define-key haskell-mode-map (kbd "C-c C-o") 'haskell-compile)
  (define-key haskell-cabal-mode-map (kbd "C-c C-o") 'haskell-compile)

  (use-package ghc
    :init
    (autoload 'ghc-init "ghc" nil t)
    (setq haskell-hoogle-command "hoogle")
    (use-package company-ghc
      :init
      (add-to-list 'company-backends 'company-ghc)
      (custom-set-variables '(company-ghc-show-info t)))
    (autoload 'ghc-debug "ghc" nil t)
    (add-hook 'haskell-mode-hook (lambda () (ghc-init))))
  )

(use-package intero
  :config
  (add-hook 'haskell-mode-hook 'intero-mode))

Markdown

(use-package markdown-mode
  :ensure t
  :commands (markdown-mode gfm-mode)
  :mode (("README\\.md\\'" . gfm-mode)
         ("\\.md\\'" . markdown-mode)
         ("\\.txt\\'" . markdown-mode)
         ("\\.markdown\\'" . markdown-mode))
  :init
  (setq markdown-command "markdown")
  :config
  (add-hook 'markdown-mode-hook 'flyspell-mode))

javascript & typescript

(use-package js2-mode
  :config
  (add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))
  (add-to-list 'interpreter-mode-alist '("node" . js2-mode)))

(use-package tide
  :ensure t
  :after (typescript-mode company flycheck)
  :hook ((typescript-mode . tide-setup)
         (typescript-mode . tide-hl-identifier-mode)
         (before-save . tide-formater-before-save)))

(use-package web-mode
  :ensure t
  :init
  (add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
  (add-to-list 'auto-mode-alist '("\\.tsx\\'" . typescript-mode))
  (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))
  (setq web-mode-enable-current-element-highlight t))

F*

(use-package fstar-mode
  :mode (("\\.fst\\')" . fstar-mode)))

Racket

(use-package racket-mode
  :mode "\\.rkt\\'")

Python

(use-package elpy
  :ensure t
  :init
  (if (eq 'system-type "darwin")
      (defvar elpy-rpc-python-command "python3")
    (defvar elpy-rpc-python-command "python"))
  (elpy-enable))

Private configuration

(let ((private-file (concat user-emacs-directory "private.el")))
    (when (file-exists-p private-file)
      (load-file (concat user-emacs-directory "private.el"))))