dotfiles/.emacs.d/init.org

22 KiB

Emacs init file written in org-mode

This is a "minimal" .emacs configuration file. For this configuration to work, you'll need one of:

  • Emacs 26 (preferred)
  • Emacs 25 plus Org-Mode 9

Installation Instructions

Backup you own .emacs if you have one and replace it with the content of this file. If you ever want to regenerate if from this org document, simply M-x org-babel-tangle.

Machine-dependent configuration

;; Machine-dependent configuration - adapt as required for your computer!

;; There are two kinds of settings that might have to be adapted to the
;; specific environment of a computer:
;; 1. Telling Emacs which executables to use for Python and R
;; 2. Telling Emacs to use a Web proxy

;;
;; 1. Telling Emacs which executables to use for Python and R
;;
;; Default setting: Use "python3" under Linux and macOS, but "Python" under Windows.
;; The default for R is "R" for all platforms (predefined by Emacs).
(setq org-babel-python-command
      (if (memq system-type '(windows-nt ms-dos))
          "Python"
        "python3 -q"))

;; If the Python and R executables are on your system's search path,
;; you should not have to modify anything here. If Emacs does not find
;; Python or R, or if it uses a different version of Python or R than you
;; expect, you can uncomment these two lines (one for Python, one for R)
;; and modify them to point to the executables.

;; Python
;; Be careful if the path to your Python installation contains spaces. The path
;; must then be surrounded by backslash-escaped quotation marks, as in
;; (setq org-babel-python-command "\"C:/Program Files/Python/Python37/python.exe\"")

;; R
;; (setq inferior-R-program-name "C:/Program Files/R/R-3.5.1/bin/x64/Rterm.exe")

;;
;; 2. Telling Emacs to use a Web proxy
;;
;; If your local network imposes the use of a Web proxy, you must uncomment and adapt
;; the following lines. Emacs does NOT use system-wide proxy settings. In most
;; cases, only the first two lines (proxy-name and proxy-port) need to be changed,
;; but sometimes the fifth line (no_proxy) also requires modifications. If you are
;; unsure what the right settings are, ask your local network administrator for help.

;; (let* ((proxy-name "proxy.mynetwork.org")
;;        (proxy-port "8080")
;;        (proxy-name-port (concat proxy-name ":" proxy-port))
;;        (proxy-url (concat "http://" proxy-name-port "/")))
;;   (setq url-proxy-services (list (cons "no_proxy" "127.0.0.1")
;;                                  (cons "http"  proxy-name-port)
;;                                  (cons "https"  proxy-name-port)))
;;   (setenv "http_proxy"  proxy-url)
;;   (setenv "https_proxy" proxy-url)
;;   (setenv "JVM_OPTS" (concat "-Dhttp.proxyHost=" proxy-name
;;                              " -Dhttp.proxyPort=" proxy-port)))

Package sources

Use melpa-stable (preferred) and melpa in addition to the default GNU archive

(package-initialize)
(add-to-list 'package-archives
		 '("gnu" . "https://elpa.gnu.org/packages/"))
(add-to-list 'package-archives
		 '("melpa-stable" . "https://stable.melpa.org/packages/"))
(add-to-list 'package-archives
		 '("melpa" . "https://melpa.org/packages/"))
(setq package-archive-priorities '(("melpa-stable" . 100)
                                   ("melpa" . 50)
                                   ("gnu" . 10)))

Install packages

(require 'cl)
(let* ((required-packages
        '(dash
          htmlize
          ess
          auctex
	    magit))
       (missing-packages (remove-if #'package-installed-p required-packages)))
  (when missing-packages
    (message "Missing packages: %s" missing-packages)
    (package-refresh-contents)
    (dolist (pkg missing-packages)
      (package-install pkg)
      (message "Package %s has been installed" pkg))))

Loading files:

Loading babel:   ARNAUD

(require 'org)

Loading ESS (Emacs support for R)

This seems to be needed on some platforms.

(require 'ess-site)

Emacs aesthetics:

Remove splash screen:   WEB

(setq inhibit-splash-screen t)

Change frame name of emacs:   LUKA WEB

(setq frame-title-format
  '("Emacs - " (buffer-file-name "%f"
    (dired-directory dired-directory "%b"))))

Text coloring   ARNAUD

  (global-font-lock-mode t)
  (custom-set-faces
    '(flyspell-incorrect ((t (:inverse-video t)))))

Line and column numbering   ARNAUD

(line-number-mode 1)
(column-number-mode 1)

Parenthesis   ARNAUD

(load-library "paren")
(show-paren-mode 1)
(transient-mark-mode t)
(require 'paren)

Asking for confirmation concisely:   WEB

Link: http://org.ryuslash.org/dotfiles/emacs/init.html#sec-7-1 Being asked to type in yes explicitly all the time gets very tedious. I understand that it is safer since y is much easier to type in accidentally than yes and so the potential to say yes to things you don't want is there, but I haven't had any such problems yet.

(defalias 'yes-or-no-p 'y-or-n-p)

Add the line numbers on the left   LOUIS

Add the number lines on the left side when Org mode is active

(add-hook 'org-mode-hook 'display-line-numbers-mode)

Shortcuts:

UTF 8 by default   ARNAUD

(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(prefer-coding-system 'utf-8)

Keyboard fix for Mac OS X users…   ADRIEN

Thanks to Adrien Lebre for providing me with this ns-use-mac-modifier-symbols thing. Unfortunately, this is broken at the moment (I tried to wrap the command around the cond but it should fail on mac).

    (setq
     ns-command-modifier 'meta         ; Apple/Command key is Meta
	 ns-alternate-modifier nil         ; Option is the Mac Option key
	 ns-use-mac-modifier-symbols  nil  ; display standard Emacs (and not standard Mac) modifier symbols
	 )

CUA mode a.k.a C-x, C-c, C-v

Yuck! Many people like this but I hate it as it conflicts with some of my other shortcuts (e.g., the ones for spelling a region).

;; (cua-mode t) to activate

Goto line   ARNAUD

(global-set-key "\M-g" 'goto-line)

Increase/decrease text size in emacs   WEB

(global-set-key (kbd "C-+") 'text-scale-increase)
(global-set-key (kbd "C--") 'text-scale-decrease)
;; C-x C-0 restores the default font size

[11:26:47; 18.04.2014]

Add spell checker to the file   WEB

;; Inspired from http://tex.stackexchange.com/questions/166681/changing-language-of-flyspell-emacs-with-a-shortcut
;; (defun spell (choice)
;;    "Switch between language dictionaries."
;;    (interactive "cChoose:  (a) American | (f) Francais")
;;     (cond ((eq choice ?1)
;;            (setq flyspell-default-dictionary "american")
;;            (setq ispell-dictionary "american")
;;            (ispell-kill-ispell))
;;           ((eq choice ?2)
;;            (setq flyspell-default-dictionary "francais")
;;            (setq ispell-dictionary "francais")
;;            (ispell-kill-ispell))
;;           (t (message "No changes have been made."))) )

(define-key global-map (kbd "C-c s a") (lambda () (interactive) (ispell-change-dictionary "american")))
(define-key global-map (kbd "C-c s f") (lambda () (interactive) (ispell-change-dictionary "francais")))
(define-key global-map (kbd "C-c s r") 'flyspell-region)
(define-key global-map (kbd "C-c s b") 'flyspell-buffer)
(define-key global-map (kbd "C-c s s") 'flyspell-mode)

Reload buffer   ARNAUD

(global-set-key [f5] '(lambda () (interactive) (revert-buffer nil t nil)))

Invoke magit (for git)   WEB

From http://magit.vc/manual/magit.pdf

(global-set-key (kbd "C-x g") 'magit-status)
(global-set-key (kbd "C-x M-g") 'magit-dispatch-popup)
;; (global-magit-file-mode 1)

Small fixes for LaTeX:

PDF with LaTeX by default   ARNAUD

(defun auto-fill-mode-on () (TeX-PDF-mode 1))
(add-hook 'tex-mode-hook 'TeX-PDF-mode-on)
(add-hook 'latex-mode-hook 'TeX-PDF-mode-on)
(setq TeX-PDF-mode t)

Auto-fill-mode

(defun auto-fill-mode-on () (auto-fill-mode 1))
(add-hook 'text-mode-hook 'auto-fill-mode-on)
(add-hook 'emacs-lisp-mode 'auto-fill-mode-on)
(add-hook 'tex-mode-hook 'auto-fill-mode-on)
(add-hook 'latex-mode-hook 'auto-fill-mode-on)

Org-mode convenient configuration

Default directory

(setq org-directory "~/org/")

Cosmetics

(setq org-hide-leading-stars t)
(setq org-alphabetical-lists t)
(setq org-src-fontify-natively t)  ;; you want this to activate coloring in blocks
(setq org-src-tab-acts-natively t) ;; you want this to have completion in blocks
(setq org-hide-emphasis-markers t) ;; to hide the *,=, or / markers
(setq org-pretty-entities t)       ;; to have \alpha, \to and others display as utf8 http://orgmode.org/manual/Special-symbols.html

Agenda

Add short cut keys for the org-agenda   ARNAUD

(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-cc" 'org-capture)
(global-set-key (kbd "C-c a") 'org-agenda)
(define-key global-map "\C-cl" 'org-store-link)
(define-key global-map (kbd "C-c a") 'org-agenda)
(global-set-key "\C-cb" 'org-iswitchb)
(setq org-default-notes-file "~/org/notes.org")
     (define-key global-map "\C-cd" 'org-capture)
(setq org-capture-templates (quote (("t" "Todo" entry (file+headline "~/org/liste.org" "Tasks") "* TODO %?
  %i
  %a" :prepend t) ("j" "Journal" entry (file+datetree "~/org/journal.org") "* %?
Entered on %U
  %i
  %a") ("s" "Journal Stage" entry (file+datetree "~/org/journal-stage.org") "* %?
Entered on %U
  %i
  %a"))))
t Todo entry (file+headline ~/org/liste.org Tasks) * TODO %?\n %i\n %a :prepend t
j Journal entry (file+datetree ~/org/journal.org) * %?\nEntered on %U\n %i\n %a

Agenda config   ARNAUD

(setq org-agenda-include-all-todo t)
(setq org-agenda-include-diary t)
;; Adding the ~/org directory to the list of directories to scan
(setq org-agenda-files '("~/org"))

Org-mode shortcuts

Adding date with brackets with command "C-c d":   LUKA

(global-set-key (kbd "C-c d") 'insert-date)
(defun insert-date (prefix)
    "Insert the current date. With prefix-argument, use ISO format. With
   two prefix arguments, write out the day and month name."
    (interactive "P")
    (let ((format (cond
                   ((not prefix) "** %Y-%m-%d")
                   ((equal prefix '(4)) "[%Y-%m-%d]"))))
      (insert (format-time-string format))))

[16:34:01; 24.04.2013]

Adding date with command "C-c t":   LUKA

(global-set-key (kbd "C-c t") 'insert-time-date)
(defun insert-time-date (prefix)
    "Insert the current date. With prefix-argument, use ISO format. With
   two prefix arguments, write out the day and month name."
    (interactive "P")
    (let ((format (cond
                   ((not prefix) "[%H:%M:%S; %d.%m.%Y]")
                   ((equal prefix '(4)) "[%H:%M:%S; %Y-%m-%d]"))))
      (insert (format-time-string format))))

[16:34:15; 24.04.2013]

Org-store-link:   ARNAUD

(global-set-key (kbd "C-c l") 'org-store-link)

Navigating through org-mode:

Additional shortcuts for navigating through org-mode documents:

(global-set-key (kbd "C-c <up>") 'outline-up-heading)
(global-set-key (kbd "C-c <left>") 'outline-previous-visible-heading)
(global-set-key (kbd "C-c <right>") 'outline-next-visible-heading)

Toggling the visibility of emphasis markers   LOUIS

Sourced from "Hiding markup Elements" on StackOverflow

(defun org-toggle-emphasis ()
  "Toggle hiding/showing of org emphasize markers."
  (interactive)
  (if org-hide-emphasis-markers
      (set-variable 'org-hide-emphasis-markers nil)
    (set-variable 'org-hide-emphasis-markers t))
  (org-mode-restart))
(define-key org-mode-map (kbd "C-c e") 'org-toggle-emphasis)

Org-mode + babel:

Seamless use of babel (no confirmation, lazy export)   ARNAUD

;; In org-mode 9 you need to have #+PROPERTY: header-args :eval never-export 
;; in the beginning or your document to tell org-mode not to evaluate every 
;; code block every time you export.
(setq org-confirm-babel-evaluate nil) ;; Do not ask for confirmation all the time!!

Some initial languages we want org-babel to support:   ARNAUD

  (org-babel-do-load-languages
   'org-babel-load-languages
   '(
     (emacs-lisp . t)
     (shell . t)
     (python . t)
     (R . t)
     (ruby . t)
     (ocaml . t)
     (ditaa . t)
     (dot . t)
     (octave . t)
     (sqlite . t)
     (perl . t)
     (screen . t)
     (plantuml . t)
     (lilypond . t)
     (org . t)
     (makefile . t)
     ))
  (setq org-src-preserve-indentation t)

Adding source code blocks:   LUKA

Enable the old template system with Orgmode 9.2 and later

(setq rrmooc/new-org-templates (version<= "9.2" (org-version)))
(when  rrmooc/new-org-templates
  (require 'org-tempo))

Template definitions that work with the old and new templating systems

(require 'subr-x)
(defun rrmooc/add-org-template (old-style-template)
  (add-to-list 'org-structure-template-alist
	       (if rrmooc/new-org-templates
		   (cons
		    (first old-style-template)
		    (string-trim-right (substring (second old-style-template) 8 -9)))
		 old-style-template)))

With capital letters:

To use this type <s and then TAB

(unless rrmooc/new-org-templates
  ;; this template is predefined in the new templating system
  (rrmooc/add-org-template
   '("s" "#+begin_src ?\n\n#+end_src" "<src lang=\"?\">\n\n</src>")))

Emacs-elisp code:

To use this type <m and then TAB

(rrmooc/add-org-template
 '("m" "#+begin_src emacs-lisp\n\n#+end_src" "<src lang=\"emacs-lisp\">\n\n</src>"))

R code:

To use this type <r and then TAB. This creates an R block for textual output.

(rrmooc/add-org-template
 '("r" "#+begin_src R :results output :session *R* :exports both\n\n#+end_src" "<src lang=\"R\">\n\n</src>"))

To use this type <R and then TAB. This creates an R block for graphics that are stored in the /tmp/.

(rrmooc/add-org-template
 '("R" "#+begin_src R :results output graphics :file (org-babel-temp-file \"figure\" \".png\") :exports both :width 600 :height 400 :session *R* \n\n#+end_src" "<src lang=\"R\">\n\n</src>"))

To use this type <RR and then TAB. This creates an R block for graphics that are stored in the directory of the current file.

(rrmooc/add-org-template
 '("RR" "#+begin_src R :results output graphics :file  (org-babel-temp-file (concat (file-name-directory (or load-file-name buffer-file-name)) \"figure-\") \".png\") :exports both :width 600 :height 400 :session *R* \n\n#+end_src" "<src lang=\"R\">\n\n</src>"))

Python code

To use this type <p and then TAB

(rrmooc/add-org-template
 '("p" "#+begin_src python :results output :exports both\n\n#+end_src" "<src lang=\"python\">\n\n</src>"))
(rrmooc/add-org-template
 '("P" "#+begin_src python :results output :session :exports both\n\n#+end_src" "<src lang=\"python\">\n\n</src>"))
(rrmooc/add-org-template
 '("PP" "#+begin_src python :results file :session :var matplot_lib_filename=(org-babel-temp-file \"figure\" \".png\") :exports both\nimport matplotlib.pyplot as plt\n\nimport numpy\nx=numpy.linspace(-15,15)\nplt.figure(figsize=(10,5))\nplt.plot(x,numpy.cos(x)/x)\nplt.tight_layout()\n\nplt.savefig(matplot_lib_filename)\nmatplot_lib_filename\n#+end_src" "<src lang=\"python\">\n\n</src>"))

Bash "sh" code:

To use this type <b and then TAB

(if (memq system-type '(windows-nt ms-dos))
    ;; Non-session shell execution does not seem to work under Windows, so we use
    ;; a named session just like for B.
    (rrmooc/add-org-template
     '("b" "#+begin_src shell :session session :results output :exports both\n\n#+end_src" "<src lang=\"sh\">\n\n</src>"))
  (rrmooc/add-org-template
   '("b" "#+begin_src shell :results output :exports both\n\n#+end_src" "<src lang=\"sh\">\n\n</src>")))

To use this type <B and then TAB. This comes with a session argument (e.g., in case you want to keep ssh connexions open).

(rrmooc/add-org-template
 '("B" "#+begin_src shell :session *shell* :results output :exports both \n\n#+end_src" "<src lang=\"sh\">\n\n</src>"))

Graphviz

(rrmooc/add-org-template
 '("g" "#+begin_src dot :results output graphics :file \"/tmp/graph.pdf\" :exports both
digraph G {
node [color=black,fillcolor=white,shape=rectangle,style=filled,fontname=\"Helvetica\"];
A[label=\"A\"]
B[label=\"B\"]
A->B
}\n#+end_src" "<src lang=\"dot\">\n\n</src>"))

Evaluating whole subtree:   LUKA

(global-set-key (kbd "C-c S-t") 'org-babel-execute-subtree)

Display images   ARNAUD

(add-hook 'org-babel-after-execute-hook 'org-display-inline-images) 
(add-hook 'org-mode-hook 'org-display-inline-images)
(add-hook 'org-mode-hook 'org-babel-result-hide-all)

Optimizing Python execution

Don't use readline completion

This often fails, yielding an ugly warning, and isn't of any use in Org-mode anyway

(setq python-shell-completion-native-enable nil)

Custom Louis   LOUIS

Installing wanted packages

(let* ((wanted-packages
        '(flycheck
          company
	   org-appear
	   org-fragtog))
       (missing-wanted-packages (remove-if #'package-installed-p wanted-packages)))
  (when missing-wanted-packages
    (message "Missing wanted packages: %s" missing-wanted-packages)
    (package-refresh-contents)
    (dolist (pkg missing-wanted-packages)
      (package-install pkg)
      (message "Wanted package %s has been installed" pkg))))

Global enable Company-mode   completion

(global-company-mode)

Disabling auto-fill-mode when using org

This snippet disables the auto-fill-mode which wraps the line when it exceeds a certain length

;; When loading org-mode turns off auto-fill-mode
(add-hook 'org-mode-hook 'turn-off-auto-fill)

Activating org-appear minor mode

This mode makes the emphasis markers appear when the cursor is on it

(add-hook 'org-mode-hook 'org-appear-mode)

Visual line mode activated on startup

(global-visual-line-mode 1) ; 1 for on & 0 for off

Auto toggle the preview of LaTeX fragments

(add-hook 'org-mode-hook 'org-fragtog-mode)

Remote image display

This code was taken from https://emacs.stackexchange.com/questions/42281/org-mode-is-it-possible-to-display-online-images and makes use of the org-yt package.

(require 'org-yt)

(defun org-image-link (protocol link _description)
  "Interpret LINK as base64-encoded image data."
  (cl-assert (string-match "\\`img" protocol) nil
             "Expected protocol type starting with img")
  (let ((buf (url-retrieve-synchronously (concat (substring protocol 3) ":" link))))
    (cl-assert buf nil
               "Download of image \"%s\" failed." link)
    (with-current-buffer buf
      (goto-char (point-min))
      (re-search-forward "\r?\n\r?\n")
      (buffer-substring-no-properties (point) (point-max)))))

(org-link-set-parameters
 "imghttp"
 :image-data-fun #'org-image-link)

(org-link-set-parameters
 "imghttps"
 :image-data-fun #'org-image-link)

Theme

Activation du thème

(load-theme 'leuven t)