;; Alle Features dieser ~/.emacs sind unter
;; http://www.loescher-online.de/tips.html#xemacs
;; dokumentiert.


;; Options Menu Settings
;; =====================
(cond
 ((and (string-match "XEmacs" emacs-version)
       (boundp 'emacs-major-version)
       (or (and
            (= emacs-major-version 19)
            (>= emacs-minor-version 14))
           (= emacs-major-version 20))
       (fboundp 'load-options-file))
  (load-options-file "~/.xemacs-options")))
;; ============================
;; End of Options Menu Settings


;;* Pfade erweitern
;;  ==================================================================
(setq load-path
      (cons (expand-file-name "~/emacs") load-path))
(setq Info-default-directory-list
      (cons (expand-file-name "~/info") Info-default-directory-list))
;;  ==================================================================


;;* Einstellungen für Nicht-XEmacs (also emacs)
;;  ==================================================================
(cond (
       (not (string-match "XEmacs" emacs-version))
       ;; Turn on font-lock in all modes that support it
       (if (fboundp 'global-font-lock-mode)
           (global-font-lock-mode t))
       ;; Maximum colors
       (setq font-lock-maximum-decoration t)
       ;; Region soll farbig dargestellt werden
       (transient-mark-mode t)
       
       ;; HOME und END unter NT umbelegen
       (global-set-key [home] 'beginning-of-line)
       (global-set-key [end]  'end-of-line)
       )
      )
;;  ==================================================================


;;* Mailadresse einstellen
(setq user-mail-address (getenv "REPLYTO"))
(setq query-user-mail-address nil)


;;* Neue Endungen für Mode-Umschaltung bekanntmachen
(setq auto-mode-alist
      (append '(
                ("\\.C$"   . c++-mode)
                ("\\.cc$"  . c++-mode)
                ("\\.CPP$" . c++-mode)
                ("\\.hh$"  . c++-mode)
                ("\\.c$"   . c-mode)
                ("\\.h$"   . c++-mode)
                ("\\.asm$" . asm-mode)
                ("\\.src$" . pascal-mode)
                ;; Flex- und Lex-Files
                ("\\.l$"   . indented-text-mode)
                ;; elm-Dateien werden im Text-Mode geladen:
                ("snd\."   . text-mode)
                ;; Yarn-Sende-Dateien
                ("\\.snd$" . text-mode)
                ("\\.gnus"  . emacs-lisp-mode)
                ;; Gnus-SCORE-Files
                ("\\.SCORE" . emacs-lisp-mode)
                )
              auto-mode-alist))



;; Bis hier geht die Emacs-Einstellung



;;* Tastatur-Einstellungen
;;  ==================================================================
;; DEL soll auch wirklich DEL sein
;; Das geht mit XEmacs 20.3 unter
;; `system-configuration': "alpha-dec-osf4.0"
(cond ( 
       (not (eq system-type 'linux))   ;; Nur unter Nicht-Linux laden
;;       (require 'delbs)
;;       (delbs-enable-delete-forward)
       (setq delete-key-deletes-forward 't)
       )
      )
;; Tastatur-Einstellungen für HPUX 10.20 mit HP-PC, HP-720
(cond ( 
       (eq system-type 'hpux)   ;; Nur unter HPUX umdefinieren
       (global-set-key [hpDeleteChar] 'delete-char)
       (global-set-key [hpInsertChar] 'overwrite-mode)
       )
      )
;; Diesen Block nur unter X ausführen, sonst (Terminal) nicht
(if (eq 'x (device-type))
    (cond ( 
	   (eq system-type 'linux)         ;; Nur unter Linux umdefinieren
	   (global-set-key [delete] 'delete-char)
	   ;; Damit funktioniert DEL/BS auch in allen Modulen, wie 
	   ;; z.B.: C-Perl, Lisp, C, HTML, ...
	   (global-set-key '[(delete)]  'delete-backward-char)
	   (keyboard-translate 'delete 'deletechar)
	   ;;       (keyboard-translate 'backspace 'delete)
	   (global-set-key '[(deletechar)] 'delete-char)
	   )
	  )
  )
;; C-z macht dasselbe, wie C-y (Für englische Tastaturen)
(global-set-key [(control z)] [(control y)])
;; Control-Tab schaltet zum nächsten Buffer
(global-set-key [(control tab)] 'sl-switch-to-other-buffer)
;; F2: Speichern mit `save-buffer'
(global-set-key 'f2 'save-buffer)
;; F8: Speichern und Buffer schließen
(global-set-key 'f8 'sl-save-and-close-current-buffer)
;; verbessertes "capitalize-word"
(global-set-key [(meta c)] 'sl-capitalize-region-or-word)
;; Tastenbelegungen für den C-mode und c++-mode
;; Siehe auch: Hilfe zu compile-command
(add-hook 'c-mode-hook 
	  (function
	   (lambda () 
	     (define-key c-mode-map '(f9)          'compile)
	     (define-key c-mode-map '(f11)         'next-error)
	     (define-key c-mode-map '(shift f11)   'previous-error)
	     )))
(add-hook 'c++-mode-hook 
	  (function
	   (lambda () 
	     (define-key c-mode-map '(f9)          'compile)
	     (define-key c-mode-map '(f11)         'next-error)
	     (define-key c-mode-map '(shift f11)   'previous-error)
	     )))
;; Tastenbelegungen für den Java-Mode
(add-hook 'java-mode-hook
	  (function
	   (lambda ()
	   (define-key java-mode-map '(f9)          'compile)
	     (progn (make-local-variable 'compile-command)
		    (setq compile-command
			  (concat "javac "
				  buffer-file-name))))
	   ))
;; Tastenbelegungen für den LaTeX-mode
(add-hook 'LaTeX-mode-hook 
	  (function
	   (lambda () 
	     (turn-on-auto-fill)
	     ;; Goto-Line geht sonst nicht wie gewohnt
	     (define-key LaTeX-mode-map '(meta g) 'goto-line)
	     ;; C-i macht aus der Region einen Index-Eintrag
	     (define-key LaTeX-mode-map '(control i)
	       "\C-w{\\bf \C-y}\\index{\C-y}")
	     ;; Latex-Lauf starten mit F9
	     (define-key LaTeX-mode-map '(f9)
	       "\C-c\C-cLaTeX Interactive\r\M-xTeX-recenter-output-buffer\r")
	     ;; XDVI starten mit F10
	     (define-key LaTeX-mode-map '(f10)
	       [(control x) \1 (control c) (control c) V i e w return > / d e v / n u l l (control a) right right right right right - g e o m e t r y space \1 \0 \1 \4 x \7 \4 \2 + \0 + \0 space return]
	       )
	     ;; Fehler anspringen
	     (define-key LaTeX-mode-map '(f11)
	       'TeX-next-error)
	     ;; Index-Eintrag
	     (define-key LaTeX-mode-map '(f5)
	       [(meta w) \\ i n d e x { (control y) }])
	     )))
;; LaTeX-Umbelegung für die Alpha
(if (string-equal "ALPHA" (getenv "PLATFORM"))
    (global-set-key 'f10 [(control c) (control c) V i e w return (control a) right right right right right + space - g e o m e t r y space \1 \2 \4 \0 x \9 \8 \9 + \0 + \0 space - t h o r o u g h space - s space \2 space return])
  )
;; Den Text "snip ... snap" für Zitate einfügen mit F12
(global-set-key 'f12
		[- - - - - space s n i p space (control u) \6 \0 - return - - - - - space s n a p space (control u) \6 \0 - home return up])
;; Ins Menü springen mit F5:
(define-key global-map [f5] 'accelerate-menu)
;;  ==================================================================


;;* Eigene Funktionen
;;  ==================================================================
;; Funktionen zum Versions-Management
(defvar running-xemacs (string-match "XEmacs\\|Lucid" emacs-version))
(defun running-emacs-version-or-newer (major minor)
  (or (> emacs-major-version major)
      (and (= emacs-major-version major)
	   (>= emacs-minor-version minor))))
;;* Aktuellen Buffer schließen. Funktioniert auch mit Gnuclient-Buffers."
(defun sl-close-current-buffer ()
  "Aktuellen Buffer schließen. Funktioniert auch mit Gnuclient-Buffers."
  (interactive)
;;  ;; Wenn es die Funktion gnuserv-buffer-p gibt, dann ist es der neue Gnuclient
;;  (if (boundp 'gnuserv-buffer-p)
;;      (
;;       (if (gnuserv-buffer-p (current-buffer))
;;	   (gnuserv-edit)
;;	 )
;;       )
;;    ;; sonst
  (kill-buffer nil)
;;    )
  )
;; Aktuellen Buffer speichern und schließen.
;; Funktioniert auch mit Gnuclient-Buffers."
(defun sl-save-and-close-current-buffer ()
  "Aktuellen Buffer speichern und schließen.
 Funktioniert auch mit Gnuclient-Buffers."
  (interactive)
  (save-buffer)
  (sl-close-current-buffer)
  )
;; Schaltet zum nächsten Buffer. Entspricht (switch-to-other-buffer 0)
(defun sl-switch-to-other-buffer ()
  "Schaltet zum nächsten Buffer. Entspricht (switch-to-other-buffer 0)."
  (interactive)
  (switch-to-other-buffer 0)
  )
;; Schreibt das Wort, in dem der Cursor steht groß
(defun sl-capitalize-region-or-word ()
  "Schreibt das Wort, in dem der Cursor steht groß."
  (interactive)
  (backward-word 1)
  (capitalize-region-or-word 1)
  )
;;  ==================================================================


;;* Hintergrundfarbe einstellen
;(set-face-background 'default      "white")
(cond (
       (eq window-system 'x)
       (set-face-background 'default      "white")
       )
      )

;;* Mit leerem Scratch anfangen
(setq initial-scratch-message nil)

;;* Font-Einstellungen
;;  ==================================================================
(set-face-font  'default "*courier-bold-r*120*")
(cond ( 
       (eq system-type 'aix) ;; Nur unter AIX anderen Font nehmen
       (set-face-font  'default "*courier-normal-r*120*")
       )
      )
;; Auch ganz schön: (set-face-font 'default "*Fixed-Bold-R*120*")
;;  ==================================================================

;;* Drucker und Pretty-Print-Einstellungen
;;  ==================================================================
(setq ps-header-lines 1)          ;; Nur Filename und Seitenzahl anzeigen
(load "ps-print")
(setq ps-print-color-p t)         ;; Farbig drucken
(setq ps-paper-type 'ps-a4)  ;; Papiergröße ist A4
(cond ((running-emacs-version-or-newer 20 0)
       (setq ps-paper-type 'a4) ;; Für das neue ps-print.el
       ))
(setq lpr-switches '("-Ptext"))   ;; "print" druckt auf Drucker "text" und
(setq ps-lpr-switches '("-Pps"))  ;; "pretty-print" druckt auf Drucker "ps"
;;  ==================================================================

;;* Font-Lock (Syntax-Highlighting) einschalten
(setq-default font-lock-auto-fontify t)
(setq-default font-lock-use-fonts nil)
(setq-default font-lock-use-colors t)
(require 'font-lock)

;;* Klammernblinken einschalten
(require 'paren)
(paren-set-mode 'blink-paren)

;;* Gnuserver für Gnuclient starten
;; Man kann dann mit "gnuclient FILE" am Shell-Prompt die Datei FILE editieren
(gnuserv-start)
;; Für GNU-Server-Buffers sollen keine neuen Frames aufgehen
(setq gnuserv-frame (selected-frame))
;; Gnuclient-Buffers ohne Rückfrage schließen
(setq gnuserv-kill-quietly t)

;;* Zeilennummer und Spaltennummer anzeigen
;;(setq line-number-mode t)
(setq line-number-mode 't)
(setq column-number-mode 't)

;;* Overfull-Boxen in LaTeX anspringen
(setq TeX-debug-bad-boxes t)

;;* Load the auto-save.el package, which lets you put all of your autosave
;;* files in one place, instead of scattering them around the file system.
(setq auto-save-directory (expand-file-name "~/autosave/")
      auto-save-directory-fallback auto-save-directory
      auto-save-hash-p nil
      ange-ftp-auto-save t
      ange-ftp-auto-save-remotely nil
      ;; now that we have auto-save-timeout, let's crank this up
      ;; for better interactive response.
      auto-save-interval 1000
      )
;; We load this afterwards because it checks to make sure the
;; auto-save-directory exists (creating it if not) when it's loaded.
(require 'auto-save)

;;* Load crypt, which is a package for automatically decoding and reencoding
;;* files by various methods - for example, you can visit a .Z or .gz file,
;;* edit it, and have it automatically re-compressed when you save it again.
(setq crypt-encryption-type 'pgp  ; default encryption mechanism
      crypt-confirm-password t	  ; make sure new passwords are correct
      crypt-never-ever-decrypt t  ; if you don't encrypt anything, set this to
				  ; tell it not to assume that "binary" files
				  ; are encrypted and require a password.
      )
(require 'crypt)

;;* func-menu: Alle Funktionen (oder Kapitel) in einem Menü anzeigen
(cond ((string-match "XEmacs" emacs-version)
       (require 'func-menu)
       (define-key global-map 'f7 'function-menu)
       (add-hook 'find-file-hooks 'fume-add-menubar-entry)
       (define-key global-map "\C-cl" 'fume-list-functions)
       (define-key global-map "\C-cg" 'fume-prompt-function-goto)

       ;; The Hyperbole information manager package uses (shift button2) and
       ;; (shift button3) to provide context-sensitive mouse keys.  If you
       ;; use this next binding, it will conflict with Hyperbole's setup.
       ;; Choose another mouse key if you use Hyperbole.
       (define-key global-map '(shift button3) 'mouse-function-menu)

       ;; For descriptions of the following user-customizable variables,
       ;; type C-h v <variable>
       (setq fume-max-items 25
             fume-fn-window-position 3
             fume-auto-position-popup t
             fume-display-in-modeline-p t
             fume-menubar-menu-location "File"
             fume-buffer-name "*Function List*"
             fume-no-prompt-on-valid-default nil)
       ))

;;* Die zuletzt geladenen Files in einem Menü darstellen
(require 'recent-files)
(recent-files-initialize)

;;* Perl-Mode (CPerl)
(require 'cperl-mode)
(setq cperl-font-lock t)
(setq auto-mode-alist
      (append '(("\\.\\([pP][Llm]\\|al\\)$" . cperl-mode))  auto-mode-alist ))
(setq interpreter-mode-alist (append interpreter-mode-alist
                                     '(("miniperl" . cperl-mode))))
(setq cperl-continued-statement-offset 0)
;(setq perl-indent-level 2)
;; Damit kann man alle Features einschalten:
;;(setq cperl-hairy t)
;;(setq cperl-extra-newline-before-brace t)
;;(setq cperl-auto-newline t)
;;(setq cperl-auto-newline-after-colon t)

;;* Am Textende sollen keine Leerzeilen hinzugefuegt werden, wenn man mit dem
;;* Cursor weiter nach unten geht
(setq next-line-add-newlines nil)

;;* Damit merkt sich XEmacs die Cursor-Position in allen Files
;;* Man befindet sich bei naechsten Laden des gleichen Files wieder an
;;* gleichen Stelle
(require 'saveplace)
(setq-default save-place t)

;;* Es wird verhindert, dass XEmacs seine Region verliert, wenn man mit dem 
;;* Cursor beim Markieren an das Ende des Buffers gelangt
(defadvice scroll-up (around scroll-up freeze)
  (interactive "_P")
  (let ((zmacs-region-stays t))
    (if (interactive-p)
        (condition-case nil
            ad-do-it
          (end-of-buffer (goto-char (point-max))))
      ad-do-it)))
(defadvice scroll-down (around scroll-down freeze)
  (interactive "_P")
  (let ((zmacs-region-stays t))
    (if (interactive-p)
        (condition-case nil
            ad-do-it
          (beginning-of-buffer (goto-char (point-min))))
      ad-do-it)))

;;* aucTeX laden
(if (locate-library "tex-site")
    (load "tex-site"))

;;* Der Maus-Cursor weicht dem Text-Cursor aus
;; Besser: "unclutter" unter X!
;(cond (window-system
;        (require 'avoid)
;        (mouse-avoidance-mode 'animate)))

;;* Text wird am Textcursor eingefügt
(setq-default mouse-yank-at-point t)

;;* File-Existenz prüfen geht so:
;; (cond (file-exists-p "filename") (load "filename"))

;;* Einstellungen für VM (E-Mail)
;; Achtung: der VM kopiert die Mailbox und löscht sie dann!
;; Ich will keine neuen Frames
;(setq vm-mutable-frames nil)
;(setq vm-frame-per-composition nil)
;(setq vm-frame-per-folder t)
;(setq vm-frame-per-edit nil)
;(setq vm-frame-per-summary nil)

;;* Im Text-Modus Auto-Fill verwenden
(setq text-mode-hook 'turn-on-auto-fill)
(setq-default fill-column 72)
;; oder auch: (add-hook 'xyz-mode-hook 'turn-on-auto-fill)
;; Mit M-q kann man Region oder Paragraph neu formatieren.

;;* Fill-Adapt: Diverse Verbesserungen für auto-fill
;; (require 'filladapt)
;; (setq-default filladapt-mode t)

;;* Mit "%" zur passenden Klammer springen, wenn Cursor auf einer Klammer steht
(global-set-key "%" 'match-paren)
(defun match-paren (arg)
  "Go to the matching parenthesis if on parenthesis otherwise insert %."
  (interactive "p")
  (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
	((looking-at "\\s\)") (forward-char 1) (backward-list 1))
	(t (self-insert-command (or arg 1)))
	)
  )

;;* Nicht nach dem Make-Kommando fragen, sondern einfach make starten
(setq compilation-read-command nil)

;;* Anzahl der Zeilen im compilation-window
(setq compilation-window-height 10)

;;* Die Turbo-Pascal-Tastenbelegungen
;; Doku: define-key
(global-set-key [control-home] 'beginning-of-buffer)
(global-set-key [control-end] 'end-of-buffer)
;;(global-set-key [shift-delete] 'kill-region)
(global-set-key [control-insert] 'kill-ring-save)
(global-set-key [shift-insert] 'yank)

;;* Minibuffer-History
(require 'savehist)
(savehist-load)
;; In savehist v0.4 ist folgende Änderung für XEmacs 19.14 notwendig:
;; "(require 'custom)" ersetzen durch:
;-----
;(eval-and-compile
;  (condition-case ()
;      (require 'custom)
;    (error nil))
;  (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
;      nil ;; We've got what we needed
;    ;; We have the old custom-library, hack around it!
;    (defmacro defgroup (&rest args)
;      nil)
;    (defmacro defface (var values doc &rest args)
;      (` (make-face (, var))))
;    (defmacro defcustom (var value doc &rest args) 
;      (` (defvar (, var) (, value) (, doc))))))
;-----

;;* WWW-Einstellungen
;; Normalerweise alle URLs im Netscape öfnnen:
(setq-default browse-url-browser-function 'browse-url-netscape)
;; Home für W3:
(setq w3-default-homepage "file:~/emacs.html")
;; Proxy-Einstellungen für W3
;;(setq url-proxy-services '(("http"     . "localhost:3128")
;;			   ("ftp"      . "localhost:3128")
;;		           ("gopher"   . "localhost:3128")
;;                           ("wais"     . "localhost:3128")
;;			   ))
(setq url-proxy-services '(("http"     . "proxy:8080")
			   ("ftp"      . "proxy:8080")
		           ("gopher"   . "proxy:8080")
                           ("wais"     . "proxy:8080")
			   ))

;;* TM (MIME) für Gnus laden:
(load "mime-setup")
(setq message-signature t) ;; Sonst wird die .signature nicht eingefügt!
(setq mime-editor/split-message nil) ;; Messages nicht splitten.
;; ACHTUNG: Ab Gnus 5.8 darf man das tm nicht mehr laden!
;; Files anhängen geht dann mit: M-m f


;; Toolbar auf Gnus einstellen
(setq toolbar-news-use-separate-frame nil)
(setq toolbar-news-reader (quote gnus))

;;* In LaTeX Umlaute tippen und als "a, etc. speichern.
;; (require 'iso-cvt)

;;* HTML-ize laden (Benutzung: M-x htmlize-buffer)
(if (locate-library "htmlize")
    (load "htmlize"))

;;* LaTeX-ize laden (Benutzung: M-x latexize-buffer)
(if (locate-library "latexize")
    (load "latexize"))

(defun sl-ps-print-buffer-with-faces-to-file (&optional filename)
  "Generate and print a PostScript image of the buffer.
You are prompted for a filename to save the PostScript file.
Like `ps-print-buffer', but includes font, color, and underline
information in the generated image.  This command works only if you
are using a window system, so it has a way to determine color values."
  (interactive (list (ps-print-preprint 1)))
  (ps-generate (current-buffer) (point-min) (point-max)
	       'ps-generate-postscript-with-faces)
  (ps-do-despool filename)
)

(add-menu-item '("File") "Pretty-Print current buffer to file..." 'sl-ps-print-buffer-with-faces-to-file t "Pretty-Print Buffer")

;;* Im psgml-Mode (sgml-mode, html-mode) richtig mit Umlauten umgehen
(defun html-init-file-hook ()
  (sgml-charent-to-display-char)
  (make-local-hook 'after-save-hook)
  (add-hook 'after-save-hook
	    '(lambda ()
	       (sgml-charent-to-display-char)
	       (set-buffer-modified-p nil))
	    t
	    t)
  (add-hook 'local-write-file-hooks 'sgml-display-char-to-charent))
(add-hook 'html-mode-hook 'html-init-file-hook)
; Weiteres: (add-hook 'html-mode-hook 'hm--html-minor-mode)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;* Ab hier noch Test-Phase
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; New buffers should stay in the same frame
(setq-default temp-buffer-show-function 'show-temp-buffer-in-current-frame)



;; ispell auf das deutsche Wörterbuch mit Umlauten umstellen
;(ispell-change-dictionary "deutsch8")
;(setq ispell-dictionary "deutsch8")

;;;* ISpell-Setup by Michael Deindl <olmur @ dwarf.bb.bawue.de>
;(global-set-key "\M-#"   'ispell-word)
;(global-set-key "\C-cim" 'ispell-message)
;(global-set-key "\C-cib" 'ispell-buffer)
;(global-set-key "\C-cic" 'ispell-change-dictionary)
;(global-set-key "\C-cid" '(lambda () "set german dictionary"
;                            (interactive) 
;                            (ispell-change-dictionary "deutsch8")
;                            ))
;(global-set-key "\C-cie" '(lambda () "set english dictionary"
;                            (interactive)
;                            (ispell-change-dictionary "english")
;                            ))



;;;* Fly-Spell:
;; Default-Dictionary für flyspell
;(setq flyspell-default-dictionary "deutsch8")
;; Einbinden von flyspell; Zusatzpaket von http://kaolin.unice.fr/~serrano/emacs/flyspell
;(autoload 'flyspell-mode "flyspell" "On-the-fly spelling checking" t)
;(autoload 'global-flyspell-mode "flyspell" "On-the-fly spelling" t)

;(add-hook 'message-mode-hook 'flyspell-mode)
;(add-hook 'sgml-mode-hook 'flyspell-mode)
;(add-hook 'LaTeX-mode-hook 'flyspell-mode)
