(sh-font-lock-keywords): Don't crash for an unrecognized shell.
[bpt/emacs.git] / lisp / snmp-mode.el
1 ;;; snmp-mode.el --- SNMP & SNMPv2 MIB major mode.
2
3 ;; Copyright (C) 1995,1998 Free Software Foundation, Inc.
4
5 ;; Author: Paul D. Smith <psmith@BayNetworks.com>
6 ;; Keywords: data
7
8 ;; This file is part of GNU Emacs.
9
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
13 ;; any later version.
14
15 ;; GNU Emacs is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
24
25 ;; INTRODUCTION
26 ;; ------------
27 ;; This package provides a major mode for editing SNMP MIBs. It
28 ;; provides all the modern Emacs 19 bells and whistles: default
29 ;; fontification via font-lock, imenu search functions, etc.
30 ;;
31 ;; SNMP mode also uses tempo, a textual boilerplate insertion package
32 ;; distributed with Emacs, to add in boilerplate SNMP MIB structures.
33 ;; See tempo.el for more details about tempo.
34 ;;
35 ;; If you want to change or add new tempo templates, use the tempo tag
36 ;; list `snmp-tempo-tags' (or `snmpv2-tempo-tags'): this list is
37 ;; automatically installed when snmp-mode (or snmpv2-mode) is entered.
38 ;;
39 ;; The SNMPv2 mode in this version has been enhanced thanks to popular
40 ;; demand.
41 ;;
42 ;; I'm very interested in new tempo macros for both v1 and v2, and any
43 ;; other suggestions for enhancements (different syntax table items, new
44 ;; keybindings, etc.)
45 ;;
46 ;;
47 ;; USAGE
48 ;; -----
49 ;; Mostly, use it as you would any other mode. There's a very
50 ;; simplistic auto-indent feature; hopefully it'll help more than get in
51 ;; your way. For the most part it tries to indent to the same level as
52 ;; the previous line. It will try to recognize some very simple tokens
53 ;; on the previous line that tell it to use extra indent or outdent.
54 ;;
55 ;; Templates
56 ;; ---------
57 ;; To use the Tempo templates, type the Tempo tag (or a unique prefix)
58 ;; and use C-c C-i (C-c TAB) to complete it; if you don't have
59 ;; tempo-interactive set to nil it will ask you to fill in values.
60 ;; Fields with predefined values (SYNTAX, STATUS, etc.) will do
61 ;; completing-reads on a list of valid values; use the normal SPC or TAB
62 ;; to complete.
63 ;;
64 ;; Currently the following templates are available:
65 ;;
66 ;; objectType -- Defines an OBJECT-TYPE macro.
67 ;;
68 ;; tableType -- Defines both a Table and Entry OBJECT-TYPE, and a
69 ;; SEQUENCE for the ASN.1 Entry definition.
70 ;;
71 ;; Once the template is done, you can use C-cC-f and C-cC-b to move back
72 ;; and forth between the Tempo sequence points to fill in the rest of
73 ;; the information.
74 ;;
75 ;; Font Lock
76 ;; ------------
77 ;;
78 ;; If you want font-lock in your MIB buffers, add this:
79 ;;
80 ;; (add-hook 'snmp-common-mode-hook 'turn-on-font-lock)
81 ;;
82 ;; Enabling global-font-lock-mode is also sufficient.
83 ;;
84
85 ;;;----------------------------------------------------------------------------
86 ;;
87 ;; Customize these:
88 ;;
89 ;;;----------------------------------------------------------------------------
90
91 (defgroup snmp nil
92 "Mode for editing SNMP MIB files."
93 :group 'data
94 :version "20.3")
95
96 (defcustom snmp-special-indent t
97 "*If non-nil, use a simple heuristic to try to guess the right indentation.
98 If nil, then no special indentation is attempted."
99 :type 'boolean
100 :group 'snmp)
101
102 (defcustom snmp-indent-level 4
103 "*Indentation level for SNMP MIBs."
104 :type 'integer
105 :group 'snmp)
106
107 (defcustom snmp-tab-always-indent nil
108 "*Non-nil means TAB should always reindent the current line.
109 A value of nil means reindent if point is within the initial line indentation;
110 otherwise insert a TAB."
111 :type 'boolean
112 :group 'snmp)
113
114 (defcustom snmp-completion-ignore-case t
115 "*Non-nil means that case differences are ignored during completion.
116 A value of nil means that case is significant.
117 This is used during Tempo template completion."
118 :type 'boolean
119 :group 'snmp)
120
121 (defcustom snmp-common-mode-hook nil
122 "*Hook(s) evaluated when a buffer enters either SNMP or SNMPv2 mode."
123 :type 'hook
124 :group 'snmp)
125
126 (defcustom snmp-mode-hook nil
127 "*Hook(s) evaluated when a buffer enters SNMP mode."
128 :type 'hook
129 :group 'snmp)
130
131 (defcustom snmpv2-mode-hook nil
132 "*Hook(s) evaluated when a buffer enters SNMPv2 mode."
133 :type 'hook
134 :group 'snmp)
135
136 (defvar snmp-tempo-tags nil
137 "*Tempo tags for SNMP mode.")
138
139 (defvar snmpv2-tempo-tags nil
140 "*Tempo tags for SNMPv2 mode.")
141
142
143 ;; Enable fontification for SNMP MIBs
144 ;;
145
146 ;; These are pretty basic fontifications. Note we assume these macros
147 ;; are first on a line (except whitespace), to speed up fontification.
148 ;;
149 (defvar snmp-font-lock-keywords-1
150 (list
151 ;; OBJECT-TYPE, TRAP-TYPE, and OBJECT-IDENTIFIER macros
152 '("^[ \t]*\\([a-z][-a-zA-Z0-9]+\\)[ \t]+\\(\\(MODULE-\\(COMPLIANCE\\|IDENTITY\\)\\|OBJECT-\\(COMPLIANCE\\|GROUP\\|IDENTITY\\|TYPE\\)\\|TRAP-\\(GROUP\\|TYPE\\)\\)\\|\\(OBJECT\\)[ \t]+\\(IDENTIFIER\\)[ \t]*::=\\)"
153 (1 font-lock-variable-name-face) (3 font-lock-keyword-face nil t)
154 (7 font-lock-keyword-face nil t) (8 font-lock-keyword-face nil t))
155
156 ;; DEFINITIONS clause
157 '("^[ \t]*\\([A-Z][-a-zA-Z0-9]+\\)[ \t]+\\(DEFINITIONS\\)[ \t]*::="
158 (1 font-lock-function-name-face) (2 font-lock-keyword-face))
159 )
160 "Basic SNMP MIB mode expression highlighting.")
161
162 (defvar snmp-font-lock-keywords-2
163 (append
164 '(("ACCESS\\|BEGIN\\|DE\\(FVAL\\|SCRIPTION\\)\\|END\\|FROM\\|I\\(MPORTS\\|NDEX\\)\\|S\\(TATUS\\|YNTAX\\)"
165 (0 font-lock-keyword-face)))
166 snmp-font-lock-keywords-1)
167 "Medium SNMP MIB mode expression highlighting.")
168
169 (defvar snmp-font-lock-keywords-3
170 (append
171 '(("\\([^\n]+\\)[ \t]+::=[ \t]+\\(SEQUENCE\\)[ \t]+{"
172 (1 font-lock-reference-face) (2 font-lock-keyword-face))
173 ("::=[ \t]*{[ \t]*\\([a-z0-9].*[ \t]+\\)?\\([0-9]+\\)[ \t]*}"
174 (1 font-lock-reference-face nil t) (2 font-lock-variable-name-face)))
175 snmp-font-lock-keywords-2)
176 "Gaudy SNMP MIB mode expression highlighting.")
177
178 (defvar snmp-font-lock-keywords snmp-font-lock-keywords-1
179 "Default SNMP MIB mode expression highlighting.")
180
181
182 ;; These lists are used for the completion capabilities in the tempo
183 ;; templates.
184 ;;
185
186 (defvar snmp-mode-syntax-list nil
187 "Predefined types for SYNTAX clauses.")
188
189 (defvar snmp-rfc1155-types
190 '(("INTEGER") ("OCTET STRING") ("OBJECT IDENTIFIER") ("NULL") ("IpAddress")
191 ("NetworkAddress") ("Counter") ("Gauge") ("TimeTicks") ("Opaque"))
192 "Types from RFC 1155 v1 SMI.")
193
194 (defvar snmp-rfc1213-types
195 '(("DisplayString"))
196 "Types from RFC 1213 MIB-II.")
197
198 (defvar snmp-rfc1902-types
199 '(("INTEGER") ("OCTET STRING") ("OBJECT IDENTIFIER") ("Integer32")
200 ("IpAddress") ("Counter32") ("Gauge32") ("Unsigned32") ("TimeTicks")
201 ("Opaque") ("Counter64"))
202 "Types from RFC 1902 v2 SMI.")
203
204 (defvar snmp-rfc1903-types
205 '(("DisplayString") ("PhysAddress") ("MacAddress") ("TruthValue")
206 ("TestAndIncr") ("AutonomousType") ("InstancePointer")
207 ("VariablePointer") ("RowPointer") ("RowStatus") ("TimeStamp")
208 ("TimeInterval") ("DateAndTime") ("StorageType") ("TDomain")
209 ("TAddress"))
210 "Types from RFC 1903 Textual Conventions.")
211
212
213 (defvar snmp-mode-access-list nil
214 "Predefined values for ACCESS clauses.")
215
216 (defvar snmp-rfc1155-access
217 '(("read-only") ("read-write") ("write-only") ("not-accessible"))
218 "ACCESS values from RFC 1155 v1 SMI.")
219
220 (defvar snmp-rfc1902-access
221 '(("read-only") ("read-write") ("read-create") ("not-accessible")
222 ("accessible-for-notify"))
223 "ACCESS values from RFC 1155 v1 SMI.")
224
225
226 (defvar snmp-mode-status-list nil
227 "Predefined values for STATUS clauses.")
228
229 (defvar snmp-rfc1212-status
230 '(("mandatory") ("obsolete") ("deprecated"))
231 "STATUS values from RFC 1212 v1 SMI.")
232
233 (defvar snmp-rfc1902-status
234 '(("current") ("obsolete") ("deprecated"))
235 "STATUS values from RFC 1902 v2 SMI.")
236
237
238 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
239 ;;;----------------------------------------------------------------------------
240 ;;
241 ;; Nothing to customize below here.
242 ;;
243 ;;;----------------------------------------------------------------------------
244 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
245
246
247 ;; Need this stuff when compiling for imenu macros, etc.
248 ;;
249 (eval-when-compile
250 (require 'cl)
251 (require 'imenu))
252
253
254 ;; Create abbrev table for SNMP MIB mode
255 ;;
256 (defvar snmp-mode-abbrev-table nil
257 "Abbrev table in use in SNMP mode.")
258 (define-abbrev-table 'snmp-mode-abbrev-table ())
259
260
261 ;; Create abbrev table for SNMPv2 mode
262 ;;
263 (defvar snmpv2-mode-abbrev-table nil
264 "Abbrev table in use in SNMPv2 mode.")
265 (define-abbrev-table 'snmpv2-mode-abbrev-table ())
266
267
268 ;; Set up our keymap
269 ;;
270 (defvar snmp-mode-map (make-sparse-keymap)
271 "Keymap used in SNMP mode.")
272
273 (define-key snmp-mode-map "\t" 'snmp-indent-command)
274 (define-key snmp-mode-map "\177" 'backward-delete-char-untabify)
275
276 (define-key snmp-mode-map "\C-c\C-i" 'tempo-complete-tag)
277 (define-key snmp-mode-map "\C-c\C-f" 'tempo-forward-mark)
278 (define-key snmp-mode-map "\C-c\C-b" 'tempo-backward-mark)
279
280
281 ;; Set up our syntax table
282 ;;
283 (defvar snmp-mode-syntax-table nil
284 "Syntax table used for buffers in SNMP mode.")
285
286 (if snmp-mode-syntax-table
287 ()
288 (setq snmp-mode-syntax-table (make-syntax-table))
289 (modify-syntax-entry ?\\ "\\" snmp-mode-syntax-table)
290 (modify-syntax-entry ?- "_ 1234" snmp-mode-syntax-table)
291 (modify-syntax-entry ?\n ">" snmp-mode-syntax-table)
292 (modify-syntax-entry ?\^m ">" snmp-mode-syntax-table)
293 (modify-syntax-entry ?_ "." snmp-mode-syntax-table)
294 (modify-syntax-entry ?: "." snmp-mode-syntax-table)
295 (modify-syntax-entry ?= "." snmp-mode-syntax-table))
296
297 ;; Set up the stuff that's common between snmp-mode and snmpv2-mode
298 ;;
299 (defun snmp-common-mode (name mode abbrev font-keywords imenu-index tempo-tags)
300 (kill-all-local-variables)
301
302 ;; Become the current major mode
303 (setq mode-name name)
304 (setq major-mode mode)
305
306 ;; Activate keymap, syntax table, and abbrev table
307 (use-local-map snmp-mode-map)
308 (set-syntax-table snmp-mode-syntax-table)
309 (setq local-abbrev-table abbrev)
310
311 ;; Set up paragraphs (?)
312 (make-local-variable 'paragraph-start)
313 (setq paragraph-start (concat "$\\|" page-delimiter))
314 (make-local-variable 'paragraph-separate)
315 (setq paragraph-separate paragraph-start)
316 (make-local-variable 'paragraph-ignore-fill-prefix)
317 (setq paragraph-ignore-fill-prefix t)
318
319 ;; Set up comments
320 (make-local-variable 'comment-start)
321 (setq comment-start "-- ")
322 (make-local-variable 'comment-start-skip)
323 (setq comment-start-skip "--+[ \t]*")
324 (make-local-variable 'comment-column)
325 (setq comment-column 40)
326 (make-local-variable 'parse-sexp-ignore-comments)
327 (setq parse-sexp-ignore-comments t)
328
329 ;; Set up indentation
330 (make-local-variable 'indent-line-function)
331 (setq indent-line-function (if snmp-special-indent
332 'snmp-indent-line
333 'indent-to-left-margin))
334
335 ;; Font Lock
336 (make-local-variable 'font-lock-defaults)
337 (setq font-lock-defaults (cons font-keywords '(nil nil ((?- . "w 1234")))))
338
339 ;; Imenu
340 (make-local-variable 'imenu-create-index-function)
341 (setq imenu-create-index-function imenu-index)
342
343 ;; Tempo
344 (tempo-use-tag-list tempo-tags)
345 (make-local-variable 'tempo-match-finder)
346 (setq tempo-match-finder "\\b\\(.+\\)\\=")
347 (make-local-variable 'tempo-interactive)
348 (setq tempo-interactive t)
349
350 ;; Miscellaneous customization
351 (make-local-variable 'require-final-newline)
352 (setq require-final-newline t))
353
354
355 ;; SNMPv1 MIB Editing Mode.
356 ;;
357 (defun snmp-mode ()
358 "Major mode for editing SNMP MIBs.
359 Expression and list commands understand all C brackets.
360 Tab indents for C code.
361 Comments start with -- and end with newline or another --.
362 Delete converts tabs to spaces as it moves back.
363 \\{snmp-mode-map}
364 Turning on snmp-mode runs the hooks in `snmp-common-mode-hook', then
365 `snmp-mode-hook'."
366 (interactive)
367
368 (snmp-common-mode "SNMP" 'snmp-mode
369 snmp-mode-abbrev-table
370 '(snmp-font-lock-keywords
371 snmp-font-lock-keywords-1
372 snmp-font-lock-keywords-2
373 snmp-font-lock-keywords-3)
374 'snmp-mode-imenu-create-index
375 'snmp-tempo-tags)
376
377 ;; Completion lists
378 (make-local-variable 'snmp-mode-syntax-list)
379 (setq snmp-mode-syntax-list (append snmp-rfc1155-types
380 snmp-rfc1213-types
381 snmp-mode-syntax-list))
382 (make-local-variable 'snmp-mode-access-list)
383 (setq snmp-mode-access-list snmp-rfc1155-access)
384 (make-local-variable 'snmp-mode-status-list)
385 (setq snmp-mode-status-list snmp-rfc1212-status)
386
387 ;; Run hooks
388 (run-hooks 'snmp-common-mode-hook)
389 (run-hooks 'snmp-mode-hook))
390
391
392 (defun snmpv2-mode ()
393 "Major mode for editing SNMPv2 MIBs.
394 Expression and list commands understand all C brackets.
395 Tab indents for C code.
396 Comments start with -- and end with newline or another --.
397 Delete converts tabs to spaces as it moves back.
398 \\{snmp-mode-map}
399 Turning on snmp-mode runs the hooks in `snmp-common-mode-hook',
400 then `snmpv2-mode-hook'."
401 (interactive)
402
403 (snmp-common-mode "SNMPv2" 'snmpv2-mode
404 snmpv2-mode-abbrev-table
405 '(snmp-font-lock-keywords
406 snmp-font-lock-keywords-1
407 snmp-font-lock-keywords-2
408 snmp-font-lock-keywords-3)
409 'snmp-mode-imenu-create-index
410 'snmpv2-tempo-tags)
411
412 ;; Completion lists
413 (make-local-variable 'snmp-mode-syntax-list)
414 (setq snmp-mode-syntax-list (append snmp-rfc1902-types
415 snmp-rfc1903-types
416 snmp-mode-syntax-list))
417 (make-local-variable 'snmp-mode-access-list)
418 (setq snmp-mode-access-list snmp-rfc1902-access)
419 (make-local-variable 'snmp-mode-status-list)
420 (setq snmp-mode-status-list snmp-rfc1902-status)
421
422 ;; Run hooks
423 (run-hooks 'snmp-common-mode-hook)
424 (run-hooks 'snmpv2-mode-hook))
425
426
427 ;;;----------------------------------------------------------------------------
428 ;;
429 ;; Indentation Setup
430 ;;
431 ;;;----------------------------------------------------------------------------
432
433 (defvar snmp-macro-open
434 "[a-zA-Z][-a-zA-Z0-9]*[ \t]*\\(OBJECT\\|TRAP\\)-\\(TYPE\\|GROUP\\)\
435 \\|DESCRIPTION\\|IMPORTS\\|MODULE\\(-IDENTITY\\|-COMPLIANCE\\)\
436 \\|.*::=[ \t]*\\(BEGIN\\|TEXTUAL-CONVENTION\\)[ \t]*$")
437
438 (defvar snmp-macro-close
439 "::=[ \t]*{\\|\\(END\\|.*[;\"]\\)[ \t]*$")
440
441 (defun snmp-calculate-indent ()
442 "Calculate the current line indentation in SNMP MIB code.
443
444 We use a very simple scheme: if the previous non-empty line was a \"macro
445 open\" string, add `snmp-indent-level' to it. If it was a \"macro close\"
446 string, subtract `snmp-indent-level'. Otherwise, use the same indentation
447 as the previous non-empty line. Note comments are considered empty
448 lines for the purposes of this function."
449 (let ((empty (concat "\\([ \t]*\\)\\(" comment-start-skip "\\|$\\)"))
450 (case-fold-search nil)) ; keywords must be in uppercase
451 (save-excursion
452 (while (and (>= (forward-line -1) 0)
453 (looking-at empty)))
454 (skip-chars-forward " \t")
455 (+ (current-column)
456 ;; Are we looking at a macro open string? If so, add more.
457 (cond ((looking-at snmp-macro-open)
458 snmp-indent-level)
459 ;; macro close string? If so, remove some.
460 ((looking-at snmp-macro-close)
461 (- snmp-indent-level))
462 ;; Neither; just stay here.
463 (t 0))))))
464
465 (defun snmp-indent-line ()
466 "Indent current line as SNMP MIB code."
467 (let ((indent (snmp-calculate-indent))
468 (pos (- (point-max) (point)))
469 shift-amt beg end)
470 (beginning-of-line)
471 (setq beg (point))
472 (skip-chars-forward " \t")
473 (setq shift-amt (- indent (current-column)))
474 (if (zerop shift-amt)
475 nil
476 (delete-region beg (point))
477 (indent-to indent))
478 ;; If initial point was within line's indentation,
479 ;; position after the indentation. Else stay at same point in text.
480 (if (> (- (point-max) pos) (point))
481 (goto-char (- (point-max) pos)))))
482
483 (defun snmp-indent-command ()
484 "Indent current line as SNMP MIB code, or sometimes insert a TAB.
485 If `snmp-tab-always-indent' is t, always reindent the current line when
486 this command is run.
487 If `snmp-tab-always-indent' is nil, reindent the current line if point is
488 in the initial indentation. Otherwise, insert a TAB."
489 (interactive)
490 (if (and (not snmp-tab-always-indent)
491 (save-excursion
492 (skip-chars-backward " \t")
493 (not (bolp))))
494 (insert-tab)
495 (snmp-indent-line)))
496
497
498 ;;;----------------------------------------------------------------------------
499 ;;
500 ;; Imenu Setup
501 ;;
502 ;;;----------------------------------------------------------------------------
503
504 (defvar snmp-clause-regexp
505 "^[ \t]*\\([a-zA-Z][-a-zA-Z0-9]*\\)[ \t\n]*\
506 \\(TRAP-TYPE\\|::=\\|OBJECT\\(-TYPE[ \t\n]+SYNTAX\\|[ \t\n]+IDENTIFIER[ \t\n]*::=\\)\\)")
507
508 (defun snmp-mode-imenu-create-index ()
509 (let ((index-alist '())
510 (index-oid-alist '())
511 (index-tc-alist '())
512 (index-table-alist '())
513 (index-trap-alist '())
514 (case-fold-search nil) ; keywords must be uppercase
515 prev-pos token marker end)
516 (goto-char (point-min))
517 (imenu-progress-message prev-pos 0)
518 ;; Search for a useful MIB item (that's not in a comment)
519 (save-match-data
520 (while (re-search-forward snmp-clause-regexp nil t)
521 (imenu-progress-message prev-pos)
522 (setq
523 end (match-end 0)
524 token (cons (buffer-substring (match-beginning 1) (match-end 1))
525 (set-marker (make-marker) (match-beginning 1))))
526 (goto-char (match-beginning 2))
527 (cond ((looking-at "OBJECT-TYPE[ \t\n]+SYNTAX")
528 (push token index-alist))
529 ((looking-at "OBJECT[ \t\n]+IDENTIFIER[ \t\n]*::=")
530 (push token index-oid-alist))
531 ((looking-at "::=[ \t\n]*SEQUENCE[ \t\n]*{")
532 (push token index-table-alist))
533 ((looking-at "TRAP-TYPE")
534 (push token index-trap-alist))
535 ((looking-at "::=")
536 (push token index-tc-alist)))
537 (goto-char end)))
538 ;; Create the menu
539 (imenu-progress-message prev-pos 100)
540 (setq index-alist (nreverse index-alist))
541 (and index-tc-alist
542 (push (cons "Textual Conventions" (nreverse index-tc-alist))
543 index-alist))
544 (and index-trap-alist
545 (push (cons "Traps" (nreverse index-trap-alist))
546 index-alist))
547 (and index-table-alist
548 (push (cons "Tables" (nreverse index-table-alist))
549 index-alist))
550 (and index-oid-alist
551 (push (cons "Object IDs" (nreverse index-oid-alist))
552 index-alist))
553 index-alist))
554
555
556 ;;;----------------------------------------------------------------------------
557 ;;
558 ;; Tempo Setup
559 ;;
560 ;;;----------------------------------------------------------------------------
561
562 (require 'tempo)
563
564 ;; Perform a completing-read with info given
565 ;;
566 (defun snmp-completing-read (prompt table &optional pred require init hist)
567 "Read from the minibuffer, with completion.
568 Like `completing-read', but the variable `snmp-completion-ignore-case'
569 controls whether case is significant."
570 (let ((completion-ignore-case snmp-completion-ignore-case))
571 (completing-read prompt table pred require init hist)))
572
573 ;; OBJECT-TYPE macro template
574 ;;
575 (tempo-define-template "snmp-object-type"
576 '(> (P "Object Label: ") " OBJECT-TYPE" n>
577 "SYNTAX "
578 (if tempo-interactive
579 (snmp-completing-read "Syntax: " snmp-mode-syntax-list nil nil)
580 p) n>
581 "ACCESS "
582 (if tempo-interactive
583 (snmp-completing-read "Access: " snmp-mode-access-list nil t)
584 p) n>
585 "STATUS "
586 (if tempo-interactive
587 (snmp-completing-read "Status: " snmp-mode-status-list nil t)
588 p) n>
589 "DESCRIPTION" n> "\"" p "\"" n>
590 (P "Default Value: " defval t)
591 (if (string= "" (tempo-lookup-named 'defval))
592 nil
593 '(l "DEFVAL { " (s defval) " }" n>))
594 "::= { " (p "OID: ") " }" n)
595 "objectType"
596 "Insert an OBJECT-TYPE macro."
597 'snmp-tempo-tags)
598
599 ;; Table macro template
600 ;;
601 (tempo-define-template "snmp-table-type"
602 ;; First the table OBJECT-TYPE
603 '(> (P "Table Name: " table)
604 (P "Entry Name: " entry t)
605 (let* ((entry (tempo-lookup-named 'entry))
606 (seq (copy-sequence entry)))
607 (aset entry 0 (downcase (aref entry 0)))
608 (aset seq 0 (upcase (aref seq 0)))
609 (tempo-save-named 'obj-entry entry)
610 (tempo-save-named 'seq-entry seq)
611 nil)
612 " OBJECT-TYPE" n>
613 "SYNTAX SEQUENCE OF "
614 (s seq-entry) n>
615 "ACCESS not-accessible" n>
616 "STATUS mandatory" n>
617 "DESCRIPTION" n> "\"" p "\"" n>
618 "::= { " (p "OID: ") " }" n n>
619 ;; Next the row OBJECT-TYPE
620 (s obj-entry) " OBJECT-TYPE" n>
621 "SYNTAX " (s seq-entry) n>
622 "ACCESS not-accessible" n>
623 "STATUS mandatory" n>
624 "DESCRIPTION" n> "\"" p "\"" n>
625 "INDEX { " (p "Index List: ") " }" n>
626 "::= {" (s table) " 1 }" n n>
627 ;; Finally the SEQUENCE type
628 (s seq-entry) " ::= SEQUENCE {" n> p n> "}" n)
629 "tableType"
630 "Insert an SNMP table."
631 'snmp-tempo-tags)
632
633
634 ;; v2 SMI OBJECT-TYPE macro template
635 ;;
636 (tempo-define-template "snmpv2-object-type"
637 '(> (P "Object Label: ") " OBJECT-TYPE" n>
638 "SYNTAX "
639 (if tempo-interactive
640 (snmp-completing-read "Syntax: " snmp-mode-syntax-list nil nil)
641 p) n>
642 "MAX-ACCESS "
643 (if tempo-interactive
644 (snmp-completing-read "Max Access: " snmp-mode-access-list nil t)
645 p) n>
646 "STATUS "
647 (if tempo-interactive
648 (snmp-completing-read "Status: " snmp-mode-status-list nil t)
649 p) n>
650 "DESCRIPTION" n> "\"" p "\"" n>
651 (P "Default Value: " defval t)
652 (if (string= "" (tempo-lookup-named 'defval))
653 nil
654 '(l "DEFVAL { " (s defval) " }" n>))
655 "::= { " (p "OID: ") " }" n)
656 "objectType"
657 "Insert an v2 SMI OBJECT-TYPE macro."
658 'snmpv2-tempo-tags)
659
660 ;; v2 SMI Table macro template
661 ;;
662 (tempo-define-template "snmpv2-table-type"
663 ;; First the table OBJECT-TYPE
664 '(> (P "Table Name: " table)
665 (P "Entry Name: " entry t)
666 (let* ((entry (tempo-lookup-named 'entry))
667 (seq (copy-sequence entry)))
668 (aset entry 0 (downcase (aref entry 0)))
669 (aset seq 0 (upcase (aref seq 0)))
670 (tempo-save-named 'obj-entry entry)
671 (tempo-save-named 'seq-entry seq)
672 nil)
673 " OBJECT-TYPE" n>
674 "SYNTAX SEQUENCE OF "
675 (s seq-entry) n>
676 "MAX-ACCESS not-accessible" n>
677 "STATUS current" n>
678 "DESCRIPTION" n> "\"" p "\"" n>
679 "::= { " (p "OID: ") " }" n n>
680 ;; Next the row OBJECT-TYPE
681 (s obj-entry) " OBJECT-TYPE" n>
682 "SYNTAX " (s seq-entry) n>
683 "MAX-ACCESS not-accessible" n>
684 "STATUS current" n>
685 "DESCRIPTION" n> "\"" p "\"" n>
686 "INDEX { " (p "Index List: ") " }" n>
687 "::= { " (s table) " 1 }" n n>
688 ;; Finally the SEQUENCE type
689 (s seq-entry) " ::= SEQUENCE {" n> p n> "}" n)
690 "tableType"
691 "Insert an v2 SMI SNMP table."
692 'snmpv2-tempo-tags)
693
694 ;; v2 SMI TEXTUAL-CONVENTION macro template
695 ;;
696 (tempo-define-template "snmpv2-textual-convention"
697 '(> (P "Texual Convention Type: ") " ::= TEXTUAL-CONVENTION" n>
698 "STATUS "
699 (if tempo-interactive
700 (snmp-completing-read "Status: " snmp-mode-status-list nil t)
701 p) n>
702 "DESCRIPTION" n> "\"" p "\"" n>
703 "SYNTAX "
704 (if tempo-interactive
705 (snmp-completing-read "Syntax: " snmp-mode-syntax-list nil nil)
706 p) n> )
707 "textualConvention"
708 "Insert an v2 SMI TEXTUAL-CONVENTION macro."
709 'snmpv2-tempo-tags)
710
711
712 (provide 'snmp-mode)
713
714 ;; snmp-mode.el ends here