Login
Newsletter
Werbung

Do, 12. Januar 2017, 15:00

Skripten mit Emacs

Emacs-Lisp-Mode

Als letzte kleine Erweiterung ist es nützlich, Emacs mitzuteilen, dass die Datei im Editor zur Bearbeitung im Emacs-Lisp-Mode geöffnet wird. Zusätzlich ist es nützlich, das modernere lexical-binding für die Ausführung des Codes zu aktivieren. lexical-binding ist in den meisten Programmiersprachen der verwendete Standard. Es steht im Gegensatz zu dynamic-binding. Beim lexical-binding sind Änderungen von Variablen nur für den unmittelbar umgebenden Code sichtbar, also Code, der sich im selben Scope, z.B. in der selben Funktion, befindet. Beim dynamic-binding sind Änderungen von Zuweisungen einer Variablen auch in nachfolgenden Aufrufen anderer Funktionen sichtbar. Dies kann manchmal sehr nützlich sein, ist in der Regel aber unerwünscht und außerdem wird die Ausführung des Codes dadurch verlangsamt.

In Emacs ist es nützlicherweise möglich, beim Öffnen von Dateien bestimmte Einstellungen in Emacs zu aktivieren oder auch beliebigen Code auszuführen. Um die Datei zur Bearbeitung automatisch im Emacs-Lisp-Mode zu öffnen und lexical-binding bei der späteren Ausführung zu aktivieren, hinterlegt man in einem Kommentar zu Beginn der Datei eine spezielle Zeichenfolge. In diesem Fall führt folgende Erweiterung der Zeile zu dem gewünschten Ergebnis:

#!/bin/sh
":"; exec emacs --quick --script "$0" -f main -- "$0" "$@"  # -*- mode: emacs-lisp; lexical-binding: t; -*-

Da sich diese Konfigurationsanweisungen in einem Kommentar befinden, kommt es damit auch zu keinen Syntaxfehlern bei der Ausführung. Als kleiner Zusatz wird der Skriptpfad im obigen Befehl mit "$0" auch noch an das Skript übergeben. Das folgende Beispiel soll eine kleine Übersicht zu den in Skripten häufig verwendeten Funktionen geben.

#!/bin/sh
":"; exec emacs --quick --script "$0" -f main -- "$0" "$@"  # -*- mode: emacs-lisp; lexical-binding: t; -*-

;; Initialisierung einer globalen Variable zum Speichern des Skriptpfads. Mit
;; defvar deklarierte Variablen sind "speziell". Dies bedeuted für sie gilt nach
;; wie vor dynamic-binding.
(defvar script-path "")

;; Die main Funktion, welche nach Einlesen des Skriptes ausgeführt wird.
(defun main ()
  ;; Durch setzen dieser Variablen wird bei Fehlern ein Backtrace angezeigt.
  ;; Das ist nützlich, um das debuggen des Skriptes zu vereinfachen.
  (setq debug-on-error t)
  ;; Der -- separator wird mit an das Skript übergeben. Die folgende Anweisung
  ;; entfernt dieses Argument aus der Liste der Argumente, welche in der Liste
  ;; namens argv zu finden sind.
  (pop argv)
  ;; Das nächste Argument in argv ist der Skriptpfad der im Folgenden in der
  ;; oben initialisierten globalen Variable script-path gespeichert wird.
  (setq script-path (pop argv))
  ;; Sind noch Argumente uebrig, soll eine Fehlermeldung ausgegeben werden.
  ;; Eine leere Liste ist in Emacs Lisp gleichbedeutend zu einem
  ;; False anderer Programmiersprachen.
  (when argv
    ;; Die Funktion message gibt Daten an stderr aus
    (message "Das Skript Folgende Argumente wurden aber übergeben:\n\n\t       script-path (mapconcat #'identity argv "\n\t") "\n")
    ;; Mit folgendem Befehl kann ein Exit Code an die Shell übergeben
    ;; werden.
    (kill-emacs 1))
  ;; Schließlich ein Beispiel, wie Nutzerinput in einer lokalen Variable name gespeichert
  ;; und ausgegeben wird. Mit princ erfolgt die Ausgabe der Daten an stdout.
  (let ((name(read-from-minibuffer "Wie ist dein Name? ")))
    (princ (format "Hallo   ;; Nach erfolgreicher Ausführung ist der Exit Code 0.
  (kill-emacs 0))

Fazit

Wer sich weiter informieren will, findet mit folgenden Links weitere Wissensquellen, die auch als Grundlage dieses Artikels dienten:

Autoreninformation

Clemens Radermacher nutzt Emacs seit circa zwei Jahren unter anderem zur Programmierung und arbeitet gerne mit freier Software.

  • Das Werk darf vervielfältigt, verbreitet und öffentlich zugänglich gemacht werden, Abwandlungen und Bearbeitungen des Werkes müssen unter den gleichen Bedingungen weitergegeben werden. Der Name des Autors/Rechteinhabers muss in der von ihm festgelegten Weise genannt werden.

    - Weitere Informationen
Kommentare (Insgesamt: 1 || Alle anzeigen )
Remacs (ShalokShalom, Fr, 13. Januar 2017)
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung