aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/fetchmail-mode.el
blob: d22ebcafe3b203f034311b405b688e917defc3b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
;; fetchmail-mode.el        -*- Emacs-Lisp -*-
;;
;; Mode for editing .fetchmailrc files
;;
;; Created:    <Mon Oct 30 20:13:15 EST 2000>
;; Time-stamp: <17.02.2001 17:59:43>
;; Version:    0.1
;; Keywords:   fetchmail,config
;; Author:     Alex Shinn <foof@debian.org>
;;
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
;; published by the Free Software Foundation; either version 2 of
;; the License, or (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public
;; License along with this program; if not, write to the Free
;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
;; MA 02111-1307 USA

;; Commentary:
;;
;; This file provides a major mode for editing .fetchmailrc files.
;; It offers syntax highlighting and indentation.
;;
;; To use it, put the following in your .emacs:
;;
;; (autoload 'fetchmail-mode "fetchmail-mode.el" "Mode for editing .fetchmailrc files" t)
;;
;; You may also want something like:
;;
;; (setq auto-mode-alist
;;       (append '(("\..fetchmailrc$" . fetchmail-mode))
;;               auto-mode-alist))

;; Create mode-specific tables.
(defvar fetchmail-mode-syntax-table nil
  "Syntax table used while in fetchmail-mode" )
(if fetchmail-mode-syntax-table
    ()              ; Do not change the table if it is already set up.
  (setq fetchmail-mode-syntax-table (make-syntax-table))
  (modify-syntax-entry ?\\ "\\   " fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\,  "." fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\:  "." fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\;  "." fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\"  "\"" fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\'  "\"" fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\n  "> " fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\#  "< " fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\( "()   " fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\) ")(   " fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\[ "(]   " fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\] ")[   " fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\{ "(}   " fetchmail-mode-syntax-table)
  (modify-syntax-entry ?\} "){   " fetchmail-mode-syntax-table)
  )

(defvar fetchmail-mode-map nil
  "Keymap used in fetchmail-mode" )

(if fetchmail-mode-map nil
  (setq fetchmail-mode-map (make-sparse-keymap))
  (define-key fetchmail-mode-map "\t" 'fetchmail-complete)
  (define-key fetchmail-mode-map "\C-c\C-c" 'comment-region) )
(defvar fetchmail-mode-hook nil
  "Hooks to run in fetchmail-mode" )

(defvar fetchmail-keywords nil
  "Keywords used for fetchmail-mode" )

(unless fetchmail-keywords
   (setq fetchmail-keywords
          '("poll" "skip" "via" "in" "proto" "protocol" "uidl" "no" "port" "auth" "authenticate" "timeout" "envelope" "qvirtual" "envelope" "aka" "localdomains" "interface" "monitor" "dns" "user" "username" "is" "folder" "pass" "password" "smtp" "smtphost" "smtpaddress" "antispam" "mda" "pre" "preconnect" "post" "postconnect" "keep" "flush" "fetchall" "rewrite" "forcecr" "stripcr" "pass8bits" "dropstatus" "limit" "fetchlimit" "batchlimit" "expunge" "pop2" "POP2" "pop3" "POP3" "imap" "IMAP" "imap-k4" "IMAP-K4" "apop" "APOP" "rpop" "RPOP" "kpop" "KPOP" "etrn" "ETRN" "login" "kerberos" "kerberos_v5" "logfile" "daemon" "syslog" "invisible" "and" "with" "has" "wants" "options" "here" "there" "aka" "set")))

(defvar fetchmail-keyword-table nil
  "Completion table for fetchmail-mode" )
(unless fetchmail-keyword-table
  (setq fetchmail-keyword-table (make-vector 8 0))
  (mapcar (lambda (x) (intern x fetchmail-keyword-table))
          fetchmail-keywords))

(defvar fetchmail-font-lock-keywords nil
  "Default expressions to highlight in fetchmail-mode" )

(unless fetchmail-font-lock-keywords
  (setq fetchmail-font-lock-keywords
        (list (list (concat "\\b" (regexp-opt
                                   fetchmail-keywords t) "\\b")
                    0 'font-lock-keyword-face ))))

(defun fetchmail-complete ()
  "Tab completion for fetchmail-mode"
  (interactive)
  (let* ((end (point))
	 (beg (save-excursion
		(skip-syntax-backward "w")
		(point)))
	 (pattern (buffer-substring beg end))
	 (table fetchmail-keyword-table)
	 (completion (try-completion pattern table)))
    (cond ((eq completion t))
	  ((null completion)
	   (error "Can't find completion for \"%s\"" pattern))
	  ((not (string-equal pattern completion))
	   (delete-region beg end)
	   (insert completion))
	  (t
	   (message "Making completion list...")
	   (let ((list (all-completions pattern table)))
	     (if (fboundp 'prettify)
		 (setq list (funcall 'prettify list)))
	     (with-output-to-temp-buffer "*Help*"
	       (display-completion-list list)))
	   (message "Making completion list...%s" "done")))))


(defun fetchmail-mode ()
  "Mode for editing .fetchmailrc files"
  (interactive)
  (kill-all-local-variables)
  (use-local-map fetchmail-mode-map)    ; This provides the local keymap.
  (setq mode-name "Fetchmail")          ; This name goes into the modeline.
  (setq major-mode 'fetchmail-mode)     ; Used by `describe-mode'
  (run-hooks 'fetchmail-mode-hook)      ; Run each time mode is called
  (set-syntax-table fetchmail-mode-syntax-table)

  ;; -cc-
  ;; Font lock support
  (make-local-variable 'font-lock-defaults)
  (setq font-lock-defaults '(fetchmail-font-lock-keywords nil t))

  (setq comment-start "#")
  )



(provide 'fetchmail-mode)