v05i031: Interactive speller and other MicroEMACS macros
David MacKenzie
edf at ROCKY2.ROCKEFELLER.EDU
Wed Nov 2 12:23:49 AEST 1988
Posting-number: Volume 5, Issue 31
Submitted-by: "David MacKenzie" <edf at ROCKY2.ROCKEFELLER.EDU>
Archive-name: ue3.9-macros
In light of the recent spate of spelling checkers, here is one that
runs under MicroEMACS. Also, this summer there were discussions about
automatically uncompressing files from GNU EMACS; this posting also
contains macros to do that, as well as some other useful extensions.
The speller depends on the Unix spell program; the other macros
probably need Unix too. They have been tested under MicroEMACS3.9e.
In the ^X! macro, note the line that prints "[End]" and wait for a
keypress; MicroEMACS 3.9e apparently has a bug in that under some OS's,
including Unix, shell-command always waits for a keystroke after
running, while in others, such as MS-DOS, it only does so if it's not
being run from a macro. Comment that line out if you haven't fixed
that bug for Unix (it just involves adding an "if (clexec == FALSE)
{...}" around the four lines of code in spawn.c that wait for the
keypress).
I have the contents of enhance.cmd in my .emacsrc; I load spell.cmd when
I need it with M-x execute-file.
David MacKenzie
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: enhance.cmd spell.cmd
# Wrapped by dave at edfdc on Fri Sep 9 00:57:35 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'enhance.cmd' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'enhance.cmd'\"
else
echo shar: Extracting \"'enhance.cmd'\" \(4045 characters\)
sed "s/^X//" >'enhance.cmd' <<'END_OF_FILE'
X; enhance.cmd
X;
X; MicroEMACS 3.9 macros
X;
X; I. New bindings
X; A. ESC-ESC -> execute command line
X; B. ESC-^X -> execute current buffer
X; C. ESC-TAB -> toggle OVERstrike mode
X; D. ESC-# -> filter region through a program
X; II. Enhancements to existing bindings
X; B. ^X! allows response of "!" to repeat previous command
X; C. ^X^F, ^X^V, ^X^R, ^X^I, ^X^W, ^X^N expand ~/file properly
X; D. ^X^F, ^X^V, ^X^R, ^X^I check if the file exists only in
X; compressed form (ending with ".Z"), and if so, uncompress it
X;
X; David MacKenzie
X; Latest revision: 09/08/88
X
X
X; Set up ESC-ESC to execute a macro language command from keyboard.
Xbind-to-key execute-command-line M-^[
X
X; Set up ESC-Ctrl-X to execute the current buffer.
X1 store-macro
X execute-buffer $cbufname
X!endm
Xbind-to-key execute-macro-1 M-^x
X
X; Set up M-TAB to toggle insert/overstrike.
X2 store-macro
X set $cmode &bxor $cmode 32
X!endm
Xbind-to-key execute-macro-2 M-^I
X
X; Add !! (repeat previous command) capability to shell-command.
X; Activated by a response of "!<Return>".
Xset %prev-cmd "!"
X3 store-macro
X set %shell-cmd @"!"
X !if &sequal %shell-cmd "ERROR" ; Ctrl-G hit.
X !return
X !endif
X !if &sequal %shell-cmd "!"
X !if &sequal %prev-cmd "!"
X write-message "[No previous command]"
X !return
X !endif
X ; Echo the command we're repeating for reference, a la csh.
X write-message &cat "!" &cat %prev-cmd "~r~n"; CRLF
X set %shell-cmd %prev-cmd
X !else
X set %prev-cmd %shell-cmd
X !endif
X shell-command %shell-cmd
X write-message "[End]"
X set %rckey >key
X!endm
Xbind-to-key execute-macro-3 ^X!
X
X; If %fname starts with "~/", substitute the value of HOME from environ.
Xstore-procedure tildesub
X ; ~ is MicroEMACS's escape character so we need to escape it.
X !if &sequal &left %fname 2 "~~/"
X set %fname &cat &env "HOME" &right %fname &sub &length %fname 1
X !endif
X!endm
X
X; If %fname exists only as a compressed file, uncompress it first.
Xstore-procedure zcheck
X !if &and ¬ &exi %fname &exi &cat %fname ".Z"
X shell-command &cat "uncompress -v " %fname
X !endif
X!endm
X
X; Add tilde substitution on file finding, viewing, etc.
X4 store-macro
X set %fname @"Find file: "
X !if &sequal %fname "ERROR" ; Ctrl-G hit.
X !return
X !endif
X run tildesub
X run zcheck
X find-file %fname
X!endm
Xbind-to-key execute-macro-4 ^X^F
X
X5 store-macro
X set %fname @"View file: "
X !if &sequal %fname "ERROR"
X !return
X !endif
X run tildesub
X run zcheck
X view-file %fname
X!endm
Xbind-to-key execute-macro-5 ^X^V
X
X6 store-macro
X set %fname @"Read file: "
X !if &sequal %fname "ERROR"
X !return
X !endif
X run tildesub
X run zcheck
X read-file %fname
X!endm
Xbind-to-key execute-macro-6 ^X^R
X
X7 store-macro
X set %fname @"Insert file: "
X !if &sequal %fname "ERROR"
X !return
X !endif
X run tildesub
X run zcheck
X insert-file %fname
X!endm
Xbind-to-key execute-macro-7 ^X^I
X
X8 store-macro
X set %fname @"Write file: "
X !if &sequal %fname "ERROR"
X !return
X !endif
X run tildesub
X write-file %fname
X!endm
Xbind-to-key execute-macro-8 ^X^W
X
X9 store-macro
X set %fname @"Name: "
X !if &sequal %fname "ERROR"
X !return
X !endif
X run tildesub
X change-file-name %fname
X!endm
Xbind-to-key execute-macro-9 ^XN
X
X; Filter the region through an external command.
X10 store-macro
X set %filt-cmd @"#"
X !if &or %sequal %filt-cmd "ERROR" &sequal %filt-cmd ""
X !return
X !endif
X write-message "[Filtering region]"
X kill-region
X 2 split-current-window
X select-buffer "[temp]"
X yank
X end-of-file
X delete-previous-character ; Remove unwanted extra newline.
X unmark-buffer
X
X filter-buffer %filt-cmd
X
X beginning-of-file
X set-mark
X end-of-file
X kill-region
X unmark-buffer
X delete-window
X yank
X delete-buffer "[temp]"
X write-message "[Region filtered]"
X!endm
Xbind-to-key execute-macro-10 M-#
END_OF_FILE
if test 4045 -ne `wc -c <'enhance.cmd'`; then
echo shar: \"'enhance.cmd'\" unpacked with wrong size!
fi
# end of 'enhance.cmd'
fi
if test -f 'spell.cmd' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'spell.cmd'\"
else
echo shar: Extracting \"'spell.cmd'\" \(3560 characters\)
sed "s/^X//" >'spell.cmd' <<'END_OF_FILE'
X; spell.cmd
X;
X; semi-interactive MicroEMACS 3.9 spelling checker
X; Based on the Unix spell command.
X; Activate with M-x run spell-buffer
X;
X; David MacKenzie
X; Latest revision: 08/18/88
X
X
X; These enclose misspelled words. Change them if you don't like them.
Xset %lmark "<<"
Xset %rmark ">>"
X
Xstore-procedure spell-buffer
X
X set %savecbuf $cbufname
X !if &sequal $cfname "" ; No filename!
X set $cfname $cbufname ; Make one.
X !endif
X set %file $cfname
X save-file ; Make sure it's up to date.
X update-screen
X
X set %lfile @"Local word list filename (<Return> = none)? "
X !if &or &sequal %lfile "q" &sequal %lfile "ERROR" ; Ctrl-G
X write-message "[Spelling correction aborted]"
X !return
X !endif
X !if ¬ &sequal %lfile ""
X set %lfile &cat &cat "+" %lfile " "
X !endif
X
X write-message "[Identifying possible misspellings...]"
X ; run the command with output to the buffer, "command"
X pipe-command &cat &cat "spell " %lfile %file
X
X ; "command" is now the selected buffer
X delete-window
X select-buffer %savecbuf
X
X !while "TRUE"
X set %word #command
X !if &sequal %word "ERROR"
X !break ; No more mis-spelled words.
X !endif
X
X update-screen
X write-message &cat "Fix `" &cat %word "' ([y]/n)? "
X set %yn >key
X !if &or &sequal %yn "q" &equal &ascii %yn 7 ; Ctrl-G
X write-message "[Spelling correction aborted]"
X !return
X !endif
X !if &or &sequal %yn "y" &sequal %yn " "
X beginning-of-file
X !while "TRUE"
X write-message &cat &cat "[Searching for `" %word "'...]"
X !force search-forward %word
X !if &sequal $status "FALSE"
X !break ; No more matches of this word found.
X !endif
X run mark-word
X update-screen ; Let them see the marked word.
X set %new-word @&cat &cat "Replace `" %word "' with (<Return> to keep)? "
X
X !if &or &sequal %new-word "q" &sequal %new-word "ERROR"
X run unmark-word
X write-message "[Spelling correction aborted]"
X !return
X !endif
X !if &sequal %new-word "n" ; Go on to the next wrong word.
X run unmark-word
X !break
X !endif
X !if &sequal %new-word "p" ; Repeat previous correction.
X set %new-word %old-new
X !endif
X !if &sequal %new-word ""
X run unmark-word
X !else
X run replace-word
X !endif
X set %old-new %new-word
X update-screen
X !endwhile
X !endif
X !endwhile
X write-message "[Spelling correction completed]"
X!endm
X
X; Mark a word with %lmark and %rmark.
X; Assumes point is at the end of the word when called;
X; leaves point after %rmark.
Xstore-procedure mark-word
X insert-string %rmark
X set-mark
X previous-word
X insert-string %lmark
X!endm
X
X; Remove the mark.
X; Assumes point is where mark-word left it, after %lmark.
X; Leaves point after the word.
Xstore-procedure unmark-word
X &len %lmark delete-previous-character ; Nuke %lmark.
X exchange-point-and-mark ; Move past %rmark.
X &len %rmark delete-previous-character ; Nuke %rmark
X!endm
X
X; Replace the marked word with %new-word.
X; Called instead of unmark-word.
X; Leaves point after the word.
Xstore-procedure replace-word
X &len %lmark delete-previous-character ; Nuke %lmark.
X kill-region ; Nuke word and %rmark.
X insert-string %new-word
X!endm
END_OF_FILE
if test 3560 -ne `wc -c <'spell.cmd'`; then
echo shar: \"'spell.cmd'\" unpacked with wrong size!
fi
# end of 'spell.cmd'
fi
echo shar: End of shell archive.
exit 0
More information about the Comp.sources.misc
mailing list