Blog‎ > ‎

My .emacs configuration

posted Apr 9, 2018, 10:46 AM by Juan Jose Garcia-Ripoll   [ updated Apr 9, 2018, 1:06 PM ]
In case you like peeking into other people's configuration file or learn how to configure Emacs in Windows, here is my last set of settings.

Note: this relies on a personal fork of shackle to have LaTeX pop-up windows be automatically closed when they are no longer used (AucTeX kills the buffer with errors but shackle does not close the window which showed the errors)
;;; -*- mode: emacs-lisp; -*-
;;; Different computers have different customizations due to
;;; monitor screen sizes, resolutions, etc.
(defun tic (&optional n)
  (print (list n (get-internal-run-time))))

;;; All our files will be located under a Dropbox common folder
;;; whose location may shift between computers. Also, fonts
;;; screen resolutions, etc, may vary.
(setq dropbox "~/Dropbox/Library/")
(setq dropbox-elpa "~/Dropbox/Library/Emacs/elpa-25")
(cond ((string= system-name "DEUTSCH")
       (setq juanjo:text-font-family "Noto Serif"
	     juanjo:text-font-height 110
	     juanjo:text-line-spacing 0.3
	     juanjo:margin 2))
      ((string= system-name "DESKTOP-HDKKLFG")
       (setq juanjo:text-font-height 140
	     juanjo:text-font-family "Vollkorn"
	     juanjo:text-line-spacing 0.0
	     juanjo:margin 1)
       (setq juanjo:text-font-family "Noto Serif"
	     juanjo:text-font-height 120
	     juanjo:text-line-spacing 0.3
	     juanjo:margin 2))
       (setq juanjo:text-font-family "DejaVu Serif"
	     juanjo:text-line-spacing 0.3
	     juanjo:text-font-height 110
	     juanjo:margin 1)))

(let ((custom-file (expand-file-name "dot.custom.el" dropbox)))
  (when (file-exists-p custom-file)
    (load custom-file)))

;;; Change to home directory. When using emacs.exe from Chocolatey,
;;; Emacs tends to start from the location of the shim executable.
(cd "~/")

(require 'package)
(setq package-user-dir dropbox-elpa)
(add-to-list 'package-archives '("melpa" . ""))
(add-to-list 'package-archives '("melpa-stable" . ""))
;;(package-refresh-contents t)

;;; Lazy package management with postponed initialization, automatic
;;; installation of those packages.
(unless (package-installed-p 'use-package)
  (package-install 'use-package))
(require 'use-package)

;;; Persistence

;; Remember from session to session all the commands introduced
;; in the minibuffer, files opened, etc.
(setq savehist-file (expand-file-name "Emacs/dot.history" dropbox))
(savehist-mode 1)

;;; Emacs quirks

;;; Do not use tabs when editing files
(setq-default indent-tabs-mode nil)
(setq tab-width 4)

;;; Make tabs indent first, then complete
(setq-default tab-always-indent 'complete)

;;; Remove yes-or-no questions, defaulting to single-keystroke
(fset 'yes-or-no-p 'y-or-n-p)

;;; Remove text from *scratch* buffer
(setq initial-scratch-message nil)

;;; Do not disable commands
(setq disabled-command-function nil)
;;(put 'downcase-region 'disabled nil)
;;(put 'scroll-left 'disabled nil)

;; Visual appearance:
;; My preferred fonts for text and coding. I store them
;; as variables because they are used in buffer-local
;; customizations.
(setq code-face '(:family "Source Code Pro" :foundry "outline"
			  :slant normal :weight normal :height 98 :width normal)
      text-face `(:family ,juanjo:text-font-family :foundry "outline"
			  :slant normal :weight normal
			  :height ,juanjo:text-font-height :width normal)
      bold-text-face (plist-put (copy-sequence text-face) :weight 'bold))
(apply 'set-face-attribute 'default nil code-face)
;; Darker background, softer coloring
(load "~/Dropbox/Library/Emacs/mycarthy-theme.el")
(load-theme 'mycarthy)
;; No blinking cursor
(blink-cursor-mode -1)
;; No fringe bars on both sides
(fringe-mode 0)
;; No continuation character on truncate-line mode
(set-display-table-slot standard-display-table 0 ?\ )

;;; Text editing with proportional fonts, good interline spacing
;;; and window margins.
(defun juanjo:text-mode-hooks ()
  ;; Some more spacing between lines
  (setq-local line-spacing juanjo:text-line-spacing)
  ;; Wrap around words
  (visual-line-mode +1)
  ;; Text modes should have proportional fonts
  (buffer-face-set text-face)
  (setq left-margin-width juanjo:margin
	right-margin-width juanjo:margin)
(add-hook 'text-mode-hook 'juanjo:text-mode-hooks)

;; Placement of windows
(use-package shackle
  :load-path "~/Dropbox/Library/Emacs/local/shackle/"
  :commands shackle-mode
  (setq shackle-rules
	'(("\\*TeX.*\\*" :regexp t :autoclose t :align below :size 10)
	  ("\\*.*Help\\*" :regexp t :autoclose t :align below :size 10)))
  (setq shackle-default-rule '(:select t)))


;;; My convenience bindings

;;; Delete whole buffer
(defun mps-clear-all ()
  (delete-region (point-min) (line-end-position 0)))
(global-set-key [?\C-x ?\C-u] 'mps-clear-all)

;; (add-to-list 'load-path (concat dropbox "Emacs/fakecygpty/"))
;; (require 'fakecygpty)
;; (fakecygpty-activate)
;; (setq fakecygpty-ignored-program-regexps '("[cC][mM][dD]" "[cC][mM][dD][pP][rR][oO][xX][yY]"))
;; ;; We need to force using fakecygpty with tramp
;; (eval-after-load "tramp"
;;     '(progn
;;        (add-to-list 'tramp-methods
;;                     (mapcar
;;                      (lambda (x)
;;                        (cond
;;                         ((equal x "sshx") "cygssh")
;;                         ((eq (car x) 'tramp-login-program)
;; 			 (list 'tramp-login-program "fakecygpty ssh"))
;;                         (t x)))
;;                      (assoc "sshx" tramp-methods)))
;;        (setq tramp-default-method "cygssh")))

;;; LaTeX with AucTeX

;; TeXcount setup for TeXcount version 2.3 and later
(defun juanjo:texcount ()
    ((this-file (buffer-file-name))
     (enc-str (symbol-name buffer-file-coding-system))
       ((string-match "utf-8" enc-str) "-utf8")
       ((string-match "latin" enc-str) "-latin1")
      ;; Windows screwes this for me
      (append '("LANG=") process-environment))
	(with-current-buffer standard-output
	  (call-process "texcount" nil t nil "-0" enc-opt this-file))))
    (message word-count)

(use-package latex
  :defer t
  :mode ("\\.tex\\'" . latex-mode)
  (:map LaTeX-mode-map
	("C-c l" . TeX-error-overview)
        ("C-c w" . juanjo:textcount))

  ;; Minor changes to the LaTeX mode
  (add-hook 'LaTeX-mode-hook 'juanjo:latex-hooks)
  (add-hook 'LaTeX-mode-hook 'turn-on-reftex)
  (add-hook 'LaTeX-mode-hook 'juanjo:latex-hooks)
  (add-hook 'LaTeX-mode-hook 'flyspell-mode)

  (setq TeX-PDF-mode t
	TeX-save-query nil
	TeX-source-correlate-mode t
	TeX-source-correlate-method 'synctex
	;; Tell SumatraPDF to open the current PDF file, indicating
	;; which is the source file and line number (used by synctex)
	;; and provide a valid command line to edit at the desired
	;; location of a source file that is linked in the PDF.
	'(("Sumatra PDF"
	   ("\"SumatraPDF.exe\" -reuse-instance "
	    "-inverse-search \"emacsclientw.exe +%%l \\\"%%f\\\"\" "
	    (mode-io-correlate " -forward-search %a %n ")
	    " %o")))
	'(((output-dvi style-pstricks) "dvips and start")
	  (output-dvi "Yap")
	  (output-pdf "Sumatra PDF")
	  (output-html "start"))
	;; Open TeX error list after compilation
	;; and show all warnings
	TeX-error-overview-open-after-TeX-run t
	TeX-debug-warnings t)
  ;; Replace viewer with SumatraPDF
  (assq-delete-all 'output-pdf TeX-view-program-selection)
  (add-to-list 'TeX-view-program-selection
	       '(output-pdf "Sumatra PDF"))

  ) ; use-package latex

;; Hook into font-latex to reduce the size of some section,
;; chapter, subscript and superscript fonts
(use-package font-latex
  :defer t
  (set-face-attribute 'font-latex-subscript-face nil :height 0.6)
  (set-face-attribute 'font-latex-superscript-face nil :height 0.6)
  ;; I do not like large fonts for the sections, chapters, etc
  (let ((height (round (* 1.1 juanjo:text-font-height))))
    (dolist (face '(font-latex-sectioning-0-face
      (apply 'set-face-attribute face nil
	     (plist-put (copy-sequence bold-text-face)
			:height height))))

(use-package reftex
  :defer t
  :commands turn-on-reftex
  (setq reftex-plug-into-AUCTeX t
	;; RefTeX list of sections, labels and figures shows as
	;; vertical bar to the left of the window.
	reftex-toc-split-windows-horizontally t
	;; RefTeX table of contents does not indicate which
	;; sections are in which files.
	reftex-toc-include-file-boundaries nil))

(use-package latex-extra
  :defer t
  :ensure t
  :commands latex-extra-mode
  (:map LaTeX-mode-map 
	("M-" . latex/next-section-same-level)
	("M-" . latex/previous-section-same-level))
  (add-hook 'LaTeX-mode-hook (lambda () (latex-extra-mode) (auto-fill-mode -1)))
  ;; Do not override AucTex's font commands
  (setq latex/override-font-map nil))

(defun delatexify ()
    (goto-char 0)
    (replace-string "{\'\i}" "í")
    (replace-string "\\'o" "ó")
    (replace-string "\\'a" "á")
    (replace-string "\\'e" "é")
    (replace-string "\\'u" "ú")
    (replace-string "\\\"a" "ä")
    (replace-string "\\\"o" "ö")))

(defun juanjo:html-mode-hooks()
  ;; Wrap around words
  (visual-line-mode +1)
  ;; Text modes should have proportional fonts
  (buffer-face-set code-face))

(add-hook 'html-mode-hook 'juanjo:html-mode-hooks)

;; Dictionaries, languages and encodings
;; Use hunspell.exe for automatic spell checking. Available
;; from Chocolately as choco install hunspell
(use-package flyspell
  :defer t
  (("" . ispell-word)
   ("C-S-" . flyspell-mode)
   ("C-M-" . flyspell-buffer)
   ("C-" . flyspell-check-previous-highlighted-word)
   ("M-" . flyspell-check-next-highlighted-word))
  (setenv "DICTPATH" "c:\\ProgramData\\chocolatey\\lib\\hunspell.portable\\tools\\share\\hunspell\\")
  (setenv "DICTIONARY" "c:\\ProgramData\\chocolatey\\lib\\hunspell.portable\\tools\\bin\\..\\share\\hunspell\\en_US")
  (setq ispell-program-name "c:\\ProgramData\\chocolatey\\bin\\hunspell.exe"
	;; Save dictionary in common location
	ispell-extra-args `("-p" ,(expand-file-name "hunspell" dropbox))
	;; Save dictionary without asking
	ispell-silently-savep t
	;; Do not issue warnings for all wrong words
	flyspell-issue-message-flag nil)

  (defun flyspell-check-next-highlighted-word ()
    "Custom function to spell check next highlighted word"

  (ispell-change-dictionary "en_US" t)

  ) ; use-package flyspell

;;; Encoding for everything
(prefer-coding-system 'utf-8-unix)

;;; Convenience keybindings for Greek letters
  (global-set-key (kbd "C-x C-g a") "α")
  (global-set-key (kbd "C-x C-g b") "β")
  (global-set-key (kbd "C-x C-g g") "γ")
  (global-set-key (kbd "C-x C-g d") "δ")
  (global-set-key (kbd "C-x C-g ep") "ε")
  (global-set-key (kbd "C-x C-g z") "ζ")
  (global-set-key (kbd "C-x C-g et") "η")
  (global-set-key (kbd "C-x C-g Th") "θ")
  (global-set-key (kbd "C-x C-g i") "ι")
  (global-set-key (kbd "C-x C-g í") "ί")
  (global-set-key (kbd "C-x C-g k") "κ")
  (global-set-key (kbd "C-x C-g l") "λ")
  (global-set-key (kbd "C-x C-g m") "μ")
  (global-set-key (kbd "C-x C-g n") "ν")
  (global-set-key (kbd "C-x C-g xi") "ξ")
  (global-set-key (kbd "C-x C-g o") "ο")
  (global-set-key (kbd "C-x C-g ó") "ό")
  (global-set-key (kbd "C-x C-g pi") "π")
  (global-set-key (kbd "C-x C-g r") "ρ")
  (global-set-key (kbd "C-x C-g fs") "ς")
  (global-set-key (kbd "C-x C-g s") "σ")
  (global-set-key (kbd "C-x C-g t") "τ")
  (global-set-key (kbd "C-x C-g y") "υ")
  (global-set-key (kbd "C-x C-g ý") "ύ")
  (global-set-key (kbd "C-x C-g ph") "φ")
  (global-set-key (kbd "C-x C-g chi") "φ")
  (global-set-key (kbd "C-x C-g ps") "ψ")
  (global-set-key (kbd "C-x C-g w") "ω"))

;; Windows and unix-like shells
(defun cygwin-shell ()
  "Run cygwin bash in shell mode."
  (let ((explicit-shell-file-name "bash")
	(explicit-bash-args '("-i")))
    (call-interactively 'shell)))

(defun wunix-shell ()
  "Run Windows' bash in shell mode."
  (let ((explicit-shell-file-name "cmd.exe")
	(explicit-cmd.exe-args '("/C" "c:\\Windows\\WinSxS\\amd64_microsoft-windows-lxss-bash_31bf3856ad364e35_10.0.16299.15_none_62878a822db68b25\\bash.exe" "-i")))
    (call-interactively 'shell)))

(defun visual-studio-2017-x84-shell ()
  "Run Windows shell with Visual Studio environment."
  (let ((explicit-shell-file-name "cmd.exe")
	(explicit-cmd.exe-args '("/k" "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\Auxiliary\\Build\\vcvars64.bat")))

(setq tramp-default-method "ssh")

(defun browser-sync ()
  "Starts a browser-sync script if it exists in this directory"
  (start-process "browser-sync" "*browser-sync*" (expand-file-name "debug.cmd")))

;; Email, web and other services

(use-package wunderlist
  :defer t
  (setq wl-folders-file "~/Dropbox/Library/dot.folders"

        ;; SMTP server for mail posting. Default: nil
        wl-smtp-posting-server ""
        wl-smtp-posting-port 465
        wl-smtp-posting-user "xxxxx"
        wl-smtp-authenticate-type "plain"
        wl-smtp-connection-type 'ssl
        wl-from ""
        smtp-fqdn ""

        elmo-imap4-default-user "xxxxx"
        elmo-imap4-default-server ""
        elmo-imap4-default-port 993
        elmo-imap4-default-authenticate-type 'clear
        elmo-imap4-default-stream-type 'ssl

        ;; Location of archives
        elmo-archive-folder-path "~/Dropbox/Mail/"

        ;; Location of MH and Maildir folders
        elmo-localdir-folder-path "~/Dropbox/Mail/"
        elmo-maildir-folder-path "~/Dropbox/Mail/"

        wl-message-id-domain ""
        wl-from "Juan Jose Garcia-Ripoll "

        wl-stay-folder-window t
        wl-folder-window-width 25
        wl-folder-use-frame nil

        wl-message-ignored-field-list '("^.*")
        wl-message-visible-field-list '("^From:" "^To:" "^Cc:" "^Date:" "^Subject:")
        wl-message-sort-field-list wl-message-visible-field-list
        wl-summary-default-sort-spec 'date
        wl-message-window-size '(1 . 3)

  (if (boundp 'mail-user-agent)
      (setq mail-user-agent 'wl-user-agent))
  (if (fboundp 'define-mail-user-agent)

  ) ; use-package wunderlist

;;; Auto completion with IDO

(use-package ido
  :ensure t
  :init  (setq ido-enable-flex-matching t
               ido-ignore-extensions t
               ido-use-virtual-buffers t
               ido-everywhere t)
  (ido-mode 1)
  (ido-everywhere 1)
  (add-to-list 'completion-ignored-extensions ".pyc"))

(use-package flx-ido
   :ensure t
   :init (setq ido-enable-flex-matching t
               ido-use-faces nil)
   :config (flx-ido-mode 1))

;;; Version control

(use-package magit
  :defer t
  :ensure t