aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/net/sieve-mode.el97
1 files changed, 56 insertions, 41 deletions
diff --git a/lisp/net/sieve-mode.el b/lisp/net/sieve-mode.el
index 7575ba67c5e..77ab44f02db 100644
--- a/lisp/net/sieve-mode.el
+++ b/lisp/net/sieve-mode.el
@@ -57,7 +57,6 @@
57 57
58(defcustom sieve-mode-hook nil 58(defcustom sieve-mode-hook nil
59 "Hook run in sieve mode buffers." 59 "Hook run in sieve mode buffers."
60 :group 'sieve
61 :type 'hook) 60 :type 'hook)
62 61
63;; Font-lock 62;; Font-lock
@@ -72,8 +71,7 @@
72 (((class color) (background light)) (:foreground "Orchid")) 71 (((class color) (background light)) (:foreground "Orchid"))
73 (((class color) (background dark)) (:foreground "LightSteelBlue")) 72 (((class color) (background dark)) (:foreground "LightSteelBlue"))
74 (t (:bold t))) 73 (t (:bold t)))
75 "Face used for Sieve Control Commands." 74 "Face used for Sieve Control Commands.")
76 :group 'sieve)
77;; backward-compatibility alias 75;; backward-compatibility alias
78(put 'sieve-control-commands-face 'face-alias 'sieve-control-commands) 76(put 'sieve-control-commands-face 'face-alias 'sieve-control-commands)
79(put 'sieve-control-commands-face 'obsolete-face "22.1") 77(put 'sieve-control-commands-face 'obsolete-face "22.1")
@@ -86,8 +84,7 @@
86 (((class color) (background light)) (:foreground "Blue")) 84 (((class color) (background light)) (:foreground "Blue"))
87 (((class color) (background dark)) (:foreground "LightSkyBlue")) 85 (((class color) (background dark)) (:foreground "LightSkyBlue"))
88 (t (:inverse-video t :bold t))) 86 (t (:inverse-video t :bold t)))
89 "Face used for Sieve Action Commands." 87 "Face used for Sieve Action Commands.")
90 :group 'sieve)
91;; backward-compatibility alias 88;; backward-compatibility alias
92(put 'sieve-action-commands-face 'face-alias 'sieve-action-commands) 89(put 'sieve-action-commands-face 'face-alias 'sieve-action-commands)
93(put 'sieve-action-commands-face 'obsolete-face "22.1") 90(put 'sieve-action-commands-face 'obsolete-face "22.1")
@@ -104,8 +101,7 @@
104 (((class color) (background light)) (:foreground "CadetBlue")) 101 (((class color) (background light)) (:foreground "CadetBlue"))
105 (((class color) (background dark)) (:foreground "Aquamarine")) 102 (((class color) (background dark)) (:foreground "Aquamarine"))
106 (t (:bold t :underline t))) 103 (t (:bold t :underline t)))
107 "Face used for Sieve Test Commands." 104 "Face used for Sieve Test Commands.")
108 :group 'sieve)
109;; backward-compatibility alias 105;; backward-compatibility alias
110(put 'sieve-test-commands-face 'face-alias 'sieve-test-commands) 106(put 'sieve-test-commands-face 'face-alias 'sieve-test-commands)
111(put 'sieve-test-commands-face 'obsolete-face "22.1") 107(put 'sieve-test-commands-face 'obsolete-face "22.1")
@@ -120,8 +116,7 @@
120 (((class color) (background light)) (:foreground "Purple")) 116 (((class color) (background light)) (:foreground "Purple"))
121 (((class color) (background dark)) (:foreground "Cyan")) 117 (((class color) (background dark)) (:foreground "Cyan"))
122 (t (:bold t))) 118 (t (:bold t)))
123 "Face used for Sieve Tagged Arguments." 119 "Face used for Sieve Tagged Arguments.")
124 :group 'sieve)
125;; backward-compatibility alias 120;; backward-compatibility alias
126(put 'sieve-tagged-arguments-face 'face-alias 'sieve-tagged-arguments) 121(put 'sieve-tagged-arguments-face 'face-alias 'sieve-tagged-arguments)
127(put 'sieve-tagged-arguments-face 'obsolete-face "22.1") 122(put 'sieve-tagged-arguments-face 'obsolete-face "22.1")
@@ -149,28 +144,27 @@
149 144
150;; Syntax table 145;; Syntax table
151 146
152(defvar sieve-mode-syntax-table nil 147(defvar sieve-mode-syntax-table
148 (let ((st (make-syntax-table)))
149 (modify-syntax-entry ?\\ "\\" st)
150 (modify-syntax-entry ?\n "> " st)
151 (modify-syntax-entry ?\f "> " st)
152 (modify-syntax-entry ?\# "< " st)
153 (modify-syntax-entry ?/ ". 14" st)
154 (modify-syntax-entry ?* ". 23b" st)
155 (modify-syntax-entry ?+ "." st)
156 (modify-syntax-entry ?- "." st)
157 (modify-syntax-entry ?= "." st)
158 (modify-syntax-entry ?% "." st)
159 (modify-syntax-entry ?< "." st)
160 (modify-syntax-entry ?> "." st)
161 (modify-syntax-entry ?& "." st)
162 (modify-syntax-entry ?| "." st)
163 (modify-syntax-entry ?_ "_" st)
164 (modify-syntax-entry ?\' "\"" st)
165 st)
153 "Syntax table in use in sieve-mode buffers.") 166 "Syntax table in use in sieve-mode buffers.")
154 167
155(if sieve-mode-syntax-table
156 ()
157 (setq sieve-mode-syntax-table (make-syntax-table))
158 (modify-syntax-entry ?\\ "\\" sieve-mode-syntax-table)
159 (modify-syntax-entry ?\n "> " sieve-mode-syntax-table)
160 (modify-syntax-entry ?\f "> " sieve-mode-syntax-table)
161 (modify-syntax-entry ?\# "< " sieve-mode-syntax-table)
162 (modify-syntax-entry ?/ "." sieve-mode-syntax-table)
163 (modify-syntax-entry ?* "." sieve-mode-syntax-table)
164 (modify-syntax-entry ?+ "." sieve-mode-syntax-table)
165 (modify-syntax-entry ?- "." sieve-mode-syntax-table)
166 (modify-syntax-entry ?= "." sieve-mode-syntax-table)
167 (modify-syntax-entry ?% "." sieve-mode-syntax-table)
168 (modify-syntax-entry ?< "." sieve-mode-syntax-table)
169 (modify-syntax-entry ?> "." sieve-mode-syntax-table)
170 (modify-syntax-entry ?& "." sieve-mode-syntax-table)
171 (modify-syntax-entry ?| "." sieve-mode-syntax-table)
172 (modify-syntax-entry ?_ "_" sieve-mode-syntax-table)
173 (modify-syntax-entry ?\' "\"" sieve-mode-syntax-table))
174 168
175;; Key map definition 169;; Key map definition
176 170
@@ -182,13 +176,40 @@
182 map) 176 map)
183 "Key map used in sieve mode.") 177 "Key map used in sieve mode.")
184 178
185;; Menu definition 179;; Menu
186 180
187(defvar sieve-mode-menu nil 181(easy-menu-define sieve-mode-menu sieve-mode-map
188 "Menubar used in sieve mode.") 182 "Sieve Menu."
183 '("Sieve"
184 ["Upload script" sieve-upload t]
185 ["Manage scripts on server" sieve-manage t]))
189 186
190;; Code for Sieve editing mode. 187;; Code for Sieve editing mode.
191(autoload 'easy-menu-add-item "easymenu") 188
189
190(defun sieve-syntax-propertize (beg end)
191 (goto-char beg)
192 (sieve-syntax-propertize-text end)
193 (funcall
194 (syntax-propertize-rules
195 ;; FIXME: When there's a "text:" with a # comment, the \n plays dual role:
196 ;; it closes the comment and starts the string. This is problematic for us
197 ;; since syntax-table entries can either close a comment or
198 ;; delimit a string, but not both.
199 ("\\_<text:[ \t]*\\(?:#.*\\(.\\)\\)?\\(\n\\)"
200 (1 ">")
201 (2 (prog1 (unless (save-excursion
202 (nth 8 (syntax-ppss (match-beginning 0))))
203 (string-to-syntax "|"))
204 (sieve-syntax-propertize-text end)))))
205 beg end))
206
207(defun sieve-syntax-propertize-text (end)
208 (let ((ppss (syntax-ppss)))
209 (when (and (eq t (nth 3 ppss))
210 (re-search-forward "^\\.\\(\n\\)" end 'move))
211 (put-text-property (match-beginning 1) (match-end 1)
212 'syntax-table (string-to-syntax "|")))))
192 213
193;;;###autoload 214;;;###autoload
194(define-derived-mode sieve-mode c-mode "Sieve" 215(define-derived-mode sieve-mode c-mode "Sieve"
@@ -204,18 +225,12 @@ Turning on Sieve mode runs `sieve-mode-hook'."
204 (set (make-local-variable 'comment-end) "") 225 (set (make-local-variable 'comment-end) "")
205 ;;(set (make-local-variable 'comment-start-skip) "\\(^\\|\\s-\\);?#+ *") 226 ;;(set (make-local-variable 'comment-start-skip) "\\(^\\|\\s-\\);?#+ *")
206 (set (make-local-variable 'comment-start-skip) "#+ *") 227 (set (make-local-variable 'comment-start-skip) "#+ *")
228 (set (make-local-variable 'syntax-propertize-function)
229 #'sieve-syntax-propertize)
207 (set (make-local-variable 'font-lock-defaults) 230 (set (make-local-variable 'font-lock-defaults)
208 '(sieve-font-lock-keywords nil nil ((?_ . "w")))) 231 '(sieve-font-lock-keywords nil nil ((?_ . "w"))))
209 (easy-menu-add-item nil nil sieve-mode-menu)) 232 (easy-menu-add-item nil nil sieve-mode-menu))
210 233
211;; Menu
212
213(easy-menu-define sieve-mode-menu sieve-mode-map
214 "Sieve Menu."
215 '("Sieve"
216 ["Upload script" sieve-upload t]
217 ["Manage scripts on server" sieve-manage t]))
218
219(provide 'sieve-mode) 234(provide 'sieve-mode)
220 235
221;; sieve-mode.el ends here 236;; sieve-mode.el ends here