====== Emacs und Forth ======
===== Über Emacs =====
Emacs ist ein Editor und eine Laufzeitumgebung für allerlei
Anwendungen auf Basis von Text (E-Mail Client, Newsgroups,
Versionsverwaltung, Tabellenkalkulation, Buch-Layout mit LaTeX,
Webbrowser, Kontaktdatenbank und vieles mehr).
Emacs ist alt. Fast so alt wie Forth. Es wurde (wie Forth) auf Betriebssystemen
entwickelt, die heute obsolete sind. Da Emacs erweiterbar
ist, wurde es immer angepasst und auf moderne Systeme portiert. Daher
benutzt Emacs viele Begriffe, die in anderen Systemen (Windows, macOS
X, Linux) anders heissen. Emacs (wie Forth) veraltet nicht und folgt
dem Entwickler bei seiner Reise durch die Computerwelt.
Emacs ist (wie Forth) am Anfang nicht immer einfach zu verstehen, aber
es lohnt sich, Emacs eine Chance zu geben. Am besten lernt man Emacs
in kleinen Happen. Bei Emacs lernt man nie aus, es gibt immer Neues
und Fazinierendes zu entdecken.
Es gibt viele Emacs Ableger, hier geht es um das Original, GNU Emacs.
{{ :projects:emacsandforth:screen_shot_2017-08-27_at_15.42.00_pm.png?400 |}}
===== Emacs Links =====
* Homepage https://www.gnu.org/software/emacs/
* Wikipedia über Emacs https://de.wikipedia.org/wiki/Emacs
* Emacs Wiki https://www.emacswiki.org/
* nicht Emacs (der andere Editor: vi/vim) http://www.vim.org/
===== Emacs download =====
==== Windows ====
https://www.gnu.org/software/emacs/download.html#windows
==== macOS X ====
Emacs ist Teil von macOS, die dort mitgelieferte Version 22 ist aber
sehr alt. Aktuell (2017) ist Version 25. Aktuelle Emacs Versionen für
macOS gibt es von
* https://emacsformacosx.com/
* http://aquamacs.org/
* https://bitbucket.org/mituharu/emacs-mac/
==== Linux/BSD/HURD/Minix ... ====
Emacs gibt es auf diesen Systemen fast immer sehr aktuell aus dem
Repositories der Paketverwaltung des Systems.
==== MS-DOS ====
* https://www.emacswiki.org/emacs/EmacsForDOS
====== Emacs lernen ======
===== Bücher =====
* Mastering Emacs https://www.masteringemacs.org/book
===== Webseiten =====
* Emacs Tutor https://tuhdo.github.io/emacs-tutor.html
* Emacs Manual https://www.emacswiki.org/emacs/EmacsManual
* Planet Emacsen https://planet.emacsen.org
* Sacha Chua Emacs http://sachachua.com/blog/category/geek/emacs/
===== Videos =====
* Using Emacs https://www.youtube.com/playlist?list=PL9KxKa8NpFxIcNQa9js7dQQIHc81b0-Xg
===== Referenzkarten =====
* http://www.ks.uiuc.edu/Training/Tutorials/Reference/emacsrefcard.pdf
====== Emacs forth-mode ======
Emacs hat einen Programmiermodus für Forth: ''%%forth-mode%%''
Dieser Modus wird derzeit von Lars Brinkhoff betreut. Die Quellen befinden sich auf Github: https://github.com/larsbrinkhoff/forth-mode
===== Installation =====
Das MELPA Repositoriy muss im Emacs-Paketmanager eingetragen sein, in der Emacs-Konfigurationsdatei z.B. mit
(setq package-archives '(("melpa" . "http://melpa.milkbox.net/packages/")))
(package-initialize)
Emacs starten, den Forth-Mode mit "M-x package-install forth-mode" installieren.
Forth-Mode erkennt Forth-Programme an der Dateiendung. Viele gängige Forth-Dateiendungen werden unterstützt.
====== Emacs serielles Terminal ======
Emacs hat ein Terminalprogramm für serielle Schnittstellen eingebaut. Dieses wird mit "M-x serial-terminal" aufgerufen. Es fragt nach dem Namen der Schnittstelle und der Geschwindigkeit. Die Geschwindigkeit kann nachträglich mit der Maus in der Modus-Zeile des Buffers geändert werden.
===== Anpassungen für Mecrisp-Forth =====
Der folgende ELisp-Code passt das serielle Terminal im Emacs an Mecrisp-Forth an. Zur Installation den Quellcode in die Emacs-Konfigurationsdatei (''%%~/.emacs%%'' oder ''%%~/.emacs.d/init.el%%'' kopieren und Emacs neu starten).
;; mecrisp emacs term
(defun replace-all (string to-find to-replace)
(let ((index (cl-search to-find string))
(pos 0)
(result ""))
(while index
(setq result (concat result
(substring string pos index)
to-replace)
pos (+ index (length to-find))
index (cl-search to-find string :start2 pos)))
(concat result (substring string pos))))
(defun mecrisp-serial-process-filter (process output)
"Replace LF in output string with CR+LF."
(term-emulate-terminal process
(replace-all output
(byte-to-string ?\n)
(string ?\r ?\n))))
(defun mecrisp-serial-term (port)
"Basically duplicate SERIAL-TERM from term.el but with process
filtering to translate LF to CR+LF."
(interactive (list (serial-read-name)))
(serial-supported-or-barf)
(let* ((process (make-serial-process
:port port
:speed 115200
:bytesize 8
:parity nil
:stopbits 1
:flowcontrol nil
:coding 'raw-text-unix
:noquery t
:name (format "mecrisp:%s" port)
:filter 'mecrisp-serial-process-filter
:sentinel 'term-sentinel))
(buffer (process-buffer process)))
(with-current-buffer buffer
(term-mode)
(term-line-mode)
(goto-char (point-max))
(set-marker (process-mark process) (point)))
(switch-to-buffer buffer)
buffer))