diff options
| author | Thomas Schneider <qsx@qsx.re> | 2019-03-10 20:05:32 +0100 |
|---|---|---|
| committer | Thomas Schneider <qsx@qsx.re> | 2019-03-10 20:05:32 +0100 |
| commit | 1a6b9ed29c626e2d2e3d3a4d3922e6e4cc5b77b5 (patch) | |
| tree | a774dc4b85b3f98132cb1a565b6683387bcb3c86 | |
| parent | 1d5527131007f65fec8586d022c4c6f125854f01 (diff) | |
Emacs: add contrib Cisco router mode
| -rw-r--r-- | dot.emacs.d/elisp/cisco-router-mode.el | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/dot.emacs.d/elisp/cisco-router-mode.el b/dot.emacs.d/elisp/cisco-router-mode.el new file mode 100644 index 0000000..5e2edcd --- /dev/null +++ b/dot.emacs.d/elisp/cisco-router-mode.el @@ -0,0 +1,161 @@ +;;; cisco-router-mode.el --- Major mode for editing Cisco router configuration files +;; +;; Copyright (C) 2004 Noufal Ibrahim <nkv at hcoop period net> +;; +;; This program is not part of Gnu Emacs +;; +;; cisco-router-mode.el 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. + +(defvar cisco-router-mode-hook nil + "Hook called by \"cisco-router-mode\"") + +(defvar cisco-router-mode-map + (let + ((cisco-router-mode-map (make-keymap))) + (define-key cisco-router-mode-map "\C-j" 'newline-and-indent) + cisco-router-mode-map) + "Keymap for Cisco router configuration major mode") + +;; Font locking definitions. +(defvar cisco-router-command-face 'cisco-router-command-face "Face for basic router commands") +(defvar cisco-router-toplevel-face 'cisco-router-toplevel-face "Face for top level commands") +(defvar cisco-router-no-face 'cisco-router-no-face "Face for \"no\"") +(defvar cisco-router-ipadd-face 'cisco-router-ipadd-face "Face for IP addresses") + +(defface cisco-router-ipadd-face + '( + (((type tty) (class color)) (:foreground "yellow")) + (((type graphic) (class color)) (:foreground "LightGoldenrod")) + (t (:foreground "LightGoldenrod" )) + ) + "Face for IP addresses") + +(defface cisco-router-command-face + '( + (((type tty) (class color)) (:foreground "cyan")) + (((type graphic) (class color)) (:foreground "cyan")) + (t (:foreground "cyan" )) + ) + "Face for basic router commands") + +(defface cisco-router-toplevel-face + '( + (((type tty) (class color)) (:foreground "blue")) + (((type graphic) (class color)) (:foreground "lightsteelblue")) + (t (:foreground "lightsteelblue" )) + ) + "Face for basic router commands") + +(defface cisco-router-no-face + '( + (t (:underline t)) + ) + "Face for \"no\"") + + +;; (regexp-opt '("interface" "ip vrf" "controller" "class-map" "redundancy" "line" "policy-map" "router" "access-list" "route-map") t) +;; (regexp-opt '("diagnostic" "hostname" "logging" "service" "alias" "snmp-server" "boot" "card" "vtp" "version" "enable") t) + +(defconst cisco-router-font-lock-keywords + (list + '( "\\<\\(access-list\\|c\\(?:lass-map\\|ontroller\\)\\|i\\(?:nterface\\|p vrf\\)\\|line\\|policy-map\\|r\\(?:edundancy\\|oute\\(?:-map\\|r\\)\\)\\)\\>". cisco-router-toplevel-face) + '( "\\<\\(alias\\|boot\\|card\\|diagnostic\\|^enable\\|hostname\\|logging\\|s\\(?:ervice\\|nmp-server\\)\\|v\\(?:ersion\\|tp\\)\\)\\>" . cisco-router-command-face) + '("\\<\\(no\\)\\>" . cisco-router-no-face) + '("\\<\\([0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\)\\>" . cisco-router-ipadd-face) + ) + "Font locking definitions for cisco router mode") + +;; Imenu definitions. +(defvar cisco-router-imenu-expression + '( + ("Interfaces" "^[\t ]*interface *\\(.*\\)" 1) + ("VRFs" "^ip vrf *\\(.*\\)" 1) + ("Controllers" "^[\t ]*controller *\\(.*\\)" 1) + ("Routing protocols" "^router *\\(.*\\)" 1) + ("Class maps" "^class-map *\\(.*\\)" 1) + ("Policy maps" "^policy-map *\\(.*\\)" 1) + )) + +;; Indentation definitions. +(defun cisco-router-indent-line () + "Indent current line as cisco router config line" + (let ((indent0 "^interface\\|redundancy\\|^line\\|^ip vrf \\|^controller\\|^class-map\\|^policy-map\\|router\\|access-list\\|route-map") + (indent1 " *main-cpu\\| *class\\W")) + (beginning-of-line) + (let ((not-indented t) + (cur-indent 0)) + (cond ((or (bobp) (looking-at indent0) (looking-at "!")) ; Handles the indent0 and indent1 lines +; (message "Indent0") + (setq not-indented nil + cur-indent 0)) + ((looking-at indent1) +; (message "Indent1") + (setq not-indented nil + cur-indent 1))) + (save-excursion ; Indents regular lines depending on the block they're in. + (while not-indented + (forward-line -1) + (cond ((looking-at indent1) +; (message "Indent1 block") + (setq cur-indent 2 + not-indented nil)) + ((looking-at indent0) +; (message "Indent0 block") + (setq cur-indent 1 + not-indented nil)) + ((looking-at "!") +; (message "Reached !") + (setq cur-indent 0 + not-indented nil)) + ((bobp) +; (message "Buffer beginning reached") + (setq cur-indent 0 + not-indented nil))))) + (indent-line-to cur-indent)))) + + +;; Custom syntax table +(defvar cisco-router-mode-syntax-table (make-syntax-table) + "Syntax table for cisco router mode") + +(modify-syntax-entry ?_ "w" cisco-router-mode-syntax-table) ;All _'s are part of words. +(modify-syntax-entry ?- "w" cisco-router-mode-syntax-table) ;All -'s are part of words. +(modify-syntax-entry ?! "<" cisco-router-mode-syntax-table) ;All !'s start comments. +(modify-syntax-entry ?\n ">" cisco-router-mode-syntax-table) ;All newlines end comments. +(modify-syntax-entry ?\r ">" cisco-router-mode-syntax-table) ;All linefeeds end comments. + +;; Entry point +(defun cisco-router-mode () + "Major mode for editing Cisco router configuration files" + (interactive) + (kill-all-local-variables) + (set-syntax-table cisco-router-mode-syntax-table) + (use-local-map cisco-router-mode-map) + (set (make-local-variable 'font-lock-defaults) '(cisco-router-font-lock-keywords)) + (set (make-local-variable 'indent-line-function) 'cisco-router-indent-line) + (set (make-local-variable 'comment-start) "!") + (set (make-local-variable 'comment-start-skip) "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)!+ *") + (setq imenu-case-fold-search nil) + (set (make-local-variable 'imenu-generic-expression) cisco-router-imenu-expression) + (imenu-add-to-menubar "Imenu") + (setq major-mode 'cisco-router-mode + mode-name "Cisco router configuration") + (run-hooks cisco-router-mode-hook)) + +(add-to-list 'auto-mode-alist '("\\.cfg\\'" . cisco-router-mode)) + +(provide 'cisco-router-mode) + +;;; cisco-router-mode.el ends here |
