neitzel@infbs.uucp (Martin Neitzel) (01/04/89)
I just hacked up this little asm-mode. ("Oh no!"). Even if you throw the asm-mode itself far away, it might be worthwhile to rip off the function asm-comment, which handles general eol-comments in a nice way. For example, you could use it for Ada, Icon, and Lisp too. A comment request (triggered by, say, ";") will try to figure out the appropriate kind of comment based on the current context. If this isn't the kind you want, simply hit ";" again: e.g., a side comment will be promoted to a comment on its own line indented like code and so on. I like it, but your mileage may vary... Uhhhmmm, yes, I don't know how to elisp... Martin ---snip--- ;; Asm-mode, and its related commands. ;; Cloned from text-mode, and therefore the usual prelude is inevitable: ;; Copyright (C) 1985, 1989 Free Software Foundation, Inc. ;; This file is part of GNU Emacs. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY. No author or distributor ;; accepts responsibility to anyone for the consequences of using it ;; or for whether it serves any particular purpose or works at all, ;; unless he says so in writing. Refer to the GNU Emacs General Public ;; License for full details. ;; Everyone is granted permission to copy, modify and redistribute ;; GNU Emacs, but only under the conditions described in the ;; GNU Emacs General Public License. A copy of this license is ;; supposed to have been given to you along with GNU Emacs so you ;; can know your rights and responsibilities. It should be in a ;; file named COPYING. Among other things, the copyright notice ;; and this notice must be preserved on all copies. (defvar asm-mode-syntax-table nil "Syntax table used while in asm mode.") (defvar asm-mode-abbrev-table nil "Abbrev table used while in asm mode.") (define-abbrev-table 'asm-mode-abbrev-table ()) (if asm-mode-syntax-table () (setq asm-mode-syntax-table (make-syntax-table)) (set-syntax-table asm-mode-syntax-table) (modify-syntax-entry ?; "< " asm-mode-syntax-table) (modify-syntax-entry ?\n "> " asm-mode-syntax-table)) (defvar asm-mode-map nil "") (if asm-mode-map () (setq asm-mode-map (make-sparse-keymap)) (define-key asm-mode-map "\t" 'tab-to-tab-stop) (define-key asm-mode-map ":" 'asm-colon) (define-key asm-mode-map ";" 'asm-comment) (define-key asm-mode-map "\C-c\C-c" 'compile) (define-key asm-mode-map "\C-c\C-n" 'next-error) ) (defun asm-mode () " Major mode for editing typical assembler code \(gack!\). Features: own asm-mode-abbrev-table \\[asm-colon]\toutdents labels, \\[asm-comment]\tmakes placement of comments a fun game. Turning on asm-mode calls the value of the variable asm-mode-hook, if that value is non-nil. You probably want to redefine the variables comment-start and comment-start-skip there. Special commands:\\{asm-mode-map} " (interactive) (kill-all-local-variables) (use-local-map asm-mode-map) (setq mode-name "Asm") (setq major-mode 'asm-mode) (setq local-abbrev-table asm-mode-abbrev-table) (set-syntax-table asm-mode-syntax-table) (make-local-variable 'comment-start) (setq comment-start "; ") (make-local-variable 'comment-end) (setq comment-end "") (make-local-variable 'comment-column) (setq comment-column 32) (make-local-variable 'comment-start-skip) (setq comment-start-skip ";+[ \t]*") ; (make-local-variable 'comment-indent-hook) ; (setq comment-indent-hook 'c-comment-indent) (auto-fill-mode 1) (run-hooks 'asm-mode-hook)) (defun asm-colon () "Insert a colon, and delete the indentation iff it follows a label." (interactive) (save-excursion (beginning-of-line) (if (looking-at "[ \t]+\\(\\sw\\|\\s_\\)+$") (delete-horizontal-space))) (insert ":")) (defun asm-comment () "Introduce a comment or convert an already existing comment into a comment of a `bigger' kind. These are the known comment classes: 1-- to the right of the code (at the comment-column) 2-- comment on a own line, indented like code 3-- at the left-most column. Suggested usage: while writing your code, trigger asm-comment repeatedly until you are satisfied with the kind of comment." (interactive) ;; on a blank line, do nothing nothing special (if (eq (current-column) (current-indentation)) (insert comment-start) ;; There is already something on the line. ;; If we NOT already have a comment, indent for a new one. (beginning-of-line) (if (not (looking-at (concat ".*" (regexp-quote comment-start)))) (indent-for-comment) ;; There is a comment, convert it to a `bigger' class. (end-of-line) (search-backward comment-start) (delete-horizontal-space) (if (= (current-column) (current-indentation)) () ;; was code level, --> col-1-comment ;; was right to code (newline-and-indent)) (end-of-line)))) -- Martin Neitzel, Techn. Univ. Braunschweig, W.Germany BITNET/EARN: neitzel@dbsinf6.bitnet (mail via bitnet preferred) UUCP: neitzel@infbs.uucp (unido!infbs!neitzel)