UP | HOME

Emacs
Notizen erstellt mit Org-Mode

Inhaltsverzeichnis

logos-banner.png

1 Stichworte

2 Einleitung

Ich habe hier meine gewachsenen Notizen zum Editor Emacs und seinen Paketen gemacht. Bei den Paketen nimmt der Org-mode den größten Raum ein. Der Grund ist schlicht, dass ich Emacs und Org-mode ständig _nutze. Daher hat der Org-mode auch ein eigenes Hauptkapitel, und ist _kein Unterkapitel von „Emacs Pakete“. Diese Seite schreibe ich dann auch mit Emacs im Org-mode (C-x C-s C-c C-e h h).

logos-banner.png

3 Meine permanenten Makros

Einige nützliche Makros und/oder Funktionen, die ich dauerhaft in meiner .emacs Datei gespeichert habe, werden hier aufgelistet.

Makroname Kürzel Beschreibung
my/add-new-line-above M-p fügt neue Zeile über der aktuellen ein und setzt den Cursor dorthin
my/add-new-line-below M-n fügt neue Zeile unter der aktuellen ein und setzt den Cursor dorthin
datum F6 fügt das aktuelle Datum ein
datum-uhrzeit   fügt das aktuelle Datum und die Uhrzeit ein
uhrzeit   fügt die aktuelle Uhrzeit ein
my/insert-file-name F5 fügt Dateinamen des aktuellen Puffers ein
my/insert-file-path-name S-F5 fügt Pfad und Dateinamen des aktuellen Puffers ein
my/move-line-up M-up bewegt aktuelle Zeile eine Zeile nach oben
my/move-line-down M-down bewegt aktuelle Zeile eine Zeile nach unten

3.1 Datum und Uhrzeit eingeben

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Datum und Uhrzeit eingeben ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun datum-uhrzeit ()
  "Datum und Uhrzeit eingeben"
  (interactive)
  (insert (format-time-string "%d.%m.%Y %H:%M:%S")))

(defun datum ()
  "Datum eingeben"
  (interactive)
  (insert (format-time-string "%d.%m.%Y")))

(defun uhrzeit ()
  "Uhrzeit eingeben"
  (interactive)
  (insert (format-time-string "%H:%M:%S")))

3.2 Dateinamen an Punkt einfügen

(defun my/insert-file-name ()
  "Insert filename of the current buffer at cursorpoint."
  (interactive)
  (insert (file-name-nondirectory buffer-file-name)))

(defun my/insert-file-path-name ()
  "Insert filename and its path of the current buffer at
cursorpoint."
  (interactive)
  (insert (buffer-file-name)))

(global-set-key (kbd "<f5>") 'my/insert-file-name)
(global-set-key (kbd "<S-f5>") 'my/insert-file-path-name)

3.3 Neue Zeile erzeugen

;;;; neue Zeile unter aktueller erzeugen und Cursor dorthin setzen mit
;;;; M-n
(defun my/insert-new-line-below (times)
  "Insert a new line  below the current and set Cursor to the new
line.  It does not matter whether the curser is not at the end of
the old line."
  (interactive "p")
  (move-end-of-line 1)
  (newline times))
(global-set-key (kbd "M-n") 'my/insert-new-line-below)

;;;; neue Zeile über aktueller erzeugen und Cursor dorthin setzen mit
;;;; M-p
(defun my/insert-new-line-above (times)
  "Insert a new line above the current and set Cursor to the new
line.  It does not matter whether the curser is not at the end of
the old line."
  (interactive "p")
  (move-beginning-of-line 1)
  (newline times)
  (move-beginning-of-line (+ (* -1 times) 1) ))
(global-set-key (kbd "M-p") 'my/insert-new-line-above)

3.4 Aktuelle Zeile nach oben/unten verschieben

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; move current line up/down with M-up and M-down arrow ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun my/move-line-up ()
  "Move up the current line.  Cursor will move, too."
  (interactive)
  (transpose-lines 1)
  (forward-line -2)
  (indent-according-to-mode))

(defun my/move-line-down ()
  "Move down the current line.  Cursor will move, too."
  (interactive)
  (forward-line 1)
  (transpose-lines 1)
  (forward-line -1)
  (indent-according-to-mode))

(global-set-key (kbd "<M-up>") 'my/move-line-up)
(global-set-key (kbd "<M-down>") 'my/move-line-down)

logos-banner.png

4 Meine Belegung der F-Tasten

Taste Funktion
F5 my/insert-file-name
F12 neotree-toggle
F6 datum
F2 bm-next
F9 imenu-list
F8 sunshine-forecast

logos-banner.png

5 Meine Tastaturkürzel

Tastaturkürzel Kommando Modus
C-: ac-complete-with-helm global
C-: ac-complete-with-helm ac-complete-mode-map
C-x C-a ace-jump-mode global
f2 bm-next global
S-f2 bm-previous global
C-f2 bm-toggle global
M-; comment-dwim-2 global
C-x C-r copy-to-register global
C-c C-right cycbuf-switch-to-next-buffer-no-timeout global
C-c C-left cycbuf-switch-to-previous-buffer-no-timeout global
C-S-iso-lefttab dabbrev-expand global
C-S-iso-lefttab dabbrev-expand minibuffer-local-map
f6 datum global
C-( embrace-commander global
C-c e engine/set-keymap-prefix engine
C-M-; er/contract-region global
C-; er/expand-region global
C-- evil-numbers/dec-at-pt global
C-+ evil-numbers/inc-at-pt global
M-x helm-M-x global
C-h SPC helm-all-mark-rings global
C-c b helm-bm global
C-c h b helm-bookmarks global
tab helm-execute-persistent-action helm-map
C-i helm-execute-persistent-action helm-map
C-x C-f helm-find-files global
C-x b helm-mini global
C-c h o helm-occur global
C-c r r helm-org-rifle global
C-c r b helm-org-rifle-current-buffer global
C-c r d helm-org-rifle-directories global
C-c r f helm-org-rifle-files global
C-c h x helm-register global
C-x C-h helm-register global
C-z helm-select-action helm-map
M-y helm-show-kill-ring global
C-c y helm-yas-complete global
f9 imenu-list global
C-x C-i insert-register global
C-x C-j jump-to-register global
C-S-c C-S-c mc/edit-lines global
C-S-c C-> mc/mark-all-like-this global
C-> mc/mark-next-like-this global
C-< mc/mark-previous-like-this global
C-a mwim-beginning-of-code-or-line global
C-e mwim-end-of-code-or-line global
f5 my/insert-file-name global
S-f5 my/insert-file-path-name global
M-p my/insert-new-line-above global
M-n my/insert-new-line-below global
M-down my/move-line-down global
M-up my/move-line-up global
C-c f my/org-agenda-view global
f12 neotree-toggle global
M-% phi-replace-query global
C-s phi-search global
> phi-search-again-or-next phi-search-default-map
< phi-search-again-or-previous phi-search-default-map
C-r phi-search-backward global
C-x C-p point-to-register global
C-x C-l register-list global
C-c m show-marks global
f8 sunshine-forecast global
C-c s swiper global
M-s M-w switch-window global
C-x C-y C-y yankpad-insert global
C-x C-y C-c yankpad-set-category global
C-x C-z zoom-window-zoom global

logos-banner.png

6 Org-mode    orgmode

Das folding kann mit TAB getoggelt werden. Dafür muss man allerdings auf die entsprechende Überschrift liegen. Um alle Überschriften zu öffnen/schließen tippt man S+TAB ein.

6.1 Text hervorheben

Code Ergebnis
*fett* fett
/italic/ italic –> funktioniert nur über maximal 2 Zeilen
_unterstrichen_ unterstrichen
=Code= Code
~verbatim~ verbatim
+durchgestrichen+ durchgestrichen

6.1.1 org-mode Eigene Farben

Eigenes Highlighting durch einschließen in Sonderzeichen kann in customize durch das Setzen neuer Einträge in org-emphasis-alist erreicht werden.

Bei mir habe ich !overdue! für roten Hintregrund und %ready% für orangen Hintergrund eingestellt. Leider funktioniert damit unter Umständen der Export nach HTML nicht mehr, da die Exportfunktion diese Marker nicht kennt. Für den Export kann man aber entweder diese Sonderzeichen löschen, oder sie durch ein vorangestelltes \ schützen.

  '(org-emphasis-alist
      (quote
          (("*" bold)
          ("/" italic)
          ("_" underline)
          ("=" org-verbatim verbatim)
          ("~" org-code verbatim)
          ("+"
              (:strike-through t))
          ("!" bad-face verbatim)
          ("%" bm-face verbatim))))

org-own-emphasis.png

6.2 Listen

In der Liste kann mit S-links/rechts das Listensymbol geändert werden.

- Bindestrich
- weiteres
  • Bindestrich
  • weiteres

Zwischen zwei Listen muss ein Nicht-Listen-Text stehen, damit die Listensymboländerung funktioniert. Ansonsten nimmt org-mode an, dass die Listen zusammen gehören.

+ Pluszeichen
+ weiteres
  • Pluszeichen
  • weiteres

Einträge innerhalb einer Liste können mit M-hoch/runter versetzt werden.

1) Nummerierung Klammer
2) weiteres
  1. Nummerierung Klammer
  2. weiteres

Die Einrücktiefe kann mit M-links/rechts verändert werden.

1. Nummerierung Punkt
2. weiteres
  1. Nummerierung Punkt
  2. weiteres

Für einen neuen Eintrag, wie gehabt, ist M-RET zuständig.

Bei nummerierten Listen wird mit den oben genannten Listenkommandos die Nummerierung richtig gesetzt. Eine Alphabetische Liste wird leider nicht unterstützt. Beim Exportieren werden Bindestriche und Pluszeichen sowie die beiden Arten der Nummerierung jeweils identisch umgewandelt.

- Namensliste :: Vor den Namen ist ein Listenzeichen zu setzen.
- Noch :: Ein Eintrag, diesmal etwas länger, um den Zeilenumbruch zu
          zeigen, der bei dieser Listenart eine Einrückung vornimmt.
Namensliste
Vor den Namen ist ein Listenzeichen zu setzen.
Noch
Ein Eintrag, diesmal etwas länger, um den Zeilenumbruch zu zeigen, der bei dieser Listenart eine Einrückung vornimmt.

Auch Listen, in denen der Anfang hervorgehoben ist, sind möglich. Dafür ist zwischen den Listenzeichen und dem Ende der Hervorhebung ein doppelter Doppelpunkt zu setzen (::). Es sind aber nur die einfachen Listenzeichen möglich, mit Nummerierung funktioniert das nicht.

6.3 Wichtige Tastaturkürzel Org Modus

Kürzel Beschreibung
C-c l ’org-store-link – speichert Verweis
C-c c ’org-capture – Aufgaben/Notizen notieren, egal in welchem Puffer
C-c a ’org-agenda – Agenda Kommando
C-c b ’org-iswitchb – zu anderen org-mode Puffern wechseln. Wurde für helm-bm überschrieben.
C-c C-n springt zur nächsten Überschrift
C-c C-p springt zur vorherigen Überschrift
C-c C-f nächste Überschrift auf selber Höhe
C-c C-b vorherige Überschrift auf selber Höhe
C-c C-u zur übergeordneter Überschrift, falls vorhanden
C-c C-j zu Überschriften springen in einem Hilfspuffer, öffnet ein Minipuffer mit Hilfetext
  <TAB> - wie üblich, öffnet/schließt Überschriftenabschnitte
  <down> - springt zur nächsten Überschrift / <up> -
  <up> - springt zur vorherigen Überschrift
  <RET> - da wo der Cursor ist bleiben
  / - sparse tree Suche
  C-g - zurück zum Punkt, an dem man begann
S-TAB toggelt gesamtes folding
C-c AGr-< Tabelle erzeugen
TAB toggelt folding
M-links Überschrift hochwertiger
M-rechts Überschrift niederwertiger
M-hoch Überschrift incl. Inhalt nach oben verschieben
M-runter Überschrift incl. Inhalt nach unten verschieben
C-c C-t toggelt todo Status
C-c c ermöglicht es, in irgendeinen Puffer Aufgaben zu notieren, sie landen (bei mir) dann in die Datei aufgaben.org
C-c / öffnet sparse Menü, mit t werden alle todos angezeigt
S-left/right bei todo wird durch die Stati getoggelt
C-c . fügt Datum (timestamp) ein
C-u C-c . fügt Datum inkl. Uhrzeit ein
S-left/down mit Cursor auf timestamp wird ein Tag abgezogen
S-right/up mit Cursor auf timestamp wird ein Tag hinzugefügt
C-x n s nur noch aktueller Überschriftenbereich ist sichtbar
C-x n w wieder alles sichtbar machen

6.3.1 Überschrift

Eine neue Überschrift in der nächsten Zeile anlegen geht mit M+RET Die Überschrift und ihr Inhalt mittels M-Pfeil hoch/runter verschieben. Die Tiefe einer Überschrift mit M-linker/rechter Pfeil einstellen.

6.4 Tabellen und Tabellenkalkulation

Ein markierten Bereich kann mit C-c | in eine Tabelle umgewandelt werden. Dabei werden Kommas als Trenner genommen. Falls keine Kommas vorhanden sind, werden Leerzeichen oder Tabs als Trenner erkannt. Es ist immer nur ein Trennzeichen gültig, dabei gilt die Reihenfolge der Gültigkeit: Komma, Leerzeichen, Tabulator.

Eine neue Linie kann mit C-c - unter der aktuellen eingefügt werden.

Auf Tupel wird referenziert mit $Zeile$Spalte. Relativ referenzieren zur Spalte in der aktuellen Zeile geht mit $n, wobei n auch negativ sein kann. Wenn n gleich 0 ist, ist die momentane Spalte gemeint. $< zeigt auf die erste Spalte, und $> auf die letzte. $>>> zeigt dabei auf die drittletzte Spalte. Bei den relativen Referenzen auf Zeilen wird ein @ statt eines $ benutzt, ansonsten ist das Verhalten gleich dem bei den Spalten. Einen Bereich gibt man mit .. an, bsw. Spalte 2 bis 5 mit $2..$5. Konstanten können mit

#+CONSTANTS: irgendeinWert=12

definiert werden. Dabei ist die Konstante nur für die aktuelle Datei gültig. Um sie sofort zu aktivieren, muss auf ihr ein C-c C-c ausgeführt werden.

Sobald in einem Tupel mit = begonnen wird, folgt darauf eine Formel. Wenn der Tupel verlassen wird, wird die Formel ausgewertet, und durch das Ergebnis ersetzt. Unter der Tabelle wird die zuletzt genutzte Formel gesetzt. Ansehen und anpassen der genutzten Formel ist dann über C-c = möglich.

Um verschiedene Formeln zu nutzen, können diese unter die Tabelle geschrieben werden. Mit einem C-c C-c auf der Formel wird diese dann ausgeführt.

Die Summe einer Spalte kann schnell mit C-c + errechnet werden, wobei der Cursor in der letzten (leeren) Zeile in der entsprechenden Spalte stehen muss.

Hinter einer Formel kann mit Hilfe eines printf ähnlichen Kommandos die Ausgabe gesteuert werden. Um die Nachkommastellen auf zwei zu begrenzen bsw. mit ;%.2f.

Name Wert Wert 2 Ergebnis
Bully 2 3 5
Gesil 4 3 7
Gucky 12 32 44
Total 18 38 128.33
#+TBLFM: $4=$2+$3::@5$3=vsum(@2..@4)
#+TBLFM: @>$2=vsum(@2..@4)
#+TBLFM: @>$4=@2*@3*@4/$irgendeinWert;%.2f

6.4.1 Org-table umwandeln (Radio)

Wenn man html, LaTeX oder ähnliches editiert, möchte man nicht wirklich Tabellen von Hand erstellen. Der org-mode ermöglicht es glücklicherweise Tabellen vom org-mode in verschiedene andere Markup Sprachen umzuwandeln. Damit das funktioniert, muss der orgtbl-mode aktiviert sein. Weiteres siehe Link.

#+BEGIN_LaTeX
\begin{longtable}{l|rrr}\hline
% BEGIN RECEIVE ORGTBL table_name
Jan & 23 & 55 & 2.4\\
Feb & 21 & 16 & 0.8\\
March & 22 & 78 & 12.6\\
April & 24 & 21 & 0.9\\
% END RECEIVE ORGTBL table_name
\end{longtable}
#+END_LaTeX

#+ORGTBL: SEND table_name orgtbl-to-latex :splice t :skip 2
| Month | Days | Nr sold | per day |
|-------+------+---------+---------|
| Jan   |   23 |      55 |     2.4 |
| Feb   |   21 |      16 |     0.8 |
| March |   22 |      78 |    12.6 |
| April |   24 |      21 |     0.9 |
#+TBLFM: $4=$3/$2;%.1f

6.5 Auf andere Dateien verweisen

Hier mal der Versuch, im org-mode auf andere Dateien zu verweisen.

Kürzel Beschreibung
C-c C-l Verweis anlegen
C-c C-o Verweis verfolgen

Eine andere org-mode Datei: sub main org. Mit RET oder C-c C-o, während der Cursor auf dem Link liegt, wird ein weiteres Fenster mit der Datei geöffnet. Der Fokus liegt dann in jener Datei. Falls die Zieldatei noch nicht existiert wird sie angelegt. Der Pfad muss immer mit angegeben werden, für den momentanen Pfad mit „./“.

Für den Export in ein anderes Dateiformat (html, LaTeX, etc.) gilt zu beachten, dass nur der aktuelle Puffer exportiert wird, nicht aber die verlinkten Dateien.

6.6 Archivierung

Einzelne Überschriften, inklusive ihres Inhalts, können in die Archivdatei verschoben werden. Die Archivdatei ist i.d.R. ./<dateiname>_archive. In diesem Fall also ./main.org_archive.

Kürzel Beschreibung
C-c C-x C-a Verschiebt den Abschnitt in die Standard-Archiv Datei.
C-c C-x C-s Bisher konnte ich den Unterschied
C-c $ zwischen diesen drei Kommandos nicht erkennen!

6.7 Code-Blöcke

Code Blöcke im org-mode können (für mich) zwei Dinge, die das Leben stark vereinfachen. Zum Einen sorgen sie für eine bestimmte Formatierung beim Exportieren, und zum Anderen kann in ihnen Code ausgeführt werden.

Org-mode kennt verschiedene Code Blöcke, die einfach mit einem <, gefolgt von einem Code Block Identifier und TAB erzeugt werden können.

Id Block
s #+BEGIN_SRC ... #+END_SRC
e #+BEGIN_EXAMPLE ... #+END_EXAMPLE
q #+BEGIN_QUOTE ... #+END_QUOTE
v #+BEGIN_VERSE ... #+END_VERSE
c #+BEGIN_CENTER ... #+END_CENTER
l #+BEGIN_LaTeX ... #+END_LaTeX
L #+LaTeX:
h #+BEGIN_HTML ... #+END_HTML
H #+HTML:
a #+BEGIN_ASCII ... #+END_ASCII
A #+ASCII:
i #+INDEX: line
I #+INCLUDE: line

Damit der Block #+BEGIN_SRC nicht ausgeführt wird, wird hinter dem Eintrag :eval no eingetragen.

6.7.1 Code Block mit Ditaa

Im Abschnitt Ditaa bsw. sieht der Block wie folgt aus.

#+BEGIN_SRC ditaa :file ./images/ditaa_test.png :cmdline -r -s 0.8

+------+      +------+
| AB   |      | vf   |
| CDER |----->| erg  |-=-\
|cRED  |      |cBLU  |   |
+------+      +------+   |    /------\
                         |    | mod  |
                         \--->|{s}   |
                              |cGRE  |
                              \------/
#+END_SRC

6.7.2 Code Block mit elisp

Ein Code Block, der ausgeführt wird, erzeugt unter den Block ein Ergebnis. Dafür reicht es im Code Block C-c C-c auszuführen. Der erzeugte #+RESULT: Block wird dabei, falls schon vorhanden, aktualisiert.

#+BEGIN_SRC emacs-lisp :eval no
(defun eintest (name)
  "Dies ist eine elisp Funktion, die zum Test in einer org-mode
   Datei ausgeführt wird."
    (setq autor name)
    (setq erster "Autor:")
    (setq zweiter "Emacs Lisp Code Beispiel.")
    (setq dritter
        (concat zweiter "\n" erster " " autor "\n"
            (number-to-string (/ (random t) 3))))
    (message dritter))

(eintest "Andreas Kruse")
#+END_SRC
#+RESULTS:
: Emacs Lisp Code Beispiel.
: Autor: Andreas Kruse
: -27112859

6.7.3 Code Block mit shell

#+BEGIN_SRC sh :eval no
ls ./man
#+END_SRC
#+RESULTS:
| auctex.pdf           |
| de-refcard.pdf       |
| eintr.pdf            |
| elisp.pdf            |
| emacs-latex.pdf      |
| emacs.pdf            |
| gnuplot.pdf          |
| gnuplot_tutorial.pdf |
| gpcard.pdf           |
| latexreferenz.pdf    |
| orgcard.pdf          |
| orgguide.pdf         |
| org.pdf              |

6.7.4 Code Block mit Perl

#+BEGIN_SRC perl :eval no
my $val = 3 + 5.123;
my $ret = sprintf( "Der Wert von \$val ist %s.", $val);
#+END_SRC
#+RESULTS:
: Der Wert von $val ist 8.123.

6.8 Babel Pakete

Das sind Pakete, die mit org-mode schon mit geliefert werden. Sie sind gegebenenfalls noch zu aktivieren. Der Code der entsprechenden Pakete muss in Code-Blöcke eingebettet sein. Dieser Block wird dann mit C-c C-c, oder aber evtl. durch exportieren, ausgeführt. Damit die Code Abschnitte beim Exportieren nicht einfach so ausgeführt werden, trägt man am Anfang der Datei

# -*- org-confirm-babel-evaluate: t -*-

ein, oder stellt das via Customize ein. Dies sollte zwar der default Wert sein - aber sicher ist sicher.

6.8.1 Ditaa

Mit ditaa lassen sich relativ einfach Diagramme in ASCII erstellen, um sie dann durch exportieren als PNG zu erhalten.

Funktioniert unter Windows nicht, da dort die Java-Umgebung fehlt.

http://ditaa.sourceforge.net/#usage

Damit der Block nicht beim jeden Exportieren evaluiert wird, wird :eval no für den Code-Block gesetzt.

ditaa_test.png

6.9 Überschriften mit Tag   headline tag

6.9.1 Beispiel 1   example

Hier steht nichts.

6.9.2 Beispiel 2   example

Auch dieser Anschnitt ist leer.

6.9.3 Beschreibung   tag example description

Überschriften können Tags zugeordnet werden. Wenn der Cursor auf einer Überschrift liegt, reicht ein C-c C-c um Tags hinzuzufügen, zu ändern, oder zu löschen.

Angeblich kann man auch auf die Tags klicken, um eine Liste aller Überschriften zu erhalten, die den Tag enthalten. Äquivalent dazu existiert das Kommando C-c a m. Aber leider funktioniert das aus irgendeinen Grund nicht.

Mit C-c \ können Überschriften nach Tags gefiltert werden. Dabei werden dann die Sterne vor den entsprechenden Überschriften blau hinterlegt. Wie das wieder rückgängig gemacht werden kann, ohne den Puffer zu schließen, gehört zu den Geheimnissen, die es noch zu lösen gilt.

6.10 Von org-mode nach html

Das org Paket bietet unter anderem auch die Möglichkeit die Datei nach html zu exportieren. Die Steuerung des Aussehens wird dabei im Kopf mit verschiedenen Optionen gesetzt. Dabei kann das Einstellen des Aussehens über eine CSS Datei geschehen. Das Einbinden dieser CSS Datei (bei mir stylesheet.css) erfolgt dann wie folgt.

#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="stylesheet.css" />

Beispiel einer stylesheet Datei.

logos-banner.png

6.11 Von org-mode nach LaTeX und PDF

Um die org-mode Datei nach PDF zu exportieren reicht ein C-c C-e l p. Das funktioniert auch soweit hervorragend. Hier notiere ich meine Einstellungen, damit das Gute noch ein bisschen besser wird. ;-)

Dieses Dokument soll als Report von einer von mir erstellen LaTeX Header Datei erstellt werden, daher kommt in den Header der Datei folgende Einstellung.

  • #+LATEX_CLASS: akreport

Ein Quellcodeblock wird mit

#+BEGIN_SRC emacs-lisp -n -r

#+END_SRC

gesetzt. Die Flags bedeuten dabei:

-n
zur Nummerierung der Codezeilen.
-r
damit auf die Codezeilen referenziert werden kann.
-k
zeigt die Referenzen im Code an
:eval no
Code wird nicht evaluiert
:var
Liste von key=value Variablen, die dem Source-Code übergeben werden.
:results
output um alle Ausgaben des Codes auszugeben
:exports
code, results, both or none

Für weiter Informationen siehe org.html#var.

Nun sollen die Quellcodeblöcke auch mit Farbe formatiert werden. Dafür nutze ich die org-latex Einstellungen.

Erst einmal muss org-latex-default-packages-alist gesetzt werden. Für die LaTeX Umgebung listings zum Quellcode setzen sind die Pakete xcolor (Zeile 17) und listings (Zeile 18) einzutragen.

Aktiviert wird das Paket listings mit der Zeile 20.

Die Sprachen, die listings setzen soll, werden in Zeile 22 aufgelistet. Der erste Eintrag ist der Schalter in der #+BEGIN_SRC Umgebung, der zweite ist die Sprache, die listings benutzen soll.

Wie listings den Code formatieren soll, wird mit den Einstellungen in Zeile 47 definiert.

 1:    '(org-latex-default-packages-alist
 2:       (quote
 3:        (("utf8" "inputenc" t)
 4:         ("T1" "fontenc" t)
 5:         ("" "fixltx2e" nil)
 6:         ("" "graphicx" t)
 7:         ("" "grffile" t)
 8:         ("" "longtable" t)
 9:         ("" "wrapfig" nil)
10:         ("" "rotating" nil)
11:         ("normalem" "ulem" t)
12:         ("" "amsmath" t)
13:         ("" "textcomp" t)
14:         ("" "amssymb" t)
15:         ("" "capt-of" nil)
16:         ("" "hyperref" nil)
17:         ("" "xcolor" t)
18:         ("" "listings" t))))
19: 
20:   '(org-latex-listings t)
21: 
22:   '(org-latex-listings-langs
23:     (quote
24:      ((emacs-lisp "Lisp")
25:       (lisp "Lisp")
26:       (clojure "Lisp")
27:       (c "C")
28:       (cc "C++")
29:       (fortran "fortran")
30:       (perl "Perl")
31:       (cperl "Perl")
32:       (python "Python")
33:       (ruby "Ruby")
34:       (html "css")
35:       (html "HTML")
36:       (xml "XML")
37:       (tex "TeX")
38:       (latex "[LaTeX]TeX")
39:       (shell-script "bash")
40:       (gnuplot "Gnuplot")
41:       (ocaml "Caml")
42:       (caml "Caml")
43:       (sql "SQL")
44:       (sqlite "sql")
45:       (makefile "make"))))
46: 
47:   '(org-latex-listings-options
48:     (quote
49:      (("basicstyle" "\\small\\ttfamily")
50:       ("keywordstyle" "\\color{blue}\\bfseries")
51:       ("commentstyle" "\\small\\color{darkgray}\\rmfamily")
52:       ("stringstyle" "\\small\\ttfamily")
53:       ("breaklines" "true")
54:       ("breakatwhitespace" "true")
55:       ("showspaces" "false")
56:       ("numberstyle" "\\scriptsize")
57:       ("postbreak" "\\space")
58:       ("frame" "single"))))))

logos-banner.png

6.12 org-mode - tangle - Python

6.13 Agenda, Properties, Tags und Deadlines

Eine schöne Beschreibung dessen, was mit der org-mode Agenda möglich ist, findet sich unter Org Mode - Organize Your Life In Plain Text!

Die für meine Arbeitsablauf wichtigsten Tastaturkürzel sind:

Kürzel Beschreibung
C-c a Prefix für das Öffnen der verschiedensten Agenda Ansichten. Die Möglichkeiten werden in einem Minipuffer angezeigt.
C-c a a Agenda Ansicht für die aktuelle Woche.
C-c a t Auflistung der Todos, wie sie unter org-todo-keywords definiert sind.
C-c c Egal in welchem Puffer man gerade ist, wird ein Minipuffer eingeblendet, in dem man ein Todo notieren kann. Dieser wird dann dort gespeichert, wie er unter org-capture-templates eingestellt ist.
Auf der Todo Zeile  
C-c C-c Es kann ein Tag gesetzt werden.
C-c C-x C-c Im aktuellen Puffer wird die Agenda Column Ansicht erzeugt. Raus kommt man mit q in dieser Ansicht.
C-c C-x p Setzen eines Properties für den Todo Eintrag.
C-c C-d Setzen einer Deadline für den Todo Eintrag.
C-c C-s Setzen eines Schedules für den Todo Eintrag.
C-c C-w Verschieben (refile) in einer definierten Agenda Datei (org-capture-templates). Da ich bei mir nur eine Datei nutze, wird das von mir nicht genutzt.

6.13.1 org-alert und alert

Mit den Paketen org-alert und alert können Todos, deren Deadline abgelaufen ist, als Popup-Nachricht ausgegeben werden. Damit das funktioniert müssen die beiden Pakete in Emacs und libnotify auf den Rechner installiert sein.

Die Funktion selbst muss initial im Agenda-View gestartet werden. Dafür, und für ein eigenes Agenda-View, habe ich mir dann in der .emacs Datei eine eigene Funktion zusammen gezimmert, und die dann auf C-c f gelegt.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; org-alert - to show agenda deadlines as alert message ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'alert)
(require 'org-alert)
;; Damit das funktioniert muss libnotify installiert sein!
(setq alert-default-style 'libnotify)
;; Intervall der Alarm Anzeige in Sekunden
(setq org-alert-interval 3600)

;; customize my own agenda view
(defun my/org-agenda-view ()
  "My own agenda view fortnight with enable org-alert."
  (interactive)
  (org-agenda-list)
  (setq org-agenda-span 15)
  (setq org-agenda-start-on-weekday 1)
  (org-alert-enable)
  (org-alert-check)
  (org-agenda-goto-today))

;; After first execution the keystroke C-c a a will show this view,
;; too.
(global-set-key (kbd "C-c f") 'my/org-agenda-view)

logos-banner.png

6.14 org und imenu-list

Mit dem Kommando M-x imenu-list wird ein Fenster mit den Überschriften Innerhalb einer org-mode Datei angezeigt.

Siehe Paketbeschreibung zu imenu-list.

logos-banner.png

6.15 org-mode Einstellungen in der .emacs Datei

  ;;;; org-mode
  ;; The following lines are always needed. Choose your own keys.
  ;; not needed when global-font-lock-mode is on
  (add-hook 'org-mode-hook 'turn-on-font-lock)

  (global-set-key "\C-cl" 'org-store-link)
  (global-set-key "\C-cc" 'org-capture)
  (global-set-key "\C-ca" 'org-agenda)
  (global-set-key "\C-cb" 'org-iswitchb)
   ;; only one visible star at headlines
  (setq org-hide-leading-stars 'hidestars)
    ;; follow links by RET
  (setq org-return-follows-link t)
  ;; Capture mit "C-c c"
  (define-key global-map "\C-cc" 'org-capture)

  ;; paths where the org-agenda files may be
  (setq org-agenda-files (quote ("~/data/orgnotes/aufgaben.org"
                                 "~/data/orgnotes/repetetive.org")))

  ;; wo die Todo Einträge landen sollen
  (progn
    (setq org-capture-templates
        '(("t" "Aufgabe" entry (file+headline "~/data/orgnotes/aufgaben.org" "Aufgaben")
           "* TODO %^{Type Title}  %^g\nDEADLINE: %^{DEADLINE:}t\n%U\n%?" :prepend t :empty-lines-after 1)
          ("n" "Notiz" entry (file+headline "~/data/orgnotes/aufgaben.org" "Notizen")
           "* Note %^{Type Title}  %^g\n%U\n%?\n" :prepend t :empty-lines-after 1))))

  ; Targets include this file and any file contributing to the agenda - up to 9 levels deep
  (setq org-refile-targets (quote ((nil :maxlevel . 2)
                                   (org-agenda-files :maxlevel . 2))))

  ;; Ein "!" bedeutet Zeitstempel
  ;; Ein "@" bedeutet Notiz
  (setq org-todo-keywords
      '((sequence "TODO(t)"
                  "STARTED(s)"
                  "WAITING(w)"
                  "Note(n)"
                  "DELEGATED(g)"
                  "|"
                  "DONE(d)"
                  "CANCELLED(C)")))

  ;; Farben anpassen
  (setq org-todo-keyword-faces
        '(("TODO"        . (:foreground "#b70101" :weight bold))
          ("STARTED"     . (:foreground "yellow" :weight bold))
          ("WAITING"     . (:foreground "sienna" :weight bold))
          ("Note"        . (:foreground "orange" :weight bold))
          ("DONE"        . (:foreground "forestgreen" :weight bold))
          ("DELEGATED"   . (:foreground "forestgreen" :weight bold))
          ("CANCELLED"   . shadow)))

  ;; Fast TODO Selection
  (setq org-use-fast-todo-selection t)

  ;; deutsch as export language
  (setq org-export-default-language "de")

  ;; deutscher Kalender:
  (setq calendar-week-start-day 1
        calendar-day-name-array
          ["Sonntag" "Montag" "Dienstag" "Mittwoch"
           "Donnerstag" "Freitag" "Samstag"]
        calendar-month-name-array
          ["Januar" "Februar" "März" "April" "Mai"
           "Juni" "Juli" "August" "September"
           "Oktober" "November" "Dezember"])

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; org-alert - to show agenda deadlines as alert message ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'alert)
(require 'org-alert)
;; Damit das funktioniert muss libnotify installiert sein!
(setq alert-default-style 'libnotify)
;; Intervall der Alarm Anzeige in Sekunden
(setq org-alert-interval 3600)

;; customize my own agenda view
(defun my/org-agenda-view ()
  "My own agenda view fortnight with enable org-alert."
  (interactive)
  (org-agenda-list)
  (setq org-agenda-span 14)
  (setq org-agenda-start-on-weekday 1)
  (org-alert-enable)
  (org-alert-check)
  (org-agenda-goto-today))

(global-set-key (kbd "C-c f") 'my/org-agenda-view)

logos-banner.png

7 Emacs Grundlagen

Diesen Text schreibe ich als Übungstext um mich in Emacs einzuarbeiten. Dafür benötige ich erst einmal einen Text, damit ich etwas habe, womit ich arbeiten kann. Einstellungen für Emacs können in der Datei .emacs gespeichert werden.

7.1 Emacs Tastaturkürzel

7.1.1 Wichtige Tastaturkürzel allgemein

Kürzel Beschreibung
C-x C-s Datei Speichern
C-n eine Zeile runter
C-p eine Zeile rauf
C-f ein Zeichen weiter
C-b ein Zeichen zurück
C-v eine Bildschirmseite weiter
M-v eine Bildschirmseite zurück
M-f ein Wort weiter
M-b ein Wort zurück
M-a einen Satz zurück
M-e einen Satz weiter
C-a zum Zeilenanfang
C-e zum Zeilenende
M-< zum Pufferanfang
M-> zum Pufferende
M-r toggelt zischen Zeilenanfang der ersten, mittleren und letzten sichtbaren Zeile
C-t tauscht Buchstaben auf und vor dem Cursor
M-t tauscht Wörter auf und vor dem Cursor
M-l Kleinschreibung von Cursorposition bis Wortende
M-c Cursorpostion groß, bis Wortende Kleinschreibung
M-u Großschreibung von Cursorpostion bis Wortende
M– M-l Kleinschreibung des Wortes vor Cursorpunkt
M– M-c erster Buchstabe groß, der Rest klein, des Wortes vor Cursorpunkt
M– M-u Großschreibung des Wortes vor Cursorpunkt
C-l Aktuelle Zeile oben/Mitte/unten anzeigen
C-x C-f Datei öffnen/anlegen, ohne Dateiname wird Ordner mit dired geöffnet
C-x b Anderen Puffer öffnen
C-x C-b Liste der Puffer anzeigen
C-x k killt momentanen Puffer
C-x left vorherigen aktiven Puffer
C-x right nächsten aktiven Puffer
C-x 1 Nur noch das aktuelle Fenster stehen lassen
C-x 2 2tes Fenster anzeigen, horizental
C-x 3 2tes Fenster anzeigen, vertikal
C-x 0 aktuelles Fenster schließen
C-x o zu anderen Fenstern wechseln
C-x 5 2 Öffnet einen neuen Rahmen.
C-x 5 b Öffnet einen Puffer in einen neuen Rahmen.
C-x 5 f Öffnet eine Datei in einen neuen Rahmen.
C-x 5 d Öffnet Dired in einen neuen Rahmen.
C-x 5 o Springt zu einen anderen Rahmen.
C-x 5 0 Schließt den aktuellen Rahmen (Frame) falls es mehr als einen gibt.
C-x 5 1 Schließt alle Rahmen außer den aktuellen.
M-g g gehe zur Zeile …
C-o fügt an Cursorpostion Zeilenwechsel ein, Cursor bleibt an der Position
C-j fügt an der Cursorposition einen Zeilenwechsel ein und rückt die neue Zeile ein (TAB)
C-x C-o löscht alle Leerzeilen unterhalb/oberhalb der aktuellen
M-^ verbindet aktuelle Zeile mit vorheriger, Punkt ist beim ersten Wort der unteren Zeile, dieses Wort ist markiert
C-S-TAB Autovervollständigen anhand des aktuellen Puffers, ursprünglich M-/
M-d löscht folgendes Wort, geht auch über Zeilenende hinaus
M-z <char> zap-to-char, löscht von Cursorpunkt bis einschließlich dem ersten Auftreten von <char>
C-x z wiederhole letzten Befehl, folgende z wiederholen noch einmal bis ein nicht-z kommt
C-SPC setzt Marke
C-x C-x springt zwischen Markierungsanfang und Ende.
M-@ markiert von Cursorposition zu Ende des nächsten Wortes, Cursor bleibt an erster Position
C-x h markiert gesamten Puffer, Cursor ist am Anfang des Puffers
C-x TAB eine markierte Region einrücken
C-SPC C-SPC setzt Marke und macht sie unsichtbar, max. 16 Marken je Puffer sind möglich
C-u C-SPC springt zu den Marken
C-x C-SPC globaler Markring, springt zu den letzten Marken in allen Puffern
M-SPC löscht alle Leerzeichen bis auf eins an der aktuellen Cursorposition
C-S-BSPC löscht die ganze aktuelle Zeile
C-c C-x . timer Zeit ausgeben
C-c C-x , timer Zeit pausieren
C-u C-c C-x , timer Zeit stoppen
C-c C-x 0 timer Zeit auf 0 setzen
C-C C-X ; countdown timer
C-s vorwärts suchen
C-r rückwärts suchen
im Suchdialog: C-y Yank im Suchdialog einfügen
C-s C-w Wort ab Cursorpunkt vorwärts suchen
C-r C-w Wort ab Cursorpunkt rückwärts suchen
C-M-s regexp vorwärts suchen
C-M-r regexp rückwärts suchen
M-% suchen und ersetzen
M-x pwd gibt momentanen Ordner aus
M-x cd ändern des momentanen Ordners
C-x C-s Puffer speichern
C-x s alle Puffer speichern
C-x C-w Puffer unter neuen Namen speichern
C-x b erzeugt oder wählt Puffer aus Pufferliste
C-x right nächsten Puffer aus Pufferliste öffnen
C-x left vorherigen Puffer aus Pufferliste öffnen
C-x C-b zeigt Pufferliste an
C-x k löscht Puffer
M-h markiert gesamten Absatz
C-x i Inhalt einer anderen Datei an der Cursorposition einfügen
C-x n n Macht den nicht markierten Bereich unsichtbar. Es wird nur noch mit dem sichtbaren Bereich gearbeitet.
C-x n w Macht den Teil, der mit C-x n n unsichtbar gemacht wurde, wieder sichtbar
M-F10 Fenster maximieren oder auf Ursprungsgröße zurücksetzen.
F11 Fenster über gesamten Bildschirm vergrößern oder auf Ursprungsgröße zurückzusetzen.

7.1.2 Angezeigte Schriftgröße ändern

Kürzel Beschreibung
C-x C-+ angezeigte Schriftgröße erhöhen
C-x C-- angezeigte Schriftgröße verkleinern
C-x C-0 angezeigte Schriftgröße auf den Ausgangswert zurücksetzen

7.1.3 Visueller Zeilenumbruch

Kürzel Beschreibung
M-x visual-line-mode schaltet Visualisierung des visuellen Zeilenumbruchs ein/aus
M-x toggle-truncate-lines schaltet den visuellen Zeilenumbruch ein/aus
M-x toggle-word-wrap wenn visueller Zeilenumbruch eingeschaltet ist, dann Wörter umbrechen ein/aus

7.1.4 Makro aufzeichnen und ausführen

Kürzel Beschreibung
F3 Starte Makroaufzeichnung
F4 Beende Makroaufzeichnung, wenn nicht aufgezeichnet wird, wird letztes Makro ausgeführt
C-x C-k n Dem zuletzt definiertem Makro einen Namen zuweisen
C-x C-k b Dem zuletzt definiertem Makro einem Tastatur-Kürzel zuweisen
M-x <name> ein Makro mit Namen ausführen
M-x insert-kbd-macro RET <name> RET Makro mit Namen in einer Datei als Lisp-Code speichern
C-x C-k l Listet die letzten 100 Kommandos. Die können dann zu ein Makro gemacht werden.

Anzumerken wäre noch, dass das Ausführen von Makros nicht gerade die effizienteste Art ist, etwas auszuführen. Gerade wenn ein Makro sehr oft in einer größeren Datei ausgeführt werden soll, kann die Ausführung sehr lange dauern. Aber wie heißt es doch so schön: „Besser der Rechner kommt ins schwitzen, als ich.“.

7.1.5 Tabulator (Einrückung)

Im org-mode funktioniert die TAB Taste nicht als Einrücker. Abhilfe schafft hier das Kommando M-i, welches ein Tab einfügt.

Kürzel Beschreibung
M-i fügt an Cursorposition ein Tab ein
C-x TAB rückt die letzte markierte Region um ein Zeichen ein
C-<n> C-x TAB  
C-u <n> C-x TAB rückt Region um <n> Zeichen ein, <n> kann auch negativ sein

7.1.6 Bookmarks

Kürzel Beschreibung
C-x r m RET bookmark Datei und Cursorpunkt, Name ist der Dateiname
C-x r m <bm> RET bookmark Datei und Cursorpunkt unter dem Namen <bm>
C-x r b <bm> RET springt zur Datei und Cursorpunkt mit Namen <bm>
C-x r l listet alle bookmarks auf
7.1.6.1 Bookmarks Liste bearbeiten

In der bookmarks Liste kann man mit n und p durch die bookmarks wandern. Mit d wird ein bookmark als zu löschen markiert. Mit x werden die Markierungen ausgeführt. Mit q wird die Liste geschlossen. Mit RET wird der bookmark, der gerade unter dem Cursor liegt angesprungen.

7.1.7 Highlight

In den Einstellungen wurde „Global Hi Lock Mode“ aktiv gesetzt. Falls dies nicht der Fall ist, kann es mit M-x hi-lock-mode für den aktuellen Puffer, oder mit M-x global-hi-lock-mode für alle Puffer, aktiviert werden.

Um alle Highlights im Puffer zurückzusetzen, kann man mit M-x hi-lock-mode das Highlighting aus- und wieder einschalten. Dadurch werden alle gesetzten Highlights gelöscht. Es mag sinnvoll sein, vorher die Highlights mit M-s h w auszugeben.

Wenn man im I-Search Modus M-s h r eingibt, wird der Suchbegriff im gesamten Text hervorgehoben.

Kürzel Beschreibung emacs Kommando
M-s h w alle momentanen Highlights in den Puffer schreiben hi-lock-write-interactive-patterns
M-s h u <regexp> Highlight ausschalten unhighlight-regexp
M-s h r <regexp> Highlight erstellen highlight-regexp
M-s h p Phrase Highlight erstellen highlight-phrase
M-s h l ganze Zeile, in der <regexp> vorkommt, highlighten highlight-lines-matching-regexp

7.1.8 Register

Register können in a-z, A-Z und 0-9 gespeichert werden. In der Tabelle wird beispielhaft „r“ als Registeradresse angegeben.

Kürzel Beschreibung
C-x r SPC r Position in Register r schreiben
C-x r j r zu Position r springen
C-x r s r speichere Region in Register r
C-x r r r speichere Rectangel in Register r
C-x r i r füge Register r ein
C-u <n> C-x r n r speichere Nummer <n> in Register r
C-u <n> C-x r + r inkrementiere Nummer <n> mit Nummer in Register r, nur sinnnvoll wenn Nummer in Register ist
C-u <n> C-x r + inkrementiere Nummer <n> mit 1

Register werden nicht über die Sitzung hinaus gespeichert. Um bestimmte Positionen in Registern zu sichern können sie aber in die .emacs Datei geschrieben werden. Wirklich sinnvoll erscheint mir das aber nicht, da dies durch die Bookmarks besser abgedeckt wird.

Hier mal als Beispiel der Sprung zur .emacs Datei mit dem Register e.

(set-register ?e '(file . "~/.emacs"))

Das Paket register-list habe ich zusätzlich geladen. Um die Punkt-Register auf einfache Art und Weise als Sprungmarken zu nutzen, habe ich das Mapping wie in der Tabelle angeben verwendet.

Mit Hilfe des Helm Pakets werden mit dem Kommando C-c h x die Register im Helm Minipuffer angezeigt und lassen sich auswählen.

Mein Kürzel Orig. Kommando Beschreibung
C-x C-l M-x register-list register-list ausführen
C-x C-p <r> C-x r SPC <r> Position in Register <r> schreiben
C-x C-j <r> C-x r j <r> zur Position <r> springen
C-x C-r <r> C-x r r <r> Bereich in Register <r> speichern
C-x C-i <r> C-x r i <r> Register <r> einfügen
C-x C-h C-c h x helm-register, Register im helm Fenster anzeigen
C-x C-1 C-x r SPC 1 Position in Register 1 schreiben

Beschreibung von register-list.

7.1.9 Abkürzungs-Modus

Kürzel Beschreibung
C-x a g Abkürzung definieren. Das Wort vor dem Cursor wird genutzt. Für mehr Wörter M-<n> eingeben.
C-x a e Expandiert Abkürzung falls abbrev-mode disabled ist.
M-x abbrev-mode Schaltet Abkürzungsmodus ein/aus.

Abkürzungen werden in die Datei .../emacs/.emacs.d/abbrev_defs geschrieben.

;; keymapping für dabbrev (default ist M-/) angepasst
(global-set-key (kbd "<C-S-iso-lefttab>") 'dabbrev-expand)
(define-key minibuffer-local-map (kbd "<C-S-iso-lefttab>") 'dabbrev-expand)

7.1.10 Rectangle (Rechteckauswahl und Bearbeitung)

Mit C-SPC den Anfang der Rechteckauswahl markieren. Danach zum Endpunkt der Auswahl gehen. Das Ende ist der Punkt „vor“ dem Cursor!

Visuell schöner ist C-x SPC. Damit sieht man nur den Rectangle markiert.

Kürzel Beschreibung
C-x r t Rectangle String eingeben
C-x r k Rectangle löschen
C-x r M-w Rectangle speichern
C-x r y gespeicherten Rectangle einfügen
C-x r o Leerzeichen vor Rectangle setzen (einrücken)
C-x r N Rectanglezeilen nummerieren
C-x r c Rectangle durch Leerzeichen ersetzen

7.2 Occur und gefundenes ändern

7.2.1 Zeilen mit <regexp> auflisten/löschen/ändern

Mit M-x occur oder M-s o wird anhand eines <regexp> eine Liste der Zeilen erstellt, in denen <regexp> vorkommt. Diese Liste wird in einem neuen Puffer (*Occur *) geschrieben, in der die einzelnen Zeilen als Sprungmarken zum Originaltext fungieren.

Im Puffer *Occur * kann mit e in den Schreibmodus gewechselt werden. Hier kann man dann auf die üblichen Arten den Text anpassen, und mit C-c C-c werden diese Änderungen dann in den Originalpuffer übernommen.

Um Zeilen zu löschen, die <regexp> enthalten, oder nicht enthalten, können die Kommandos

  • M-x delete-matching-lines

und

  • M-x delete-non-matching-lines

genutzt werden.

7.2.2 Occur für Fortgeschrittene

Wenn man immer dieselben Schlüsselwörter via Occur (M-s o) in einer Datei sucht, kann man sich auch eine Lisp Funktion erstellen, die eben diese Schlüsselwörter bereinigt und listet.

(defun my/occur-list-keywords ()
  "List the keywords in an additionally window"
  (interactive)
  (delete-other-windows)
  (split-window-right -40)
  (occur "\\(?:FIXME\\|TODO\\|CLARIFY\\)")
  (switch-window)
  (toggle-truncate-lines 1)
  (text-scale-set 1)
  (text-scale-decrease 2)
  (read-only-mode 0)
  (goto-char 0)
  (while (re-search-forward "^[ \t]*[0-9]+:" nil t)
      (replace-match ""))
  (goto-char 0)
  (while (re-search-forward "^[ \t].*?" nil t)
      (replace-match ""))
  (read-only-mode 1)
  (goto-char 0))

(define-key global-map (kbd "<f9>") 'my/occur-list-keywords)

occur-list-keywords.png

7.3 Abschnittsformatierung

Um einen Abschnitt zu formatieren gibt man den Befehl M-q ein. Dadurch wird ein Zeilenumbruch spätestens in der 70ten Spalte eingefügt, und alle anderen Zeilenumbrüche des Absatzes entfernt. Desweiteren werden alle Leerzeichen nach einem Leerzeichen gelöscht, mit Ausnahme von doppelten Leerzeichen nach einem Satz. Falls nach einem Punkt nur ein Leerzeichen kommt, werden daraus keine zwei Leerzeichen gemacht, schließlich kann emacs nicht wissen, ob es sich wirklich um ein Satzende handelt, oder um eine Abkürzung.

7.4 Rechtschreibprüfung

Man kann die Rechtschreibprüfung am Wort nutzen, in dem am Ende des Wortes M-$ betätigt. Richtig gut ist der Modus Flyspell, der Wörter, die er als falsch erkennt, rot-fett-unterstrichen markiert.

flyspell.png

7.5 Fenstergröße ändern

Wenn mehrere Fenster geöffnet sind, kann mit C-x { das aktuelle Fenster horizental kleiner, und mit C-x } das aktuelle Fenster horizental größer gemacht werden. Mit den Kürzeln wird der Befehl shrink-window-horizontally oder enlarge-window-horizontally aufgerufen. Mit M-x balance-windows-area werden die Fenster wieder ausgeglichen, m.a.W. also in den Ursprungszustand gebracht.

Tipp: Um einen Befehl zu wiederholen kann C-x z eingegeben werden. Ein weiteres z wiederholt dann den letzten wiederholten Befehl. Um ein Fenster also schrittweise um 5 Schritte zu verkleinern, gibt man

C-x { C-x z z z z

ein.

7.6 Leerzeichen entfernen

delete-trailing-whitespace
entfernt alle Leerzeichen am Ende jeder Zeile, entweder im ganzen Puffer oder im markierten Bereich
whitespace-mode
zeigt alle Leerzeichen an, siehe auch WhiteSpace

7.7 Zeilen ein- und auskommentieren

Emacs bringt ab Werk schon Möglichkeiten mit, um das Kommentieren im Code zu vereinfachen.

Kürzel Kommando Beschreibung
M-; M-x comment-dwim Wenn eine Region markiert ist, wird diese ein- oder auskommentiert.
    Ohne Markierung wird das Kommentarzeichen ans Ende der Zeile gesetzt.
M-j   Zeilenumbruch mit Kommentarzeichen, Cursor ist ausgerichtet.
  M-x comment-region Setzt die markierte Region als Kommentar.
  M-x comment-or-uncomment-region Wie comment-region, löscht aber Kommentarzeichen, wenn vorhanden.
  M-x comment-box Schließt den markierten Bereich in eine Kommentarbox ein.

Falls für den Modus noch keine Kommtaranfang- und Kommentarendezeichen definiert sind, wird beim ersten Kommentieren im Puffer nach den Kommentarzeichen gefragt, und diese werden ab dann bis zum Schließen des Puffers genutzt. Um es dauerhaft für einen Modus zu defnieren setzt man comment-start und comment-end in der Modus-Datei.

(setq comment-start "#"
      comment-end   "")

logos-banner.png

7.8 Dired Puffer

Der Dired Puffer ist ein mächtiges Werkzeug, um Dateien zu löschen/umbenennen/erzeugen. Eine schnelle Einführung findet sich unter ergoemacs. Um den Puffer zu öffnen gibt man entweder M-x dired oder C-x d ein. Zusätzlich habe ich noch andere Dired Pakete geladen, bsw. Dired+.

7.8.1 Kopieren/löschen/umbenennen

Kürzel Beschreibung
RET Datei öffnen
q Ordner (dired Puffer) schließen
C Datei kopieren
R Datei umbenennen oder bewegen
d Datei löschen
D Markierte Datei(n) löschen
+ Neuen Ordner erzeugen
C-x C-f Neue Datei erstellen
Z Packen/entpacken mit gzip

7.8.2 Markieren mehrerer Dateien

Kürzel Beschreibung
m Datei markieren
u Markierung entfernen
U Alle Markierungen entfernen
% Öffnet Fenster mit einer Liste der möglichen Folgekommandos
% m Markieren nach Muster (regexp)

7.8.3 Navigation

Kürzel Beschreibung
g dired Puffer erneuern
^ gehe zum übergeordneten Ordner

7.8.4 Mehrere Dateien umbenennen

Kürzel Kommando Beschreibung
C-x C-q wdired-change-to-wdired-mode In den Modus zum Editieren des dired Puffers wechseln.
C-c C-c wdired-finish-edit Änderungen übernehmen.
C-c C-k    
C-c ESC wdired-abort-changes Änderungen nicht übernehmen, Editiermodus verlassen, abbrechen.

logos-banner.png

7.9 Datei verschlüsseln

Wenn beim Anlegen einer Datei vorher der Befehl epa-encrypt-file ausgeführt wird, wird zweimal nach einen Passwort gefragt. Nachdem man beidemale das selbe eingegeben hat, wird die Datei mit der zusätzlichen Endung gpg angelegt. Diese ist jetzt verschlüsset, und kann nur noch geöffnet werden, nachdem man das Passwort eingegeben hat. Immer wenn die Datei geändert wird, wird erneut zweimal nach ein Passwort gefragt. Dieses Passwort sollte man sich merken, da ansonsten die Daten in der Datei verschlüsselt bleiben.

Um zu verhindern, dass eine verschlüsselte Datei entschlüsselt im Backup Verzeichnis liegt, habe ich eine Lösung hier.

logos-banner.png

8 Emacs unter Windows

Am Windowsrechner hatte ich das Problem, dass das Scrollen mit C-n und C-p nur sehr langsam ging. Unter der Seite http://stackoverflow.com/questions/3631220/fix-to-get-smooth-scrolling-in-emacs habe ich dann eine Lösung gefunden, die bei mir gewirkt hat.

(setq redisplay-dont-pause t
      scroll-margin 1
      scroll-step 1
      scroll-conservatively 10000
      scroll-preserve-screen-position 1)

logos-banner.png

9 Große Dateien

Bei sehr großen Dateien und/oder Dateien mit vielen Zeilen kann Emacs sehr träge werden. Um das ganze zu Beschleunigen hilft es meist das Kommando M-x find-file-literally auszuführen. Dadurch wird zwar Highlight ausgeschaltet, und Emacs ist für die Datei dann im Fundamental Modus, dafür kann dann aber mit der Datei gearbeitet werden.

Wenn das auch nicht hilft, gibt es immer noch die Möglichkeit Emacs ohne die eigenen Einstellungen zu starten mit emacs -Q. Falls es danach flüssig läuft, sollte man sich die geladenen Module mal genauer anschauen. Einfach eins nach dem anderen wieder laden, und probieren ob Emacs immer noch flüssig arbeitet.

Eine weitere Möglichkeit soll das Paket vlf, was für „very large files“ steht, bieten. Das muss ich aber noch ausprobieren.

logos-banner.png

10 Timestamp einfügen mit Hilfe des org-mode Pakets

In einer nicht-org-mode Datei kann der timestamp von org-mode trotzdem genutzt werden. Dafür wird einfach das Kommando M-x org-time-stamp eingegeben. Dadurch öffnet sich calendar, in dem sich dann das gewünschte Datum auswählen lässt.

Das Kommando M-x org-date-from-calendar gibt das aktuelle Datum direkt ein.

Siehe auch in der .emacs Datei die Einstellungen für Datum und Uhrzeit eingeben.

logos-banner.png

11 Tilde eingeben mit Emacs - ein Sonderzeichen

Wie zum Teufel gebe ich das Tilde-Zeichen mit emacs ein? Wenn ich AltGr++ eingebe, kommt eine Fehlermeldung.

11.1 Im Fundamental Modus

Lösung für das Tilde-Problem: C-AGr-\

Jetzt erscheint in der Statuszeile ganz links ein „m“. Als nächstes zweimal AGr-~ eingeben und dann SPC. Noch einmal C-AGr-\ um diesen Eingabemodus wieder zu verlassen.

11.2 Im Org Modus

Tja, wenn ich das doch nur wüsste. Alles rumprobieren hat bisher noch gar nichts gebracht. ~ Hier gibt man C-x 8 AGr-~ SPC ein, und schon ist die ~ drin. Ein einfaches AGr-~ SPC reicht aber schon, wie schön.

logos-banner.png

12 Emacs Pakete

12.1 undo-tree

Dieses Paket ersetzt das Standard undo Verhalten von Emacs. Der alte undo Befehl C-_ funktioniert wie gewohnt. Zusätzlich gibt es jetzt den redo Befehl M-_ und die Möglichkeit, sich den Änderungsbaum mit C-x u anzusehen, und dort einen Stand auszuwählen. Das undo-tree Fenster verlässt man dann mit q.

logos-banner.png

12.2 Pufferliste mit ido-mode

Mit M-x ido-mode wird der Modus aktiviert. Wenn jetzt C-x b eingegeben wird, erscheint die Pufferliste in kurzform im Echofeld. Wenn man einen Teil eines Puffernames eingibt, wird die Liste dementsprechend kleiner.

Kürzel Beschreibung
M-x ido-mode aktiviert den ido-mode
C-x b führt den ido-mode aus und zeigt Pufferliste
C-s wandert vorwärts durch die Pufferliste
C-r wandert rückwärts durch die Pufferliste

logos-banner.png

12.3 ace-jump-mode

Dieses Packet musste nachträglich installiert werden. Das Einrichten geht nur durch anpassen der .emacs Datei.

Nach Eingabe von C-x C-a erscheint die Aufforderung, einen Buchstaben einzugeben. Diesen sucht das Packet dann am Anfang der Wörter im aktuellem Puffer. Wenn nur ein Auftreten gefunden wurde, springt der Cursor direkt dort hin. Bei mehrfachem Auftreten werden die entsprechenden Wörter mit einem Buchstaben markiert. Die Eingabe des Buchstaben lässt den C:ursor dann dort hin springen. Groß- und Kleinschreibung wird dabei ignoriert.

;; ace-jump-mode settings
(autoload
  'ace-jump-mode
  "ace-jump-mode"
  "Emacs quick move minor mode"
  t)
;; you can select the key you prefer to
(define-key global-map (kbd "C-x C-a") 'ace-jump-mode)

logos-banner.png

12.4 Multiple Cursors

Das Paket multiple-cursors ermöglicht es, dass mehrere Markierungen oder ein bestimmtes Wort ein eigenen Cursor zugeordnet bekommt. Dadurch kann dann an diesen Cursorn gleichzeitig das identische eingegeben werden.

Steht der Cursor am Anfang einer Zeile, können die vorherigen/nachfolgende Zeilen mit C-< / C-> markiert werden. Das Verhalten ist nützlich, um einen Bereich auszukommentieren.

Tastaturkürzel Beschreibung
C-S-c C-S-c Bei Regionen über mehrere Zeilen erhält jede Zeile einen Cursor.
C-> markiertes Wort noch einmal unten finden, wenn keine Markierung vorliegt, dann eine Zeile runter Cursor dublizieren
C-< markiertes Wort noch einmal oben finden, wenn keine Markierung vorliegt, dann eine Zeile hoch Cursor dublizieren
C-S-c C-> markiertes Wort im ganzen Puffer finden (bei sehr häufigen Auftreten des Wortes steigt die Prozessorlast stark an)

Video auf Youtube.

;; multiple-cursors
(require 'multiple-cursors)
(global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)
(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
(global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this)

logos-banner.png

12.5 Yasnippet

Kürzel Beschreibung
TAB expandiert den Trigger
C-c & C-s am Punkt einfügen
C-c & C-n neues Snippet erstellen
C-c & C-v snippet Datei öffnen

Man beachte das &-Zeichen in der Tabelle. Das Zeichen ist tatsächlich auch einzugeben.

Wenn ein neues Snippet angelegt wird, gibt man am Ende der Bearbeitung C-c C-c ein. Nachdem die folgenden Fragen beantwortet wurden, steht das Snippet auch schon zur Verfügung.

Sprungmarken werden mit $<n> gesetzt. Wobei <n> = 0 die letzte Sprungmarke ist. Mit Tab springt man dann von Marke zu Marke, und kann direkt etwas eingeben. Beim Konstrukt ${<n>:ein Text} steht bei der Sprungmarke schon der vorgegebene Text.

;; yasnippet
(require 'yasnippet)
(yas-global-mode 1)

logos-banner.png

12.6 Icicles

Gestartet wird der Modus mit M-x icy-mode.

  • Es erweitert die Ausgaben beim Auto-Completion.
  • Bei M-x werden nach Eingabe von TAB in einem Extrafenster alle möglichen Kommandos angezeigt.
  • Beim Öffnen von Dateien und Puffern arbeitet Icicles ebenfalls. Ob ich es besser finde als den Ido-Mode weiß ich aber noch nicht.
  • Bei den Bookmarks arbeitet Icicles ebenfalls.

Den automatischen Start habe ich in der .emacs Datei wieder auskommentiert, da es mir so schien, als ob es sich mit dem Helm Paket beist.

;; (require 'icicles)
;;  (icy-mode 1)

logos-banner.png

12.7 Auto-Complete

Gestartet wird der Modus mit M-x auto-complete-mode.

Nachdem der Modus gestartet wurde, wird beim Schreiben ständig versucht, das aktuelle Wort zu vervollständigen. Falls es nur ein Wort im aktuellem Puffer gibt, welches passt, kann mit ein TAB das Wort direkt vervollständigt werden. Bei mehreren Möglichkeiten öffnet sich ein Popup-Fenster.

Praktisch ist auch, dass beim Eingeben eines Pfades auto-complete automatisch die möglichen Dateien/Ordner zur Auswahl stellt.

Ich habe zusätzlich zum Hauptpaket das Paket ac-abbrev geladen. Somit steht der Liste der Auto-Complete Möglichkeiten auch der Inhalt der Abkürzungsdatei zur Verfügung. Weitere Pakete für verschiedenste Anwendungsmöglichkeiten existieren zwar, sind für mich aber z.Z. noch nicht von Bedeutung.

Mit M-x customize-group RET auto-complete RET kommt man zu den Einstellungen. Dort habe ich global-auto-complete-mode aktiviert, und bei AC Modes den org-mode hinzugefügt.

https://github.com/auto-complete/auto-complete

(require 'auto-complete)
(require 'auto-complete-config)
(ac-config-default)

logos-banner.png

12.8 register-list

Dieses Paket, eine Erweiterung des built-in Register, ermöglicht es, dass alle Register nach dem Kommando M-x register-list in einem separaten Fenster angezeigt werden. Wenn der Cursor auf dem Registerzeichen steht, bringt ein RET darauf einen an die entsprechende Stelle, oder kopiert den Inhalt in den Killring, je nach Typ des Register.

Mit ’d’ können Register in der Liste zum Löschen markiert werden. Das betätigen von ’x’ führt das Löschen dann aus.

Kürzel Beschreibung
e the key for this register.
E the value for this register.
+ increment key at point.
- decrement key at point.
d the register at point for deletion.
c the register at point for concatenation.
u the register at point.
U all registers.
x deletions or concatenations.
f fontification of value strings.
g the register menu display.
M-x register-list-tab cycle between the key, the type and the value.
Q the register menu.
;; package register-list
(require 'register-list)
;; own keystrokes for register working
(global-set-key (kbd "C-x C-l") 'register-list)
(global-set-key (kbd "C-x C-p") 'point-to-register)
(global-set-key (kbd "C-x C-j") 'jump-to-register)
(global-set-key (kbd "C-x C-r") 'copy-to-register)
(global-set-key (kbd "C-x C-i") 'insert-register)

logos-banner.png

12.9 Kill between delimiters

Dieses Paket ermöglicht es, den Inhalt zwischen zwei Trennzeichen (FROM:, TO:) zu löschen. Dabei werden die beiden Trennzeichen ebenfalls gelöscht. Diese beiden Trennzeichen können auch identisch sein, müssen es aber nicht. Die Trennzeichen werden dabei für FROM: vor dem Cursorpunkt und für TO: nach dem Cursorpunkt gesucht.

  • Wenn für FROM: kein Zeichen eingegeben wird, wird von TO: bis Pufferanfang gelöscht.
  • Wenn für TO: kein Zeichen eingegeben wird, wird von FROM: bis Pufferende gelöscht.
  • Wenn weder für FROM:, noch für TO: ein Zeichen eingegeben wird, wird der ganze Pufferinhalt gelöscht.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; delete the stuff within delimiters ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'delim-kill)

logos-banner.png

12.10 goto-chg

Das Paket goto-chg ermöglicht es, zu den letzten Änderungen in einem Puffer zu springen.

Als Tastaturkürzel habe ich bei mir

C .

für den Sprung zur letzten Änderung, und

C ,

für das entgegengesetzte Springen eingestellt.

(require 'goto-chg)

(global-set-key [(control ?.)] 'goto-last-change)
(global-set-key [(control ?,)] 'goto-last-change-reverse)

logos-banner.png

12.11 dot-mode

dot-mode vi like

Wenn M-x dot-mode aktiviert wurde, wiederholt der Befehl

C .

die letzten Eingaben/Kommandos. Goto-chg funktioniert dann nicht, da ich den selben Keystroke benutze.

(require 'dot-mode)
(add-hook 'find-file-hooks 'dot-mode-on)

logos-banner.png

12.12 Das Programm silversearcher-ag und das Paket ag

Das Programm silversearcher-ag ermöglicht es sehr schnell in Dateien nach einen String zu suchen. Es arbeitet ähnlich wie grep oder ack-grep. Das Emacs Paket ag ermöglicht es mit dem Kommando M-x ag silversearcher-ag auszuführen und das Ergebnis in einem Unterfenster auszugeben. Weiter Informationen finden sich auf der Homepage https://github.com/Wilfred/ag.el.

Die Homepage des silversearcher-ag Projekts ist https://github.com/ggreer/the_silver_searcher.

logos-banner.png

12.13 Permanentes Highlight des letzten Suchstrings

Mit dem Paket evil-search-highlight-persist ist permanentes Highlight des letzten Suchstrings möglich. Das Highlight kann dann mit C-x SPC wieder ausgeschaltet werden.

Hinweis
Da ich mittlerweile das Paket phi-search benutze, funktioniert das mit der Tastenkombination C-s, C-r und M-% leider nicht mehr.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Permanentes Highlight des letzten Suchstrings ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'evil-search-highlight-persist)
(global-evil-search-highlight-persist t)

logos-banner.png

12.14 Das helm Paket

Das Emacs Paket helm ist ein Paket, welches die Handhabung von Emacs stark beeinflusst. Eine sehr gute Einführung findet sich unter helm-intro.

Die Einstellungen, die ich dort übernommen habe sind:

Kürzel Beschreibung
<tab> helm-execute-persistent-action; rebind tab to run persistent action
C-i helm-execute-persistent-action; make TAB works in terminal
C-z helm-select-action; list actions using C-z
M-x helm-M-x
C-: ac-complete-with-helm
C-c h b helm-bookmarks
M-y helm-show-kill-ring
C-x b helm-mini
C-x C-f helm-find-files
C-c h o helm-occur
C-h SPC helm-all-mark-rings
C-c h x helm-register
;;;;;;;;;;
;; helm ;;
;;;;;;;;;;
(require 'helm-config)
; rebind tab to run persistent action
(define-key helm-map (kbd "<tab>") 'helm-execute-persistent-action)
; make TAB works in terminal
(define-key helm-map (kbd "C-i") 'helm-execute-persistent-action)
; list actions using C-z
(define-key helm-map (kbd "C-z") 'helm-select-action)

(global-set-key (kbd "M-x") 'helm-M-x)

(global-set-key (kbd "C-:") 'ac-complete-with-helm)
(define-key ac-complete-mode-map (kbd "C-:") 'ac-complete-with-helm)

;; C-c C-b wird im org-mode von der Funktion "vorherige Überschrift
;; auf selber Höhe" überschrieben, besser Kürzel C-c h b nutzen
(global-set-key (kbd "C-c h b") 'helm-bookmarks)
(global-set-key (kbd "M-y") 'helm-show-kill-ring)
(global-set-key (kbd "C-x b") 'helm-mini)
(global-set-key (kbd "C-x C-f") 'helm-find-files)
(global-set-key (kbd "C-c h o") 'helm-occur)
(global-set-key (kbd "C-h SPC") 'helm-all-mark-rings)
(global-set-key (kbd "C-c h x") 'helm-register)
;; Damit es zu den Register Kommandos passt, noch einmal mit anderen
;; Keystroke
(global-set-key (kbd "C-x C-h") 'helm-register)
;; Position in Register 1 schreiben
(global-set-key (kbd "C-x C-1") '(lambda () (interactive) (point-to-register ?1)))
;; (global-set-key [f7] '(lambda () (interactive) (register-to-point ?1)))

logos-banner.png

12.15 Helm und Yasnippet

Das Paket helm-c-yasnippet stellt Kommandos bereit, mit denen Schlüsselwörter aus Yasnippet Helm-typisch ausgewählt werden können. Zum einfachen Aufruf wurde das Kürzel C-c y auf das Kommando helm-yas-complete gelegt.

(global-set-key (kbd "C-c y") 'helm-yas-complete)

logos-banner.png

12.16 Das Projectile Paket

Mit Hilfe des Projectile Pakets und des Helm Pakets können Projektordner einfach angesprungen und dort einzelne Dateien ausgewählt werden. Damit das funktioniert muss im entsprechenden Ordner eine leere Datei .proctectile angelegt werden, und das Projectile Paket in diesen Ordner einmal genutzt werden. Danach ist es dem System bekannt, und kann ausgewählt werden. Eine gute Einführung findet sich auf der helm-projectile Seite.

Kürzel Beschreibung
C-c p p Listet alle besuchten Projekte.
C-c p f Listet die Dateien des aktuellen Projekts.
C-c p h Listet die bekannten Projekte.
C-c p i Cache neu anlagen
C-c p z Aktuellen Puffer dem Cache hinzufügen
projectile-purge-file-from-cache Aktuellen Puffer aus Cache entfernen
projectile-purge-dir-from-cache Aktuellen Ordner aus Cache entfernen
;; mit customize gesetzt
 '(projectile-completion-system (quote helm))
 '(projectile-global-mode t)

;;;;;;;;;;;;;;;;;;;;;
;; helm projectile ;;
;;;;;;;;;;;;;;;;;;;;;
(setq helm-projectile-sources-list
    '(helm-source-projectile-projects
      helm-source-projectile-files-list))
(setq projectile-switch-project-action 'helm-projectile-find-file)
(setq projectile-switch-project-action 'helm-projectile)

logos-banner.png

12.17 neotree

Das Paket neotree ist vergleichbar mit dem Vim Paket nerdtree. Das ein- und ausblenden des Dateimanagers habe ich auf die Taste F12 gelegt.

Kürzel im neotree Puffer Beschreibung
n nächste Zeile
p vorherige Zeile
SPC, RET oder TAB Öffnet Dateien, Ordner werden auf- oder zugeklappt
g Neu aufbauen
A Maximieren oder minimieren des neotree Fensters
H Anzeigen/verstecken von „hidden“ Dateien
C-c C-n Erzeugt eine Datei oder einen Ordner wenn der Name mit „/“ endet im aktuellen Ordner
C-c C-d Löscht aktuell markierte Datei oder Ordner
C-c C-r Markierte Datei oder Ordner umbenennen
C-c C-c Markierten Ordner als obersten (Wurzel-) Ordner anzeigen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; neotree mit F12 togglen ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key (kbd "<f12>") 'neotree-toggle)

logos-banner.png

12.18 Mit Google Übersetzen

Mit Hilfe dieses Paketes kann innerhalb von Emacs mit Hilfe von Google übersetzt werden. Meine Einstellungen habe ich dabei so gewählt, dass mit C-c t das Wort unter dem Cursor oder der markierte Teil übersetzt wird, und mit C-c T das zu Übersetzende eingegeben werden kann. Die Auswahl der Quell- und Zielsprache habe ich dabei fest auf „von Englisch nach Deutsch“ eingestellt. Die Übersetzung erscheint dabei als Popup-Fenster am Cursorpunkt.

;; Einstellungen via M-x customize
 '(google-translate-default-source-language "en")
 '(google-translate-default-target-language "de")
 '(google-translate-output-destination (quote popup))
 '(google-translate-show-phonetic t)

;;;;;;;;;;;;;;;;;;;;;;;;
;; google translation ;;
;;;;;;;;;;;;;;;;;;;;;;;;
(require 'google-translate)
(require 'google-translate-default-ui)
(global-set-key "\C-ct" 'google-translate-at-point)
(global-set-key "\C-cT" 'google-translate-query-translate)

logos-banner.png

12.19 phi Pakete

12.19.1 phi-search

Das Paket phi-search nützlich beim Durchsuchen eines Textes. Weitere Informationen finden sich unter phi-search auf github.

Wie vom Author des Pakets vorgeschlagen habe ich folgende Kürzel eingerichtet.

Kürzel Beschreibung
C-s Re-mapping des Emacs vorwärts Suchbefehls auf phi-search.
C-r Re-mapping des Emacs rückwärts Suchbefehls auf phi-search-backward.
M-% Re-mapping des Emacs Such- und Ersetzenbefehls auf phi-replace-query.
< Im phi-search Unterfenster rückwärts weitersuchen
> Im phi-search Unterfenster vorwärts weitersuchen
(global-set-key (kbd "C-s") 'phi-search)
(global-set-key (kbd "C-r") 'phi-search-backward)
(global-set-key (kbd "M-%") 'phi-replace-query)
(define-key phi-search-default-map (kbd "<") 'phi-search-again-or-previous)
(define-key phi-search-default-map (kbd ">") 'phi-search-again-or-next)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; phi-autopair has to be required explicity ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'phi-autopair)
(phi-autopair-global-mode)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; phi-search-dired has to be required explicity ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'phi-search-dired)

12.19.2 phi-grep

Das Paket phi-grep stellt die folgenden Kommandos bereit.

  • phi-grep-in-file — grep in einer einzelnen Datei.
  • phi-grep-in-directory — Rekursives grep in einem Ordner. Damit können Suchworte in allen Dateien unterhalb eines Verzeichnisses gesucht werden. Es wird dabei erst nach dem Verzeichnis gefragt, und danach kommt die Abfrage „CheckOnly“. Das „CheckOnly“ fragt nach einen Muster, nachdem die zu findenen Dateien eingeschränkt werden können. Als letztes kommt dann der Ausdruck, nachdem gesucht werden soll.

\noindent Im dired Modus Puffer kommen noch folgenden Kommandos hinzu.

  • phi-grep-dired-in-dir-at-point — grep im Ordner am Cursorpunkt
  • phi-grep-dired-in-file-at-point — grep in einer Datei am Cursorpunkt
  • phi-grep-dired-in-marked-files — grep in allen markierten Dateien
  • phi-grep-dired-in-all-files — grep in allen gelisteten Dateien
  • phi-grep-dired-dwim — automatisch eines der Kommandos

\noindent Das Ergebnisfenster ist editierbar. Nachdem man C-g oder im Ergebnisfenster RET drückt, kommt eine Abfrage, ob die Änderungen in den ursprünglichen Puffern übernommen werden sollen, oder nicht.

Der Vorteil des Paketes liegt für mich in der Tatsache, dass es ohne das originale grep Programm läuft, sonden rein in elisp geschrieben ist. Dies macht es gerade für Windows Rechner interessant.

logos-banner.png

12.20 swiper und helm

Das Paket swiper gibt einen Überblick während einer regexp Suche in einem Puffer. In M-x customize habe ich „Swiper Completion Method“ auf „Helm“ gesetzt. Als Keystroke setzte ich in der .emacs Datei C-c s. Danach kann man ein oder mehrere Suchmuster eingeben, und die gefunden Zeilen werden helm-artig gelistet. Diese Einträge können dann mit Pfeil-auf/ab oder C-n/p angewählt werden. Im Originalpuffer wird dann sogleich diese Zeile angesprungen. Mit RET wird die markierte Zeile angesprungen, und swiper wird beendet.

swiper-helm.png

Emacs Swiper Youtube Video

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; swiper - use pattern as regexp and list it ;;
;; my standard method is swiper-helm          ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'swiper)
(global-set-key (kbd "C-c s") 'swiper-helm)
;; (global-set-key (kbd "C-c s") 'swiper) ;; falls swiper--helm nicht funktioniert

logos-banner.png

12.21 Zoom Window

Dieses Paket kann bei mehreren Fenstern hilfreich sein. Wenn im aktiven Fenster der Keystroke C-x C-z eingegeben wird, wird dieses Fenster auf die volle Framegröße gebracht, und die Menüleiste verändert ihre Farbe. Nach einen nochmaligen C-x C-z werden wieder aller Fenster wie vorher angezeigt.

(require 'zoom-window)
(global-set-key (kbd "C-x C-z") 'zoom-window-zoom)
(setq zoom-window-mode-line-color "Cyan")

logos-banner.png

12.22 Evil Numbers

Das Paket ermöglicht es die erste Nummer in der aktuellen Zeile, vom Cursor aus gesehen zu inkrementieren/dekrementieren.

Kürzel Beschreibung
C-+ Addiert 1 auf die gefundene Zahl.
C-- Subtrahiert 1 von der gefundenen Zahl.
(require 'evil-numbers)
(global-set-key (kbd "C-+") 'evil-numbers/inc-at-pt)
(global-set-key (kbd "C--") 'evil-numbers/dec-at-pt)

logos-banner.png

12.23 Window switch Pakete

Mit Hilfe des Pakets wn-mode ist es möglich zwischen den Fenstern mit M-1 bis M-0 zu wechseln.

Das Paket switch-window ermöglicht es, die Nummer der Fenster in den Fenstern füllend anzuzeigen, und durch betätigen der Nummer das Fenster anzuspringen. Ein Bild davon kann man sich hier machen.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; wn mode to switch to other windows via M-1 ... M-0 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(wn-mode)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; switch-window set to keystroke M-s M-w ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'switch-window)
(global-set-key (kbd "M-s M-w") 'switch-window)

logos-banner.png

12.24 Kommentieren

Das Paket comment-dwim-2 verbessert das built-in Kommentieren von Emacs. In der Zeile/Region einfach M-; eingeben, und schon wird die Zeile/Region kommentiert. Beim nochmaligen ausführen wird entkommentiert, und an Ende der Zeile ein Kommentarzeichen eingefügt. Wenn eine drittes mal der Befehl ausgeführt wird, werden die Kommentarzeichen gelöscht.

Ansehen kann man sich das Verhalten hier.

(global-set-key (kbd "M-;") 'comment-dwim-2)

logos-banner.png

12.25 Visible Bookmarks

Das Paket bm unterstützt sichtbare Lesezeichen innerhalb eines Puffers. Es ist nicht mit dem built-in bookmark zu verwechseln, sondern dient dazu, innerhalb eines Puffers mit einfachen Tastaturkürzeln Lesezeichen zu setzen/löschen und sie in der Reihenfolge, in der sie gesetzt worden sind, anzuspringen.

In den Einstellungen habe ich die permanente Speicherung der Lesezeichen aktiviert. Dafür war es notwendig, den Code aus der Beschreibung des Paketes in die .emacs Datei zu übernehmen.

Das anspringen der Lesezeichen über mehrere Puffer ist nicht aktiviert. Somit bleiben die Lesezeichen zwar erhalten, aber für die Auswahl eines Puffers ist weiterhin das bookmark-built-in zuständig.

Damit helm und bm zusammen arbeiten, habe ich zusätzlich das Paket helm-bm geladen. Das von mir eingestellte Tastaturkürzel C-c b überschreibt dabei das alte Verhalten, alle offenen org-mode Puffer aufzulisten. Die Lesezeichen der offenen Puffer zu listen und anspringen zu können, erscheint mir aber als wichtiger.

Die Tastaturkürzel habe ich vom Autor übernommen.

Kürzel Kommando Beschreibung
C-S-F2 bm-toggle setzt und entfernt Lesezeichen, sonderbarerweise ist das C-S-F2 und C-F2 funktioniert nicht
F2 bm-next springt zum nächsten Lesezeichen
S-F2 bm-previous springt zum vorherigen Lesezeichen
C-c b helm-bm listet alle Lesezeichen von bm aus geöffneten Puffern

Auch die Maus kann benutzt werden, um am linken Rand (fringe) Lesezeichen zu setzen/löschen und anzuspringen.

Maus Kommando Beschreibung
mouse-5 bm-next-mouse springt zum nächsten Lesezeichen
mouse-4 bm-previous-mouse springt zum vorherigen Lesezeichen
mouse-1 bm-toggle-mouse setzt und entfernt Lesezeichen
;; M$ Visual Studio key setup.
(global-set-key (kbd "<C-f2>") 'bm-toggle)
(global-set-key (kbd "<f2>") 'bm-next)
(global-set-key (kbd "<S-f2>") 'bm-previous)

;; Click on fringe to toggle
;; bookmarks, and use mouse wheel to
;; move between them.
(global-set-key (kbd "<left-fringe> <mouse-5>") 'bm-next-mouse)
(global-set-key (kbd "<left-fringe> <mouse-4>") 'bm-previous-mouse)
(global-set-key (kbd "<left-fringe> <mouse-1>") 'bm-toggle-mouse)

;; This is necessary to activate presistent bookmarks.

;; Make sure the repository is loaded as early as possible
(setq bm-restore-repository-on-load t)
(require 'bm) ; this line is really really necessary

;; Loading the repository from file when on start up.
(add-hook' after-init-hook 'bm-repository-load)

;; Restoring bookmarks when on file find.
(add-hook 'find-file-hooks 'bm-buffer-restore)

;; Saving bookmark data on killing a buffer
(add-hook 'kill-buffer-hook 'bm-buffer-save)

;; Saving the repository to file when on exit.
;; kill-buffer-hook is not called when Emacs is killed, so we
;; must save all bookmarks first.
(add-hook 'kill-emacs-hook '(lambda nil
(bm-buffer-save-all)
(bm-repository-save)))

;; Update bookmark repository when saving the file.
(add-hook 'after-save-hook 'bm-buffer-save)

;; Restore bookmarks when buffer is reverted.
(add-hook 'after-revert-hook 'bm-buffer-restore)

;;;;;;;;;;;;;;;;;;;;;;;;;;
;; helm and bm together ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; overwrites the org-mode command to list all active org buffers
(global-set-key (kbd "C-c b") 'helm-bm)

logos-banner.png

12.26 MWIM - Move where I mean

Das Paket mwim setzt den Cursor an das Ende oder den Anfang einer Zeile, so wie es gemeint ist. Ich habe es auf die Standard Keystrokes C-a und C-e gelegt.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; mwim - move where I mean ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(autoload 'mwim-beginning-of-code-or-line "mwim" nil t)
(autoload 'mwim-beginning-of-line-or-code "mwim" nil t)
(autoload 'mwim-end-of-code-or-line "mwim" nil t)
(autoload 'mwim-end-of-line-or-code "mwim" nil t)
(global-set-key (kbd "C-a") 'mwim-beginning-of-code-or-line)
(global-set-key (kbd "C-e") 'mwim-end-of-code-or-line)

logos-banner.png

12.27 smooth scrolling

Das Paket smooth-scrolling lässt den Cursor beim Scrollen mit C-n und C-p weicher scrollen. In der .emacs Datei habe ich nur den Aufruf

(require 'smooth-scrolling)

stehen. Die weiteren Einstellungen kann man dann mit M-x customize erledigen.

Das Paket nicht mit smooth-scroll verwechseln.

logos-banner.png

12.28 navi-mode

Um das Paket navi-mode zu nutzen, müssen die drei Pakete

  1. navi-mode
  2. outshine
  3. outorg

installiert werden. Danach noch in der .emacs Datei

(require 'navi-mode)

eintragen, und los kann es gehen.

Das Paket stellt einen read-only Puffer zur Verfügung, der ähnlich wie occur funktioniert, nur das die Suchbegriffe vorgegeben werden. Gedacht ist das Plugin für org-mode Dateien. Damit steht dem Autor die Dokumentenstruktur als extra Seite zur Verfügung, um schnell und einfach durch das Dokument zu navigieren, ohne die Übersicht zu verlieren.

Mit M-s n wird das Fenster geöffnet und/oder aktualisiert. Dabei wird der aktivierte Cursor in das jeweils andere Fenster aktiviert.

Im navi-mode Fenster wird mit den Tasten 1 … 8 der Level bestimmt, der angezeigt wird. Bei org-mode Dateien entspricht dies der Anzahl der Sterne vor einer Überschrift.

Kürzel Beschreibung
M-s n navi-mode starten, zwischen beiden Fenstern springen
M-s s  
M-s M-s  
s zwischen beiden Fenstern springen, s funktioniert nur im navi-mode Fenster
p Eine Zeile hoch, wie C-p
n Eine Zeile runter, wie C-n
DEL Eine Seite hoch
SPC Eine Seite runter
h Hilfe aufrufen
q Zum Ort im Arbeitspuffer springen und navi-mode Puffer schließen, leider bleibt das Fenster weiterhin offen, kann aber mit C-x 1 geschlossen werden
d Ort in Arbeitspuffer anzeigen
o Zum Ort im Arbeitspuffer springen, geht auch mit Enter
TAB Ort im Arbeitspuffer anzeigen und Abschnitte zyklisch anzeigen, wie im org-mode bei Überschriften
r Nur Abschnitt am Cursor sichtbar machen
w Alles wieder sichtbar machen, r negieren

Bei navi-mode sind desweiteren einige Schlüsselwörter vordefiniert, nach denen es sucht. Für die eigenen Bedürfnisse können diese angepasst und erweitert werden.

key keyword-symbol searches for
f :FUN functions, macros etc.
v :VAR vars, consts, customs etc.
x :OBJ OOP (classes, methods etc)
b :DB DB (store and select)
a :ALL all

Eine weiter Beschreibung findet sich unter http://orgmode.org/worg/org-tutorials/org-outside-org.html

Mittlerweile habe ich navi mode durch imenu-list ersetzt!

navi-mode.png

logos-banner.png

12.29 elmacro

Dieses Paket elmacro stellt die Fähigkeiten zu Verfügung, die letzten Kommandos oder das letzte Makro in emacs-lisp Code auszugeben. Damit es schon beim Start aktiviert ist, gibt man in der .emasc Datei

(elmacro-mode 1)

ein. Damit stehen die Kommandos

  • elmacro-show-last-commands
  • elmacro-show-last-macro

zu Verfügung.

logos-banner.png

12.30 imenu-list

Mit imenu können Funktionen in einer Code Datei direkt angesprungen werden. Das Paket imenu-list fügt dieser Funktion die Fähigkeit hinzu, diese Funktionen als Liste in einen Extra Fenster aufzulisten.

Gestartet wird imenu-list mit

M-x imenu-list-minor-mode

Innerhalb des Listenpuffers IList wird mit RET die Funktion direkt angeprungen. Mit SPC wird die Funktion im Code Puffer angezeigt, der Cursor aber bleibt im imenu-list Fenster.

Gerade im org-mode ist imenu-list recht nützlich, um die Dateistruktur in einem extra Fenster zu sehen. Für den schnellen Zugriff habe ich das Kommando auf die F9 Taste gelegt. Dieses Fenster kann mit q wieder geschlossen werden.

(global-set-key (kbd "<f9>") 'imenu-list)

logos-banner.png

12.31 discover

Das Paket discover stellt ein Kontextmenü bereit, welches bei komplizierteren Emacs Kommandos aufpoppen, und somit eine Auswahl zur Vervollständigung des Kommandos, unterstützen soll. Bisher unterstützt es dired, register und isearch. Da ich register und isearch durch andere Kommandos und Pakete meinen Bedürfnissen schon angepasst habe, funktioniert discover nur noch bei dired und occur. Da ich dired selten bewusst nutze, ist dieses Paket genau dort eine große Hilfe. Innerhalb eines dired Puffers wird mit der Eingabe eines ? das Kontextmenü geöffnet, und schon sehe ich eine Auswahl der möglichen Folgekommandos.

In der .emacs Datei muss nach der Installation noch

(require 'discover)
;; (global-discover-mode 1)

eingetragen werden, um es global zu aktivieren.

Da es sich nicht unbedingt mit allen Einstellungen, und Arbeitsabläufen, die ich mir zusammengestellt habe, verträgt, ist es bei mir allerdings deaktiviert.

logos-banner.png

12.32 cycbuf

Mit dem Paket cycbuf kann durch die Puffer gewechselt werden, wobei dabei jeweils temporär die Liste der Puffer angezeigt wird. Da die vordefinierten Keystrokes sich mit dem org-mode beißen, habe ich sie meinen Bedürfnissen angepasst. Mit C-c C-left geht es direkt zum vorherigen Puffer in der Pufferliste, und mit C-c C-right in den nächsten Puffer. Die Pufferliste bleibt solange bestehen, bis eine andere Tastatureingabe erfolgt.

cycbuf.png

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; cycbuf to cycle smooth through buffers ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'cycbuf)
;; The keys, which are defined in cycbuf-init are:
;;  meta right         cycbuf-switch-to-next-buffer
;;  meta left          cycbuf-switch-to-previous-buffer
;;  meta super right   cycbuf-switch-to-next-buffer-no-timeout
;;  meta super left    cycbuf-switch-to-previous-buffer-no-timeout

;; The pre-defined keys are already used by org-mode, so.
;; (add-hook 'after-init-hook 'cycbuf-init)
(global-set-key (kbd "C-c <C-left>")  'cycbuf-switch-to-previous-buffer-no-timeout)
(global-set-key (kbd "C-c <C-right>") 'cycbuf-switch-to-next-buffer-no-timeout)

logos-banner.png

12.33 zop-to-char

Das Paket zop-to-char ist eine Erweiterung für das Emacs built-in zap-to-char. Im Gegensatz zum Original löscht es nicht automatisch den Text zwischen den Cursorpunkt und dem nächsten Auftreten des eingegeben Zeichens, sondern markiert diesen Bereich und zeigt im Minipuffer die möglichen Folgekommandos an. Während man im zop-to-char Modus ist, können auch andere - oder dasselbe - Zeichen eingegeben werden, und die Markierung springt dann zum nächsten Auftreten des zuletzt eingegebenen Zeichens. Wenn man dasselbe Zeichen immer wieder als nächste „Sprungmarke“ benutzen will, reicht auch ein <right>, zurück kann man dann mit <left>.

Der Teil, der gelöscht wird, wird im Kill-Ring gespeichert.

zop-to-char.png

Emacs zop-to-char Youtube Video

Wie vom Paketauthor vorgeschlagen, habe ich in der .emacs Datei das zap-to-char Kommando M-z <char> auf zop-to-char gelegt.

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; zop-to-char,                            ;;
  ;; a replacement of zap-to-char M-z <char> ;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (global-set-key [remap zap-to-char] 'zop-to-char)

logos-banner.png

12.34 csv-mode

Das Paket csv-mode erleichtert den Umgang mit zeichenseparierten Werten. Der Standardtrenner ist „,“. In den meisten Fällen benutze ich allerdings das „;“ als Trenner. Dies kann man in den Einstellungen (customize) anpassen.

Entgegen dem Vorschlag des Pakets lade ich das Paket nicht automatisch, sondern nur über das Kommando M-x csv-mode. Danach wird der Trenner farblich hervorgehoben. Sehr schön ist auch, dass damit das Kommando csv-align-fields zur Verfügung steht. Damit werden die Spalten visuell getrennt, was die Lesbarkeit stark verbessern kann. Das Kommando M-x csv-unalign-fields macht dies dann wieder rückgängig.

Die wichtigsten Kommandos sind mit Keystrokes belegt.

Keystroke Kommando
C-c C-v csv-toggle-invisibility
C-c C-t csv-transpose
C-c C-c csv-set-comment-start
C-c C-u csv-unalign-fields
C-c C-a csv-align-fields
C-c C-z csv-yank-as-new-table
C-c C-y csv-yank-fields
C-c C-k csv-kill-fields
C-c C-d csv-toggle-descending
C-c C-r csv-reverse-region
C-c C-n csv-sort-numeric-fields
C-c C-s csv-sort-fields

logos-banner.png

12.35 guide key

Das Paket guide-key zeigt die weiteren möglichen Kommandos auf den Anfang eines Kommandos im Minipuffer an. Dies kann insbesondere bei eher selten genutzten Keystrokes hilfreich sein. Bei mir habe ich nur den Mode eingeschaltet und die guide-key-sequence auf t gesetzt. Für weitere Möglichkeiten sei auf die Homepage von guide-key verwiesen.

guide-key.png

logos-banner.png

12.36 show-marks

Das Paket show-marks listet die Marken innerhalb des Puffers auf. Mit hoch-runter können die markierten Zeilen direkt angesprungen werden. Mit q verlässt man das show-marks Fenster und schließt es. Der Unterschied zum Kommando helm-mark-ring ist, dass bei helm die gewählte Zeile mit RET angesprungen, und dass helm Fenster geschlossen wird. Bei show-marks jedoch wird die Zeile direkt angesprungen. Das ist praktisch um im Puffer durch die markierten Zeilen zu springen.

(global-set-key (kbd "C-c m") 'show-marks)

logos-banner.png

12.37 clipmon

Das Paket clipmon hat zwei Funktionen, die ganz nützlich sein können.

Wenn der clipmon-mode aktiv ist, werden Texte, die außerhalb von Emacs in den Zwischenspeicher kommen, auch in den Kill-Ring von Emacs abgelegt. Alleine dies finde ich gerade unter Windows nützlich, da dort ein vernünftiges Clipboard fehlt.

Wenn clipmon-autoinsert aktiviert wird, werden die Texte, die außerhalb von Emacs in den Zwischenspeicher kommen, direkt in den Puffer geschrieben.

Kommando Beschreibung
clipmon-mode Der clipmon minor-mode.
clipmon-mode-start Startet den clipmon minor-mode.
clipmon-mode-stop Stoppt den clipmon minor-mode
clipmon-autoinsert-start Startet das Schreiben des externen Zwischenspeichers in den Puffer.
clipmon-autoinsert-stop Stoppt das Schreiben des externen Zwischenspeichers in den Puffer.
clipmon-autoinsert-toggle Wechselt zwischen clipmon-autoinsert aktiv und nicht aktiv.

Alle möglichen Einstellungen können mit

M-x customize-group RET clipmon

gemacht werden.

logos-banner.png

12.38 engine-mode

Wenn das Paket engine-mode aktiviert ist, kann aus Emacs heraus eine Suchanfrage direkt im Browser gestartet werden. Damit erspart man sich ein paar Schritte, wenn man gerade am emacsen ist. ;-)

Da ich den Standard Prefix-Tastaturkürzel schon bei sparse org-agenda nutze, habe ich in der engine-mode.el die Zeile

  • (engine/set-keymap-prefix (kbd "C-c /"))

auskommentiert. In der .emacs Datei fügte ich Dafür

  • (engine/set-keymap-prefix (kbd "C-c e"))

ein. Schade das der Entwickler des Pakets den Tastaturkürzel fest in den Code programmiert hat.

Meine eingestellten Suchmaschinen, die über einen Buchstaben nach Eingabe des Prefix-Tastaturkürzels ausgewählt werden können, sind:

d
duckduckgo.com
g
google.de
w
de.wikipedia.org
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; engine-mode                                               ;;
;; To start search in browser out of emacs.                  ;;
;; I have comment out the line                               ;;
;; ;; (engine/set-keymap-prefix (kbd "C-c /"))               ;;
;; because of I need the keystroke to sparse the org-agenda. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'engine-mode)
(engine-mode t)
;; use Emacs' built-in eww browser:
;; (setq engine/browser-function 'eww-browse-url)

(engine/set-keymap-prefix (kbd "C-c e"))

(defengine duckduckgo
  "https://duckduckgo.com/?q=%s"
  :keybinding "d")

(defengine google
  "http://www.google.de/search?ie=utf-8&oe=utf-8&q=%s"
  :keybinding "g")

(defengine wikipedia
  "http://www.wikipedia.org/search-redirect.php?language=de&go=Go&search=%s"
  :keybinding "w"
  :docstring "Searchin' the wikis.")

(defengine youtube
  "https://www.youtube.com/results?search_query=%s"
  :keybinding "y")

logos-banner.png

12.39 org Präsentation mit ox-reveal

Der Text als Präsentation.

12.39.1 Create Presentation with org-mode

With Emacs, org-mode and reveal.js it is possible to create a HTML presentation.

12.39.1.1 Where to find

The Emacs package and the original description is at https://github.com/yjwen/org-reveal/

The reveal.js package is at https://github.com/hakimel/reveal.js/releases.

12.39.1.2 Setting in .emacs
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ox-reveal, presentation with org-mode ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-to-list 'load-path "~/.emacs.d/packages/org-reveal/")
(require 'ox-reveal)

(setq org-reveal-root "~/.emacs.d/packages/org-reveal/reveal/")
(setq org-reveal-single-file t)

12.39.2 The org file

Create a org file to export it to the presentation.

12.39.2.1 Header

The header of the file should look like this.

#+TITLE: Presentation with org-mode
#+AUTHOR: Andreas Kruse
#+EMAIL: leak@online.ms
#+STARTUP: indent content hidestars
#+OPTIONS: H:4 toc:nil ^:nil
#+OPTIONS: reveal_center:t reveal_progress:t reveal_history:nil reveal_control:t
#+OPTIONS: reveal_rolling_links:t reveal_keyboard:t reveal_overview:t num:nil
#+REVEAL_THEME: blood
#+REVEAL_TRANS: concave
#+REVEAL_PLUGINS: (notes highlight markdown)
#+REVEAL_TITLE_SLIDE_BACKGROUND: ./images/SpongeBob.jpg
#+REVEAL_TITLE_SLIDE_TEMPLATE: <h1>%t</h1> <h4>%a</h4> <h4>%e</h4> <h6>%d</h6>
12.39.2.2 Speakers notes

This is for the speaker, only.

Speakers notes will be shown in an extra browser window (Shift arrow or S - both do not work - but why?).

This is to show it only to the speaker but not to the audit.

  #+BEGIN_NOTES
  This is for the speaker, only.
  #+END_NOTES
12.39.2.3 Parts

Each header generates one slide.

However, the entry #+REVEAL: split will split a slide to two slides.

This slide is because of the entry #+REVEAL: split.

12.39.2.4 Lists

Lists will be written as usual, but the way the list will appear can be set by fragmeant styles.

The code is #+ATTR_REVEAL: :frag (<name>).

The names are:

  • grow
  • shrink
  • roll-in
  • fade-out
  • highlight-red
  • highlight-green
  • highlight-blue
  • appear
12.39.2.5 Themes

Several themes are available. They are at .../js/reveal/css/theme.

  • beige.css
  • black.css
  • blood.css
  • league.css
  • moon.css
  • night.css

Long list shall not be shown in one slide.

  • serif.css
  • simple.css
  • sky.css
  • solarized.css
  • source
  • template
  • white.css
12.39.2.6 Slide transitions

Available transitions set in header at REVEAL_TRANS are:

  • default
  • cube
  • page
  • concave
  • zoom
  • linear
  • fade
  • none

12.39.3 Export

To export the org-file to presentation the ox-reveal libary has to be load at first.

  • M-x load-libary RET ox-reveal RET
  • Afterwards with C-c C-e RR the html file can be created.

12.39.4 Using

  1. Arrow keys left/right to move around the main line of the slides.
  2. Arrow keys up/down to move around the minor line of the slides.
  3. ESC to see all slides at onces.
  1. Arrow keys left/right to move around the main line of the slides.
  2. Arrow keys up/down to move around the minor line of the slides.
  3. ESC to see all slides at once.

logos-banner.png

12.40 bookmark+

Das Paket bookmark+ erweitert das built-in bookmark um Funktionen.

Kommando Beschreibung
C-x p Prefix zum Setzen von Bookmarks
C-x p m Setzt für die aktuelle Datei ein bookmark
C-x j Prefix zum Anspringen eines Bookmarks
C-x j j Öffnet helm-mode-bookmark-jump, so wie C-c h b,
C-x r l Listen und editieren von Bookmarks

In der .emacs Datei muss (require ’bookmark+) eingetragen werden!

logos-banner.png

12.41 sunshine forecast

Mit dem Paket sunshine kann eine Wettervorhersage von openweathermap auf Emacs gezaubert werden. Dafür muss man sich erst einmal auf openweathermap anmelden und sich eine appid holen. Den Ort der Wettervorhersage gibt man dann, für Deutschland, als Postleitzahl und der Länderkennung DE an.

Für das schnelle Öffnen habe ich den Aufruf auf die Taste F8 gelegt. Schließen kann man das Fenster mit q.

sunshine-forecast.png

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; sunshine, weather forecast                ;;
;; xxxx                                      ;;
;; xxxxxxxxxx                                ;;
;; xxxxxxxxxx                                ;;
;; API key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'sunshine)
(setq sunshine-location "88161,DE")
;; (setq sunshine-location "49762,DE")
(setq sunshine-appid "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
(setq sunshine-units (quote metric))
(setq sunshine-show-icons t)
(global-set-key (kbd "<f8>") 'sunshine-forecast)

logos-banner.png

12.42 elpa-mirror

Mit Hilfe des Pakets elpa-mirror werden die installierten Pakete in ein Verzeichnis kopiert. Dieses Verzeichnis kann als Repository angegeben werden. Dies ist nützlich, wenn man die Pakete auf einen anderen System in Emacs einbinden möchte.

Zum Erstellen des Verzeichnisses führt man das Kommando M-x elpamr-create-mirror-for-installed aus. Initial muss man das Zielverzeichnis einmal angeben, welches schon vorher existieren muss.

In der .emacs Datei gibt man das selbst angelegte Paketverzeichnis als Paketarchiv an und startet dann M-x package-list-packages.

(setq package-archives '(("myelpa" . "~/myelpa")))

logos-banner.png

12.43 highlight-thing

Mit dem Paket highlight-thing wird das Wort unter dem Cursor im Puffer gehighlightet.

(require 'highlight-thing)
(global-highlight-thing-mode)

logos-banner.png

12.44 cycle-resize

Das Paket cycle-resize stellt Funktionen zur Verfügung, mit dem das aktuelle Fenster (wenn denn auch mehrere zu Verfügung stehen) einfach und schnell in seiner vertikalen oder horizontalen Größe verstellt werden kann. Die vorgegebenene Werte sind 80% – 50% – 20% – 50% des Rahmens.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; cycle-resize, resize splitted windows ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'cycle-resize)
(global-set-key (kbd "C-M-v") 'cycle-resize-window-vertically)
(global-set-key (kbd "C-M-h") 'cycle-resize-window-horizontally)
;; default values are 80 -- 50 -- 20 -- 50
;; (setq cycle-resize-steps '(80 50 20 50))

logos-banner.png

12.45 auto-yasnippet

Das Paket auto-yasnippet ermöglicht es, dass während des Schreibens ein Schnippsel erstellt, und ausgeführt werden kann. Dies ist erst einmal auf ein Schnippsel beschränkt, allerdings kann das aktuelle Schnippsel schnell und einfach als yasnippet Schnippsel gespeichert, und so auch später weiter genutzt werden. Dafür wird das Kommando aya-persist-snippet bereitgestellt.

In meiner .emacs Datei sind nicht die vorgeschlagenden keybindings eingestellt, sondern M-C-w für das Erstellen, und M-C-y für das Ausführen.

(global-set-key (kbd "M-C-w") #'aya-create)
(global-set-key (kbd "M-C-y") #'aya-expand)

Während des Schreibens wird vor den Austauschausdrücken ein ~ vorangestellt.

Dies ist ein ~auto-yasnippet Beispiel.

Sollte der Ausdruck Teil eines Wortes sein, wird der Ausdruck in Backticks eingerahmt.

Eisenbahn`gleis'anlage.

Falls sich ein Ausdruck wiederholt, wird beim Schreiben die Wiederholung zeitgleich ebenfalls editiert.

Dies ist ein ~auto-yasnippet Beispiel.
Das Paket ~auto-yasnippet kann tolle Sachen machen.

Beim Erstellen eines auto-yasnippet Schnippsels wird entweder die aktuelle Zeile verwendet, oder die markierte Region.

logos-banner.png

12.46 org bullets

Mit Hilfe des Pakets org-bullets werden die Sterne in den Kapitelüberschriften durch utf-8 Zeichen (bullets) ersetzt.

Damit es beim Start einer org-mode Datei gleich mitgeladen wird, muss in der .emacs Datei das folgende eingetragen werden.

(require 'org-bullets)
(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))

logos-banner.png

12.47 yafolding

Gerade für Python Code habe ich lange nach ein Paket gesucht, das elegant Code-Blöcke einklappt. Das m.M.n. beste dafür ist das Paket yafolding. Da es in Abhängigkeit der Einrückung arbeitet ist es für Python Code geradezu prädestiniert.

Keystroke Kommando
C-c C-M-return yafolding-toggle-all
C-c C-S-return yafolding-hide-parent-element
C-c C-return yafolding-toggle-element

Um es im python-mode gleich zu aktivieren habe ich folgendes in die .emacs Datei eingetragen.

(add-hook 'python-mode-hook
          (lambda () (yafolding-mode)))

(define-key yafolding-mode-map (kbd "C-c <C-M-return>") 'yafolding-toggle-all)
(define-key yafolding-mode-map (kbd "C-c <C-S-return>") 'yafolding-hide-parent-element)
(define-key yafolding-mode-map (kbd "C-c <C-return>") 'yafolding-toggle-element)

logos-banner.png

12.48 Org-mode Header als bookmark

Dieses Paket org-bookmark-heading ermöglicht bookmarks auf den Header in einer org-mode Datei. Dafür werden keine neuen Keystrokes benötigt, es muss nur der Cursor auf dem Header (nicht die *) stehen, während man, wie gewohnt, ein bookmark anlegt.

logos-banner.png

12.49 one-time-pad-encrypt

Das Verfahren „one time pad encrypt“ verschlüsselt einen Text mit einen Schlüssel, der die Länge des Textes haben sollte. In Emacs kann dies mit dem Paket one-time-pad-encrypt erledigt werden. Der zu verschlüsselnde Text muss dafür markiert werden, und der Befehl one-time-pad-encrypt ausgeführt werden. Für das Entschlüsseln wird der selbe Befehl genutzt.

one-time-pad-encrypt.png

logos-banner.png

12.50 helm-org-rifle

Das Paket helm-org-rifle ist für das Suchen in org-Dateien hilfreich. Meine Einstellungen in der .emacs Datei sind:

  (global-set-key (kbd "C-c r r") 'helm-org-rifle)
  (global-set-key (kbd "C-c r b") 'helm-org-rifle-current-buffer)
  (global-set-key (kbd "C-c r d") 'helm-org-rifle-directories)
  (global-set-key (kbd "C-c r f") 'helm-org-rifle-files)
helm-org-rifle
Zeigt die Ergebnisse aller offenen org-mode Puffer
helm-org-rifle-current-buffer
Zeigt die Ergebnisse des aktuellen Puffers
helm-org-rifle-directories
Zeigt die Ergebnisse aus gewählten Verzeichnissen.
helm-org-rifle-files
Zeigt die Ergebnisse aus gewählten Dateien.

logos-banner.png

12.51 yankpad

Das Paket yankpad ermöglicht es, dass man Text strukturiert in eine definierte org-mode Datei ablegt. Diese Texte können später dann einfach eingefügt werden. Schön ist es auch, dass man die Texte wie bei Yasnippet mit Sprungmarken und vordefinierten Auswahltexten anlegen kann. Eine ausführliche Anleitung findet sich auch auf der Homepage des Pakets.

Hier mal ein Beispiel

  * Beispiel
   ** Text
  Die ist ein Text mit ${1:Sprungmarke} und Auswahltext ${2:$$(yas-choose-value`("Bla" "Blub"))}.

Damit ich das ganze auch über Keystrokes nutzen kann, habe ich folgendes in die .emacs Datei geschrieben.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; yankpad                                            ;;
;; https://github.com/Kungsgeten/yankpad ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq yankpad-file "~/orgnotes/yankpad.org")

(global-set-key (kbd "C-x C-y C-y") 'yankpad-insert)
(global-set-key (kbd "C-x C-y C-c") 'yankpad-set-category)

logos-banner.png

12.52 Use-Package

Die Pakete werden mit Hilfe des Pakets use-package aufgerufen.

(unless (package-installed-p 'use-package)
    (package-refresh-contents)
    (package-install 'use-package))

logos-banner.png

12.53 Try

Kann benutzt werden, um Pakete nur einmal auszuprobieren.

(use-package try
    :ensure t)

logos-banner.png

12.54 expand-region

Wenn der Cursor innerhalb eines Bereichs liegt, bsw. durch Klammern eingegrenzt, kann mit dem Kommando er/expand-region die Markierung auf den Bereich erweitert werden. Wird das Kommando wiederholt, vergrößert sich der markierte Bereich. Mit er/contract-region setzt man die Markierung schrittweise wieder zurück.

  (use-package expand-region
    :bind
    (("C-;"   . er/expand-region)
     ("C-M-;" . er/contract-region)))

logos-banner.png

12.55 embrace

There are three commands: `embrace-add’, `embrace-change’ and `embrace-delete’ that can add, change, and delete surrounding pairs respectively. You can bind these commands to your favorite key bindings.

There is also a dispatch command `embrace-commander’. After invoking `embrace-commander’, you can hit:

  • `a’ for `embrace-add’
  • `c’ for `embrace-change’
  • `d’ for `embrace-delete’
  (use-package embrace
    :bind
    (("C-(" . embrace-commander)))

logos-banner.png

12.56 emojify

To enable emojify mode globally use `global-emojify-mode’. :) :-) ;-) :D

  (use-package emojify
    :ensure t
    :init
    (global-emojify-mode 1)
    :config
  )

logos-banner.png

12.57 ob-async

Das Paket ob-async ermöglicht es, dass während ein org-mode Code-Block arbeitet, man weiterhin im Puffer editieren kann. Dafür muss dann die Option :async in der #BEGIN_SRC Zeile eingetragen werden.

  (use-package ob-async
    :init
    :config
    (add-to-list 'org-ctrl-c-ctrl-c-hook 'ob-async-org-babel-execute-src-block)
  )

logos-banner.png

12.58 ivy-yasnippet

12.59 orgalist

Das Paket orgalist ermöglicht das Nutzen von Listen (Todos etc.) in Nicht-Org-Dateien.

logos-banner.png

12.60 fill-function-arguments

Mit Hilfe des Pakets fill-function-arguments kann man bsw. Listen oder Dictionaries (Python) zeilenweise zu formatieren. Damit der Aufruf des Kommandos fill-function-arguments-dwim auch wie gewünscht funktioniert muss der Cursor innerhalb der Klammern stehen.

Beispiel von-nach:

f = [ 1,  2, 3, 4, 5 ]

f = [
 1,
 2,
 3,
 4,
 5
]

d = { 'a' : 2, 'b' : 4, 'c' : 8}

d = {
 'a' : 2,
 'b' : 4,
 'c' : 8
}

logos-banner.png

13 Spezielle Einstellungen in der .emacs Datei

Hier zusätzliche Einträge in der .emacs Datei.

13.1 Yes-or-No

Da es mich stört, bei yes-or-no Abfragen jedesmal das ganze Wort einzutippen, habe ich folgende Zeile meiner .emacs Datei hinzugefügt. Jetzt reicht ein einfachen y oder n.

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

13.2 LaTeX in Emacs

  ;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; LaTeX AUCTeX reftex ;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq TeX-auto-save t)
  (setq TeX-parse-self t)
  (setq-default TeX-master nil)
  (require 'tex-site)
  (require 'auctex-latexmk)
  (auctex-latexmk-setup)
  (add-hook 'LaTeX-mode-hook 'visual-line-mode)
  (add-hook 'LaTeX-mode-hook 'flyspell-mode)
  (add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)
  (add-hook 'LaTeX-mode-hook 'turn-on-reftex)
  (setq reftex-plug-into-auctex t)
  (setq TeX-PDF-mode t)

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; LaTeX extras                                     ;;
  ;; - <TAB> and <S-TAB> fold sections as in org-mode ;;
  ;;   <TAB> only works at sections without *         ;;
  ;; - C-c C-a lets run all LaTeX commands until PDF  ;;
  ;;   is created                                     ;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (require 'latex-extra)
  (add-hook 'LaTeX-mode-hook 'latex-extra-mode)

  ;;;;;;;;;;;;;
  ;; cdlatex ;;
  ;;;;;;;;;;;;;
  (add-hook 'LaTeX-mode-hook 'turn-on-cdlatex)   ; with AUCTeX LaTeX mode

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; LaTeX preview pane pdf ;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (latex-preview-pane-enable)

13.3 Magic LaTeX Buffer

Package to show LaTeX Code as it is compiled – WYSIWYG.

13.4 LaTeX und org-mode

Damit org-mode Dateien beim Export nach LaTeX – PDF ein einheitliches Format erhalten, habe ich mir eine LaTeX Header Template Datei geschrieben, die dann in der org-mode Datei genutzt werden kann.

Die LaTeX Header Template Datei wird mit #+LATEX_CLASS eingebunden. Die Variablen können dann mit #+LATEX_HEADER angepasst werden.

Der Anfang dieser org-mode Datei sieht dann folgendermaßen aus.

#+LATEX_CLASS: akreport
#+LATEX_HEADER: \setauthor{Andreas Kruse}
# #+LATEX_HEADER: \setauthoraddress{<whatever>}
# #+LATEX_HEADER: \setauthortel{<whatever>}
# #+LATEX_HEADER: \setauthormobile{<whatever>}
#+LATEX_HEADER: \setauthoremail{leak@online.ms}
# #+LATEX_HEADER: \setauthorurl{<whatever>}
#+LATEX_HEADER: \setleftfoot{\akrauthor}

#+TITLE: Emacs Notizen
#+AUTHOR: Andreas Kruse
#+STARTUP: indent content hidestars
#+DATE: {{{modification-time(%d.%m.%Y)}}}
#+EMAIL: leak@online.ms

Damit die LaTeX Klasse für org-mode bekannt ist, muss sie in den Emacs Einstellungen eingefügt werden. Unter Org Latex Classes fügt man dafür eine neue Klasse ein, eventuell so wie folgt.

 LaTeX class: akreport
 LaTeX header: \input{/home/andreas/orgnotes/templates/akreport.tex}
 Levels:
 INS DEL Choice: Value Menu Heading:
               numbered: \chapter{%s}
             unnumbered: \chapter*{%s}
 INS DEL Choice: Value Menu Heading:
               numbered: \section{%s}
             unnumbered: \section*{%s}
 INS DEL Choice: Value Menu Heading:
               numbered: \subsection{%s}
             unnumbered: \subsection*{%s}
 INS DEL Choice: Value Menu Heading:
               numbered: \subsubsection{%s}
             unnumbered: \subsubsection*{%s}
 INS DEL Choice: Value Menu Heading:
               numbered: \fourthsection{%s}
             unnumbered: \fourthsection*{%s}
 INS DEL Choice: Value Menu Heading:
               numbered: \fifthsection{%s}
             unnumbered: \fifthsection*{%s}

13.5 stylesheet.css

html {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 120%;
    max-width: 800px;
    margin: 20px;
    background-color: #363636;
    background-image: url(./images/emacs_gnu_logo.png)
}

a:link {
    color:#00b0b0;
}
a:visited {
    color:#00b0b0;
}
a:active {
    color:#00b0b0;
}

.title {
    text-align: left;
    font-size: 150%;
    margin-top: 20px;
    padding-bottom: 0.5em;
    border-bottom: 1px solid;
}
h2 {
    font-size: 130%;
}
h3 {
    font-size: 120%;
}

#table-of-contents {
    font-size: 9pt;
    position: fixed;
    right: 0em;
    top: 0em;
    background: #363636;
    -webkit-box-shadow: 0 0 1em #777777;
    -moz-box-shadow: 0 0 1em #777777;
    -webkit-border-bottom-left-radius: 5px;
    -moz-border-radius-bottomleft: 5px;
    text-align: right;
    /* ensure doesn't flow off the screen when expanded */
    max-height: 80%;
    overflow: auto;
    z-index: 200;
}

#table-of-contents h2 {
    font-size: 9pt;
    max-width: 8em;
    font-weight: normal;
    padding-left: 0.5em;
    padding-top: 0.05em;
    padding-bottom: 0.05em;
}

#table-of-contents ul {
    margin-left: 14pt;
    margin-bottom: 10pt;
    padding: 0
}

#table-of-contents li {
    padding: 0;
    margin: 1px;
    list-style: none;
}

#table-of-contents ul>:first-child {
    color: blue;
}

#table-of-contents #text-table-of-contents {
    display: none;
    text-align: left;
}

#table-of-contents:hover #text-table-of-contents {
    display: block;
    padding: 0.5em;
    margin-top: -1.5em;
}

div.figure {
    padding: 0.5em;
}
div.figure p {
    text-align: center;
    font-style: italic;
}
#postamble {
    font-size: 90%;
    border-top: 1px solid;
    margin-top: 20px;
}

Zurück zur Beschreibung.

logos-banner.png

14 Selbstgebaut und geklaut

In diesem Kapitel notiere ich selbstgebaute und/oder geklaute elisp Skripte, die nützlich sein können, aber nicht zum Standardrepertoire gehören.

14.1 Acronyme

Diese Funktion habe ich unter Acronym mode for Emacs, erstellt von John Kitchin, gefunden. Es wird der Minor Mode Acronym Mode (AM) erstellt, der die Definition eines Acronyms im Text findet und speichert. Bei dem erneuten Auftauchen des Acronyms wird, wenn der Mauscursor auf ihm liegt, ein Tooltipp mit der Definition des Acronyms eingeblendet. Falls man ohne Maus arbeitet, reicht ein „C-h .“, während der Cursor auf dem Acronym ist, um den Tooltipp im Minipuffer anzuzeigen.

Falls die Fehlermeldung

  • add-to-list: Symbol's function definition is void: button-lock-set-button

erscheint, fehlt das benötigte Paket button-lock. Dieses Paket muss dann auch vorher aktiviert sein.

(require 'button-lock)
(global-button-lock-mode 1)

(make-variable-buffer-local
  (defvar *acronym-buttons* '()
    "List of acronym buttons."))

(require 'rx)

(defun my/highlight-acronyms ()
  (save-excursion
    (let ((case-fold-search nil))
      (goto-char (point-min))
      (while (re-search-forward "(\\([A-Z]+\\))" nil t)
        (when flyspell-mode
          (flyspell-delete-region-overlays
           (match-beginning 1)
           (match-end 1)))
        (let* ((acronym (match-string 1))
               (p (point))
               (definition
                 (save-excursion
                   (goto-char (match-beginning 1))
                   (backward-word (length acronym))
                   (buffer-substring (point) p))))
          (add-to-list '*acronym-buttons*
                       (button-lock-set-button
                        (rx word-start (eval (match-string 1)) word-end)
                        nil
                        :help-echo definition)))))))

(defun my/refresh-acronyms ()
  "Refresh acronym tooltips in buffer."
  (dolist (button *acronym-buttons*)
     (button-lock-unset-button button))
  (setq *acronym-buttons* '()))

(defun my/remove-acronym-buttons ()
  (dolist (button *acronym-buttons*)
    (button-lock-unset-button button))
  (setq *acronym-buttons* '()))

(defun my/write-acronyms-at-point ()
  "Write the found acronyms in current buffer at point."
  (interactive)
  (my/refresh-acronyms)
  (dolist (button *acronym-buttons*)
    (insert button "\n")))

;;;###autoload
(define-minor-mode acronym-mode
  "Put definitions on acronyms."
  :lighter " AM"
  (if acronym-mode
      (my/highlight-acronyms)
    (my/remove-acronym-buttons)))

(provide 'acronym-mode)

Test des Acronym Minor Modes. Der Acronym Mode wird, wenn aktiviert, mit AM angezeigt.

logos-banner.png

14.2 Sensible Dateien ohne Backup

Bei bestimmten Dateien oder Dateitypen kann es sein, dass das automatische Anlegen einer Backup-Datei nicht erwünscht ist. Dies gilt insbesondere für verschlüsselte Dateien wie bei gpg (siehe epa-encrypt-file). Eine Lösung habe ich auf der Seite von Anirudh Sasikumar gefunden.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; sensitive mode to prevent backup file at sensitive files ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-minor-mode sensitive-mode
  "For sensitive files like password lists.
It disables backup creation and auto saving.

With no argument, this command toggles the mode.
Non-null prefix argument turns on the mode.
Null prefix argument turns off the mode."
  ;; The initial value.
  nil
  ;; The indicator for the mode line.
  " Sensitive"
  ;; The minor mode bindings.
  nil
  (if (symbol-value sensitive-mode)
      (progn
    ;; disable backups
    (set (make-local-variable 'backup-inhibited) t)
    ;; disable auto-save
    (if auto-save-default
        (auto-save-mode -1)))
    ;resort to default value of backup-inhibited
    (kill-local-variable 'backup-inhibited)
    ;resort to default auto save setting
    (if auto-save-default
        (auto-save-mode 1))))

(setq auto-mode-alist
 (append '(("\\.gpg$" . sensitive-mode))
               auto-mode-alist))

logos-banner.png

14.3 elpa-mirror vereinfachen

Um mir das Leben etwas zu erleichtern, habe ich mir in die .emacs Datei einige Funktionen hineingeschrieben, die das vorhandene elpa-mirror Zielverzeichnis erst leert, bevor es mit dem aktuellen Stand gefüllt wird. Danach packe ich das ganze noch in eine zip Datei, um sie dann einfacher verteilen zu können.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Damit ich einfacher ein elpa-mirror anlegen kann. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defcustom my/elpa-mirror-directory "/home/andreas/orgnotes/elpa-mirror"
  "Absolute path to the directory for ~elpamr-create-mirror-for-installed~."
  :type  '(string)
  :group 'elpa-mirror)

(defun my/delete-elpa-mirror-files ()
  "Removes all files in my elpa-mirror directory."
  (make-directory my/elpa-mirror-directory t)
  (setq fileslist (directory-files my/elpa-mirror-directory t "^[^.]" t))
  (while (car fileslist)
      (delete-file (car fileslist))
      (setq fileslist (cdr fileslist))))

(defun my/zip-dir-elpa-mirror ()
  "Zip the elpa-mirror directory to \".../elpa-mirror.zip\".  If
zip file already exists, it will be deleted."
  (setq zip-command "cd /home/andreas/orgnotes/ && rm -f /home/andreas/Downloads/elpa-mirror.zip && zip -r9 /home/andreas/Downloads/elpa-mirror.zip elpa-mirror/")
  (start-process-shell-command "zip-elpa-mirror" nil zip-command))

(defun my/run-elpa-mirror ()
  "If not already exists, creates destination directory as
defined in \"customize my/elpa-mirror-directory\".  Afterwards
old content will be removed, and the command to generate new
content will be executed.  After all the destination directory
will be zipped.  See \"my/zip-dir-elpa-mirror\" for this."
  (interactive)
  (my/delete-elpa-mirror-files)
  (setq elpamr-default-output-directory my/elpa-mirror-directory)
  (elpamr-create-mirror-for-installed)
  (my/zip-dir-elpa-mirror))

logos-banner.png

14.4 Alle Links im Dokument finden

Dieses Skript parsed alles Links im Puffer und listet sie.

  (defun my/list-links ()
    "Listet alle Links im aktuellen Puffer."
    (interactive)
    (let (setq *list-of-links* '())
      (save-excursion
        (goto-char (point-min))
        (while (re-search-forward "\\[\\(http.*?\\)]" nil t)
          (add-to-list '*list-of-links*
                       (match-string 1)
                       t)))
      (insert "\n")
      (dolist (link *list-of-links*)
        (insert "1. " link "\n"))))
my/list-links

14.5 Agendas automatisch nach org.ics exportieren

Nach dem Exportieren der Agenda Dateien in eine ics Datei, kann deren Inhalt in einem PIM (Outlook, Kontact, etc.) angezeigt werden. Damit der Inhalt meiner Agenda bei jedem Sichern automatisch in die ~/org.ics Datei geschrieben wird, nutze ich die hook Funktion after-save-hook. Zusatzlich habe ich mir die Funktion auf die Tastenkombination C-c F gelegt.

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Write ~/org.ics, a icalendar file of combined agenda files. ;;
  ;; Do this each time the file will be saved.                   ;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (global-set-key (kbd "C-c F") 'org-icalendar-combine-agenda-files)

  (add-hook 'after-save-hook
            (lambda ()
              (if (equal "aufgaben.org" (file-name-nondirectory buffer-file-name))
                  (org-icalendar-combine-agenda-files)
                nil)))

14.6 Suchen und ersetzen

Immer wenn man in vielen Dateien mehrere Strings verändern muss, kann es praktisch sein, dies als emacs-lisp Funktion zu verwirklichen. Einmal gebaut, kann diese Funktion schnell angepasst, und mit C-c C-c aktualisiert werden.

  (defun my/search-n-replace()
    (interactive)
    (setq to-replace (make-hash-table :test 'equal))
    (puthash "search" "replace" to-replace)
    (puthash "suchen" "ersetzen" to-replace)
    (maphash (lambda (orig replace)
               (save-excursion
                 (goto-char 0)
                 (while (re-search-forward orig nil t nil)
                   (replace-match replace nil t)))
               ) to-replace))

  (defun my/search-n-add()
    (interactive)
    (setq to-replace (make-hash-table :test 'equal))
    (puthash "search" " add" to-replace)
    (puthash "suchen" " und dran hängen" to-replace)
    (maphash (lambda (orig replace)
               (save-excursion
                 (goto-char 0)
                 (while (re-search-forward orig nil t nil)
                   (insert replace)))
               ) to-replace))

15 Bilder

org-mode-unicorn-logo.png

gnu_logo.png

3d-gnu-head.jpg

emacs_gnu_logo.jpg

emacs_logo.jpeg

16 Links

  1. http://www.gnu.org/software/emacs/
  2. http://orgmode.org/
  3. http://orgmode.org/org.html#Radio-tables
  4. http://doc.norang.ca/org-mode.html
  5. https://github.com/groksteve/org-alert
  6. https://github.com/jwiegley/alert
  7. http://ergoemacs.org/emacs/file_management.html
  8. https://www.youtube.com/watch?v=39ybVLQN9UU
  9. https://github.com/auto-complete/auto-complete
  10. https://github.com/Wilfred/ag.el
  11. https://github.com/ggreer/the_silver_searcher
  12. http://tuhdo.github.io/helm-intro.html
  13. http://tuhdo.github.io/helm-projectile.html
  14. https://github.com/zk-phi/phi-search
  15. https://github.com/zk-phi/phi-grep
  16. https://github.com/abo-abo/swiper
  17. https://www.youtube.com/watch?v=GxSUgxleJfw
  18. http://tapoueh.org/emacs/switch-window.html
  19. https://github.com/remyferre/comment-dwim-2
  20. https://github.com/joodland/bm
  21. https://gitorious.org/alezost-emacs/mwim/source/4562c4396abbb86cd916efeccdc7047ae0802736:
  22. https://github.com/aspiers/smooth-scrolling/
  23. https://github.com/tj64/navi
  24. https://github.com/Silex/elmacro
  25. https://github.com/bmag/imenu-list
  26. http://www.masteringemacs.org/article/discoverel-discover-emacs-context-menus
  27. https://github.com/purcell/cycbuf
  28. https://github.com/thierryvolpiatto/zop-to-char
  29. https://www.youtube.com/watch?v=CVAyOf1wcWw
  30. https://github.com/kai2nenobu/guide-key
  31. https://github.com/vapniks/show-marks
  32. https://github.com/bburns/clipmon
  33. https://github.com/hrs/engine-mode
  34. http://www.emacswiki.org/emacs/BookmarkPlus
  35. https://github.com/aaronbieber/sunshine.el
  36. http://www.openweathermap.org/
  37. https://github.com/redguardtoo/elpa-mirror
  38. https://github.com/fgeller/highlight-thing.el
  39. https://github.com/pierre-lecocq/cycle-resize
  40. https://github.com/abo-abo/auto-yasnippet
  41. https://github.com/sabof/org-bullets
  42. https://github.com/zenozeng/yafolding.el
  43. http://github.com/alphapapa/org-bookmark-heading
  44. https://github.com/garvinguan/emacs-one-time-pad/
  45. https://www.youtube.com/watch?v=2G2isMO6E2c
  46. http://anirudhsasikumar.net/blog/2005.01.21.html

Datum: 24.02.2019

Autor: Andreas Kruse

Created: 2019-02-24 So 13:48

Validate