Skip to content

Latest commit

 

History

History
578 lines (542 loc) · 22.1 KB

File metadata and controls

578 lines (542 loc) · 22.1 KB

Emacs init file written in org-mode

This is a copy of the emacs configuration file provided by Arnaud Legrand ([2020-05-25 10:31]). I made some small changes to customize it with some personal settings.

Original text from Arnaud 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/"))
;; (package-refresh-contents)
(setq package-archive-priorities '(("melpa-stable" . 100)
                                   ("melpa" . 150)
                                   ("gnu" . 10)))

Install missing packages

;(require 'cl)
(let* ((required-packages
        '(ess
          auctex
          htmlize
          helm-bibtex
          ivy-bibtex
          avy
          org-ref
          org-contrib
          cuda-mode
          company
          exec-path-from-shell))
       (missing-packages (cl-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:

(require 'org)

Loading ESS (Emacs support for R)

This seems to be needed on some platforms.

(require 'ess-site)

Benefiting from org-mode’s contrib

Some instructions from lucas

(add-to-list 'load-path "~/misc/org-mode/lisp/")
(add-to-list 'load-path "~/misc/org-mode/contrib/lisp/")

Emacs aesthetics:

Remove splash screen:

(setq inhibit-splash-screen t)

Change frame name of emacs:

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

Text coloring

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

Line and column numbering

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

Parenthesis

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

Asking for confirmation concisely:

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)

Shortcuts:

UTF 8 by default

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

Keyboard fix for Mac OS X users…

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)

Navigate back in text

(defun jump-mark ()
  (interactive)
  (set-mark-command (point)))
(defun beginning-of-defun-and-mark ()
  (interactive)
  (push-mark (point))
  (beginning-of-defun))
(defun end-of-defun-and-mark ()
  (interactive)
  (push-mark (point))
  (end-of-defun))

(global-set-key "\^c\^b" 'beginning-of-defun-and-mark)
(global-set-key "\^c\^e" 'end-of-defun-and-mark)
(global-set-key "\^c\^j" 'jump-mark)
(global-set-key [S-f6] 'jump-mark)		;; jump from mark to mark

Goto line

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

Increase/decrease text size in emacs

(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

;; 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

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

Invoke magit (for git)

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

(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

(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"))))

Agenda config

(setq org-agenda-include-all-todo t)
(setq org-agenda-include-diary t)

Org-mode shortcuts

Adding date with brackets with command “C-c d”:

(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”:

(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:

(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)

Org-mode + babel:

Seamless use of babel (no confirmation, lazy export)

;; 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:

(org-babel-do-load-languages
 'org-babel-load-languages
 '(
   (emacs-lisp . t)
   (shell . t)
   (python . t)
   (R . t)
   (latex .t)
   (C .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:

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
		    (cl-first old-style-template)
		    (string-trim-right (substring (cl-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 :eval no-export\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 :file (org-babel-temp-file \"figure\" \".png\") :exports both :width 600 :height 400 :session *R* :eval no-export \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 :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* :eval no-export \n\n#+end_src" "<src lang=\"R\">\n\n</src>"))

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

(rrmooc/add-org-template
 '("RRR" "#+begin_src R :results output graphics file :file  (file-relative-name (org-babel-temp-file (concat (file-name-directory (or load-file-name buffer-file-name)) \"figure-\") \".png\") (file-name-directory (or load-file-name buffer-file-name))) :exports both :width 600 :height 400 :session *R* :eval no-export \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 :eval no-export\n\n#+end_src" "<src lang=\"sh\">\n\n</src>"))
  (rrmooc/add-org-template
   '("b" "#+begin_src shell :results output :exports both :eval no-export\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  :eval no-export\n\n#+end_src" "<src lang=\"sh\">\n\n</src>"))

Graphviz

(rrmooc/add-org-template
 '("g" "#+begin_src dot :results output graphics file :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:

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

Display images

(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)

Read-only sections

Inspired from: https://emacs.stackexchange.com/questions/62495/how-can-i-mark-sections-of-a-very-large-org-agenda-file-as-read-only

Use org-section-readonly to set current section as read only. To remove the tag, call org-section-readonly again. To disable this feature call org-disable-readonly.

(defun org-enable-readonly ()
  (interactive)
  (let ((buf-mod (buffer-modified-p)))
    (org-map-entries
     (lambda ()
       (org-mark-subtree)
       (add-text-properties (region-beginning) (region-end) '(read-only t)))
     "read_only")
    (unless buf-mod
      (set-buffer-modified-p nil))))

(defun org-disable-readonly ()
  (interactive)
  (let ((buf-mod (buffer-modified-p)))
    (org-map-entries
     (lambda ()
       (let* ((inhibit-read-only t))
     (org-mark-subtree)
     (remove-text-properties (region-beginning) (region-end) '(read-only t))))
     "read_only")
    (unless buf-mod
      (set-buffer-modified-p nil))))

(defun org-section-readonly ()
  (interactive)
  (org-disable-readonly)
  (org-toggle-tag "read_only")
  (org-enable-readonly)
  )

Theme

(load-theme 'misterioso)

Menu bars

(if window-system
    (menu-bar-mode -1)
)
(if window-system
    (tool-bar-mode -1)
)

Reload

(org-reload)