Mercurial > emacs
view lib-src/emacstool.c @ 18212:3864648e9b4f
(bibtex-mode-map): Changed the binding of the C-TAB
key, such that XEmacs will understand it, too.
(bibtex-format-entry, bibtex-end-of-entry): Give specific
error message if not on valid BibTeX entry.
(bibtex-field-string-quoted): Small bug fix. Allow
backslash followed by newline.
(bibtex-reposition-window, bibtex-mark-entry): Two new
functions, bound to M-C-l and M-C-h, respectively.
(bibtex-reformat-previous-options, bibtex-reformat-previous-labels):
New internal variables used by bibtex-reformat.
(bibtex-clean-entry-hook): New hook to be called after
entry has been cleaned.
(bibtex-clean-entry): Run the hook bibtex-clean-entry-hook.
(bibtex-entry-field-alist): Small bug fix.
(bibtex-autokey-title-terminators): Made -- a terminator instead
of ---.
(bibtex-font-lock-keywords): Don't treat ALT prefixed entries as
comments.
(bibtex-entry): Fixed parameter list. This function is not
intended to be called with required and optional fields as
optional arguments anymore.
(bibtex-generate-autokey): Now split into various
small functions.
(bibtex-autokey-names-stretch, bibtex-autokey-additional-names):
New variables used by bibtex-generate-autokey.
(bibtex-autokey-get-namefield, bibtex-autokey-get-names)
(bibtex-autokey-demangle-name, bibtex-autokey-get-namelist)
(bibtex-autokey-get-yearfield, bibtex-autokey-get-titlestring)
(bibtex-autokey-get-titles, bibtex-autokey-get-titlelist):
New helper functions for bibtex-generate-autokey.
(bibtex-submit-bug-report): Report all variables.
(bibtex-contline-indentation): New user option.
(bibtex-entry-offset): Renamed from bibtex-entry-indentation.
(bibtex-entry-field-alist): Used different order for
some fields (as documented in btxdoc.tex). Changed one of the
comment strings.
(bibtex-mode-hook, bibtex-add-entry-hook): Add var doc.
(bibtex-autokey-before-presentation-hook): New variable to be
called before autokey presentation.
(bibtex-generate-autokey):
Call bibtex-autokey-before-presentation-hook. Doc fix.
(bibtex-reference-key): Reincluded parentheses.
Parentheses should be disallowed only in field constants.
(bibtex-autokey-transcriptions): Fixed bug (two
entries for `\o' while `\oe' entry was missing).
(bibtex-entry-indentation): New variable to determine
the indentation of all entries.
(bibtex-move-outside-of-entry): Use `skip-chars-forward' instead
of `re-search-forward'.
(bibtex-beginning-of-first-entry, bibtex-beginning-of-last-entry):
Renamed from beginning-of-first-bibtex-entry and
beginning-of-last-bibtex-entry. Go to beginning of line, return point.
(bibtex-do-auto-fill, bibtex-make-field, bibtex-entry)
(bibtex-String, bibtex-Preamble): Respect `bibtex-entry-indentation'.
(bibtex-beginning-of-entry, bibtex-end-of-entry): Make it work
with indented entries.
(bibtex-count-entries, bibtex-sort-buffer, bibtex-validate,
bibtex-kill-entry, bibtex-reformat): Use return value from
bibtex-beginning-of-first-entry.
(bibtex-clean-entry): Use `bibtex-reference-maybe-empty-head'
instead of a fixed string.
(bibtex-beginning-of-entry, bibtex-end-of-entry): Now
return point if called from a program.
(bibtex-enclosing-field, bibtex-format-entry,
bibtex-generate-autokey, bibtex-parse-keys, bibtex-mode,
bibtex-ispell-entry, bibtex-narrow-to-entry, bibtex-sort-buffer,
bibtex-find-entry-location, bibtex-validate, bibtex-clean-entry,
bibtex-fill-entry): Use new return values of these functions.
(bibtex-ispell-abstract): Bug fix (inherently by the change to
bibtex-end-of-entry).
(bibtex-field-history): New variable for history
buffer of field name reading.
(bibtex-make-field): Use completion. Object to completion are all
standard fields defined for the current entry. Bound to `C-c C-f'.
(bibtex-mode): Set `comment-start' and `comment-start-skip' to
"@Comment ", `comment-column' to 0.
(bibtex-autokey-transcriptions): New variable.
(bibtex-autokey-name-change-strings)
(bibtex-autokey-titleword-change-strings):
Use bibtex-autokey-transcriptions as default value.
(bibtex-find-entry-location): Handle empty buffer.
(bibtex-entry-delimiters): New variable to determine
if entries shall be delimited by braces or parentheses.
(bibtex-entry-left-delimiter, bibtex-entry-right-delimiter): New
helper functions.
(bibtex-entry, bibtex-String, bibtex-Preamble): Respect
`bibtex-entry-delimiters'.
(bibtex-entry-format): Doc fix.
(bibtex-reference-key, bibtex-field-const): Removed parentheses
from allowed characters.
(bibtex-end-of-entry): Better handling of incorrect preambles.
(bibtex-validate): Small change to avoid reparsing of
errors, if you enter `compile-goto-error' in compilation buffer.
(bibtex-progress-message): New function to show
progress of some long-lasting functions in BibTeX mode by
indicating percentage of done work.
(bibtex-progress-lastperc, bibtex-progress-lastmes)
(bibtex-progress-interval):
New internal variables for `bibtex-progress-message'.
(bibtex-parse-keys, bibtex-reformat, bibtex-validate): Use new
function `bibtex-progress-message'.
(current-line): New helper function to calculate current
linenumber. Something like this should really be defined somewhere
else in Emacs.
(bibtex-validate): Changed to show all errors in buffer in a
`compilation mode' buffer. If there are syntax errors, it aborts
after the syntax check, since higher-level check functions rely on
the syntactical correctness of buffer. If called from another lisp
function (as `bibtex-convert-alien') the return value shows
whether validating has been successful. Fixed bug which made
checking for absent required fields work incorrectly.
(bibtex-parse-keys-timeout): Set to a value reasonable higher
(twice as high) than `lazy-lock-stealth-time'.
(bibtex-member-of-regexp, assoc-of-regexp): Small cosmetic changes.
(bibtex-buffer-last-parsed-tick): Renamed from
bibtex-buffer-last-parsed-for-keys-tick and made it really
buffer-local (bug fix).
(bibtex-parse-keys): Make it use bibtex-buffer-last-parsed-tick.
(bibtex-parse-buffers-stealthily): New function which parses all
BibTeX buffers if emacs has been idle an efficient amount of time.
(bibtex-parse-idle-timer): New variable which stores whether idle
timer for parsing already is installed.
(bibtex-parse-keys): Make it callable verbosely. Returns now nil
if it has been aborted.
(bibtex-mode): Run the new function bibtex-parse-buffers-stealthily.
(bibtex-generate-autokey): Changed the name part
generation (bugfix). This function handles now correctly all three
forms of BibTeX names, "First von Last", "von Last, First", "von
Last, Jr, First". In every case the "Last" part is correctly
extracted. If the "Last" part consists of more than one token only
the first is used. Name fields spread over more than one line are
no problem anymore.
(bibtex-entry-format): Changed default value to
exclude 'page-dashes. Modified documentation.
(bibtex-autokey-name-change-strings)
(bibtex-autokey-titleword-abbrevs)
(bibtex-autokey-titleword-change-strings, bibtex-entry)
(bibtex-validate): Doc fixes.
(bibtex-mode-map): Bound `C-c $' to bibtex-ispell-abstract.
(bibtex-generate-autokey): Changed documentation. Small
modification in calculating title field.
(bibtex-mode): Included bibtex-ispell-entry into the list of
`interesting' functions.
(bibtex-kill-field): Bug fix (killing of first field in entry
yielded error).
(bibtex-string-file-path): New variable which defines
the path to search for bibtex-string-files. It defaults to
contents of environment variable BIBINPUTS.
(bibtex-mode): Use this variable.
(bibtex-next-field, bibtex-find-text): Will now work
with string entries as well.
(bibtex-mode-map): bibtex-complete-key wasn't bound
correctly.
(bibtex-complete): Fixed bug (used string entries defined in
buffer as object to completion).
(Menu): Use easymenu. More menu items for
`BibTeX-Edit' menu. Use nested menus.
(bibtex-field-kill-ring-max)
(bibtex-entry-kill-ring-max): Two new variables substituting
bibtex-kill-ring-max.
(bibtex-field-kill-ring, bibtex-entry-kill-ring): Two new
variables substituting bibtex-kill-ring.
(bibtex-field-kill-ring-yank-pointer)
(bibtex-entry-kill-ring-yank-pointer): Two new variables
substituting bibtex-kill-ring-yank-pointer.
(bibtex-last-kill-command): New variable keeping the type of the
last kill command.
(bibtex-insert-current-kill): Clean distinction between the two
BibTeX kill rings.
(bibtex-kill-field): Use new variable bibtex-field-kill-ring.
(bibtex-kill-entry): Use new variable bibtex-entry-kill-ring.
(bibtex-kill-ring, bibtex-kill-ring-yank-pointer): New
internal variables like kill-ring and kill-ring-yank-pointer, but
bibtex-kill-ring holds fields or complete reference entries
instead of raw strings.
(bibtex-kill-ring-max): New user option similar to kill-ring-max.
(bibtex-kill-field): Renamed from bibtex-delete-field again. It
now supports the new variable bibtex-kill-ring.
(bibtex-copy-field-as-kill, bibtex-kill-entry)
(bibtex-copy-entry-as-kill, bibtex-yank, bibtex-yank-pop): New
interactive functions, which work on the bibtex-kill-ring
variable.
(bibtex-insert-current-kill): New helper function to insert
contents of bibtex-kill-ring in an appropriate way.
(bibtex-make-field): New optional argument to tell the function if
it was called by bibtex-yank. It operates slightly different then.
(bibtex-find-text): New optional argument to tell the function if
it was called by bibtex-make-field. It moves in this case to the
end of the key if it was called on the reference head line. If it
is called interactively on the head line, it works in an
appropriate manner, too.
(bibtex-enclosing-field): New optional argument to tell
bibtex-enclosing-field not to print an error message if enclosing
field isn't found, but to return nil in this case (t is returned
otherwise). This is used by bibtex-find-text such that no error
message is given if bibtex-find-text is called interactively in
the key line of an entry.
(bibtex-autokey-year-use-crossref-entry): New variable
to determine if crossreferenced entry should be used for autokey
generation, if year field of current entry is absent.
(bibtex-generate-autokey): Use this new variable.
(bibtex-include-OPTannote): Deleted (is set in
bibtex-user-optional-fields).
(bibtex-entry, bibtex-print-help-message): Removed support for
bibtex-include-OPTannote.
(bibtex-entry-format): New constant
`inherit-booktitle' allowed.
(bibtex-mode): Set value for
font-lock-mark-block-function.
(bibtex-font-lock-keywords): Changed to distinguish
optional from ordinary fields.
(bibtex-format-entry, bibtex-print-help-message)
(bibtex-remove-OPT-or-ALT, bibtex-pop): Used simpler regexps.
(bibtex-delete-field): Changed from
bibtex-delete-optional-or-alternative-field. Deletes now mandatory
fields as well.
(bibtex-mode): Changed documentation.
(bibtex-entry-type-history, bibtex-key-history): New
variables to use own histories in BibTeX buffers.
(bibtex-entry, bibtex-clean-entry, bibtex-String): Use these new
variables.
(bibtex-entry, bibtex-make-field): A function can now
be used to generate a fields init string.
(bibtex-include-OPTkey, bibtex-include-OPTannote)
(bibtex-entry-field-alist): Changed documentation accordingly.
(bibtex-mode): bibtex-parse-keys on start of mode is
now abortable, too.
(bibtex-entry, bibtex-complete-key, bibtex-String): If bibtex-keys
isn't set correctly due to abortion of bibtex-parse-keys, this
function is called now non-abortable.
(bibtex-entry-field-alist): Small change in comments.
(bibtex-find-entry-location): Bug fix: Insertion into
completely empty buffer didn't work.
(bibtex-user-optional-fields): Renamed from
bibtex-mode-user-optional-fields.
(bibtex-submit-bug-report, bibtex-entry, bibtex-print-help-message):
Use bibtex-user-optional-fields.
(bibtex-remove-delimiters): Bug fix: Only remove
delimiting braces and not those inside fields.
(skip-to-valid-bibtex-entry, bibtex-parse-keys)
(bibtex-end-of-entry, bibtex-validate, bibtex-reformat): Calculate
complex regexps outside of loops.
(bibtex-mode): Changed documentation on how to convert third party
buffers.
(bibtex-convert-alien): New function to convert a
buffer not created by BibTeX mode to a format, whichs enables all
features of BibTeX mode.
(bibtex-mode): Small bug fix for call to bibtex-parse-keys.
(bibtex-mode): Bug fix for using bibtex-parse-keys.
(bibtex-mode): Used other policy to initiate the first
call of bibtex-parse-keys. This avoids unnecessary double call if
Font Lock mode is chosen for buffer at startup.
(bibtex-String, bibtex-Preamble): Renamed from
bibtex-string and bibtex-preamble.
(bibtex-String): If bibtex-maintain-sorted-entries and
bibtex-sort-ignore-string-entries are both non-nil, read string
key from minibuffer (with completion) and insert entry at correct
location (as for normal entries).
(bibtex-autokey-titleword-first-ignore)
(bibtex-autokey-titleword-abbrevs): Changed documentation: case of
regexps doesn't matter anymore.
(bibtex-field-const, bibtex-reference-key): Simplified to not
contain uppercase letters.
(member-of-regexp, assoc-of-regexp): Ignore case of regexp.
(map-bibtex-entries): Call function not for every syntactical correct
entry, but only for entries with known type.
(map-bibtex-entries, skip-to-valid-bibtex-entry)
(bibtex-flash-head, bibtex-enclosing-field)
(bibtex-enclosing-reference-maybe-empty-head, bibtex-format-entry)
(bibtex-autokey-change, bibtex-generate-autokey, bibtex-parse-keys)
(bibtex-ispell-abstract, bibtex-sort-buffer)
(bibtex-find-entry-location, bibtex-validate, bibtex-remove-delimiters)
(bibtex-delete-optional-or-alternative-field, bibtex-pop)
(bibtex-clean-entry, bibtex-print-help-message): Make them work
regardless of user's value of case-fold-search.
(bibtex-generate-autokey): Use bibtex-cfield for generating the
year field regexp.
(bibtex-parse-keys): Only gather keys of known (and not of
syntactical correct) entries.
(bibtex-end-of-entry): Only report an "unknown entry" message if
called interactively.
(bibtex-sort-ignore-string-entries): Renamed back from
bibtex-sort-ignore-string-and-preamble. Of course, preambles are
always ignored, since they have no key at all.
(bibtex-string): Slightly less complex regexp.
(skip-to-valid-bibtex-entry): New helper function to skip forward
(or backward) to beginning of next syntactical correct known
BibTeX entry, if not already there. Respects
bibtex-sort-ignore-string-entries.
(map-bibtex-entries): Bug fix: It wasn't called for string entries
even if bibtex-sort-ignore-string-entries was nil.
(beginning-of-last-bibtex-entry): New helper function to go to
last entry in buffer.
(bibtex-end-of-entry): Bug fix: Now works with string and preamble
entries as well.
(bibtex-sort-buffer): Renamed from bibtex-sort-entries. Simplified
by using new function skip-to-valid-bibtex-entry. Now only known
entries are checked.
(bibtex-find-entry-location): Simplified by using new functions
skip-to-valid-bibtex-entry and beginning-of-last-bibtex-entry.
Only known entries are used to determine location.
(bibtex-validate): Now checks string entries, too.
(bibtex-move-outside-of-entry): Don't use forward-paragraph, but
bibtex-end-of-entry.
(bibtex-end-of-entry): Don't use forward-sexp anymore,
since this fails on entries with non-escaped souble-quotes. Use
search-bibtex-reference instead (though it is slower, it is more
reliable).
(bibtex-ispell-abstract): Use normal regexps created by
bibtex-cfield instead of special ones.
(beginning-of-first-bibtex-entry): No warning on
empty buffer.
(bibtex-validate): Bug fix. Syntactical check didn't
work, since due to a bug all entries were simply skipped.
(bibtex-mode): Doc fix.
(bibtex-delete-optional-or-alternative-field): Renamed from
bibtex-kill-optional-or-alternative-field.
(bibtex-delete-optional-or-alternative-field, bibtex-empty-field):
Use delete-region, not kill-region.
(bibtex-clean-entry): New second argument called-by-reformat
indicates if bibtex-clean-entry was called by reformat. Don't try
to find correct buffer position for newly generated key and don't
call bibtex-parse-keys in this case.
(map-bibtex-entries): Bugfix (missed first entry in
buffer, died on entries with `@' in other than first column).
(beginning-of-first-bibtex-entry, bibtex-format-entry)
(bibtex-beginning-of-entry, bibtex-validate, bibtex-clean-entry):
Changed to allow BibTeX entries to start in a column different
from 1 (but still for speed reasons only whitespace is allowed
prior to the `@' on the same line.
(map-bibtex-entries): Call it for known BibTeX entries
only. This allows entries as @Comment{...} which follow no
specific structure without breaking the validation functions.
(bibtex-validate): Check syntactical structure for known entries
only.
(bibtex-autokey-abbrev): Sped up and changed to allow
a length of zero.
(bibtex-entry-format): Remove option `month-strings'.
(bibtex-validate): If given a prefix argument, check for
questionable month fields.
(bibtex-generate-autokey): Use normal regexps created
by bibtex-cfield instead of special ones.
(bibtex-hide-entry-bodies): Sped up by using subst-char-in-region
instead of using replace-regexp or replace-match.
(bibtex-find-entry-location): A bug had been introduced by using
search-bibtex-reference instead of re-search-forward (fixed).
(bibtex-field-delimiters): Renamed from
bibtex-field-delimiter.
(bibtex-entry-format): Constant empty-opts renamed to
empty-opts-or-alts.
(bibtex-remove-delimiters): Renamed from
bibtex-remove-double-quotes-or-braces.
(bibtex-reformat): New function.
(bibtex-fill-entry): New function to refill entry.
(bibtex-mode-map): Defined key for bibtex-fill-entry.
(bibtex-field-delimiter): Substitutes variables
bibtex-field-left-delimiter and bibtex-field-right-delimiter.
(bibtex-field-left-delimiter, bibtex-field-right-delimiter): New
helper functions.
(bibtex-make-field, bibtex-pop): Use new variable
bibtex-field-delimiter.
(bibtex-empty-field, bibtex-string): Use new functions
bibtex-field-left-delimiter and bibtex-field-right-delimiter.
(bibtex-predefined-month-strings): New variable.
(bibtex-predefined-strings): Use bibtex-predefined-month-strings.
(bibtex-submit-bug-report): Use new variables
bibtex-field-delimiter and bibtex-predefined-month-strings.
(bibtex-entry-format): Substitutes variable
bibtex-clean-entry-zap-empty-opts-or-alts. Various types of
formatting options are available (see variable documentation).
(bibtex-format-entry): New function doing the formatting of entries.
Taken from bibtex-clean-entry and enhanced to support new variable
bibtex-entry-format.
(delete-whitespace): New helper function used by bibtex-format-entry.
(bibtex-clean-entry): Call new function bibtex-format-entry.
(bibtex-submit-bug-report): Use bibtex-entry-format instead of
bibtex-clean-entry-zap-empty-opts-or-alts.
(bibtex-do-auto-fill): New function to perform auto-filling in
BibTeX mode. In fact, this is the old function
bibtex-auto-fill-function.
(bibtex-mode): Don't set fill-prefix anymore, but use new function
bibtex-do-auto-fill.
(bibtex-find-entry-location): Fixed bug (when
bibtex-maintain-sorted-entries was non-nil, an entry with a key
greater than all other keys wasn't inserted in the correct place).
(bibtex-mode): Don't use bibtex-auto-fill-function
anymore, but use directly variable fill-prefix.
(bibtex-find-entry-location): Fixed bug (on duplicate
keys, point must move to beginning of entry, so that bibtex-entry
works correctly).
(bibtex-complete): Fixed bug (parameter string-list
was mistakenly altered by the function itself).
(bibtex-mode-map): Bind bibtex-complete-key to C-TAB.
(bibtex-validate): Renamed from bibtex-validate-buffer
since it can acts on region if active. Use search-bibtex-reference.
(search-bibtex-reference): New function to be used in places where
prior a re-search-{forward|backward} for bibtex-reference or
something alike was used. This function is necessary due to the
new limit of failure stack size in 19.32 and above.
(bibtex-enclosing-reference-maybe-empty-head)
(bibtex-sort-entries, bibtex-find-entry-location, bibtex-validate):
Use new function search-bibtex-reference.
(bibtex-pop, bibtex-clean-entry): Small change due to change in
bibtex-enclosing-reference-maybe-empty-head.
(bibtex-reference-infix, bibtex-reference-postfix): New constants
necessary due to splitting bibtex-reference.
(bibtex-reference): Deleted.
(bibtex-type-in-reference, skip-whitespace-and-comments): Deleted.
(bibtex-mode): Don't turn auto-fill-mode on. Use new
variable normal-auto-fill-function.
(bibtex-field-string): Simplified.
(bibtex-mode-syntax-table): Changed syntax of
double-quote back to quote syntax.
(bibtex-complete): New generic function for interface
functions bibtex-complete-string and bibtex-complete-key.
(bibtex-complete-key): New function.
(bibtex-sort-ignore-string-and-preamble): Renamed from
bibtex-sort-ignore-string-entries.
(map-bibtex-entries): Use bibtex-sort-ignore-string-and-preamble
and ignore preamble entries as well.
(bibtex-mode, bibtex-submit-bug-report, bibtex-sort-entries):
Use bibtex-sort-ignore-string-and-preamble.
(bibtex-count-entries): New function to count entries in buffer or
region.
(bibtex-comma-after-last-field): New variable to
decide if comma should be inserted at end of last field.
(bibtex-entry): Support new variable bibtex-comma-after-last-field.
(bibtex-field-indentation, bibtex-text-indentation):
Two new user options (replacing the former constants
bibtex-field-alignment and bibtex-text-alignment).
(bibtex-align-at-equal-sign): New user option.
(bibtex-auto-fill-function, bibtex-make-field)
(bibtex-remove-OPT-or-ALT, bibtex-clean-entry): Support new variables.
(bibtex-validate-buffer): Now only checks region if
mark is active. With optional argument checks if required fields
are missing, too.
(bibtex-mode): Added support for imenu.
(bibtex-entry-field-alist)
(bibtex-mode-user-optional-fields): Modified syntax to allow
preinitialization of fields.
(bibtex-make-field, bibtex-make-optional-field):
Support preinitialization of fields.
(bibtex-autokey-prefix-string)
(bibtex-autokey-preserve-case): New variables to support
bibtex-generate-autokey.
(bibtex-generate-autokey): Use new variables.
(bibtex-field-const, bibtex-reference-type)
(bibtex-reference-key): Changed to match the (according to Oren
Patashnik) allowed characters.
(bibtex-clean-entry-zap-empty-opts-or-alts): Renamed
from bibtex-clean-entry-zap-empty-opts.
(bibtex-entry-field-alist): Slightly modified syntax to support
alternative fields needed for Book and InBook references.
(bibtex-font-lock-keywords, bibtex-print-help-message)
(bibtex-make-field, bibtex-pop, bibtex-clean-entry):
Support ALT prefixed entries.
(bibtex-mode): Documented new ALT prefixed fields.
(bibtex-make-optional-field): Modified to give only field name as
arg to bibtex-make-field.
(bibtex-remove-OPT-or-ALT, bibtex-kill-optional-or-alternative-field):
Renamed from bibtex-remove-OPT and bibtex-kill-optional-field,
respectively. Modified to support ALT prefixes.
(bibtex-enclosing-field, bibtex-print-help-message):
Speed up things by not using bibtex-enclosing-regexp anymore.
(bibtex-enclosing-regexp): Function deleted.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Tue, 10 Jun 1997 17:58:43 +0000 |
parents | ee40177f6c68 |
children | 35906f73a07d |
line wrap: on
line source
/* Copyright (C) 1986, 1988, 1990, 1991 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs 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, or (at your option) any later version. GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* * For Emacs in SunView/Sun-Windows: (supported by Sun Unix v3.2 or greater) * Insert a notifier filter-function to convert all useful input * to "key" sequences that emacs can understand. See: Emacstool(1). * * Author: Jeff Peck, Sun Microsystems, Inc. <peck@eng.sun.com> * * Original Idea: Ian Batten * Updated 15-Mar-88, Jeff Peck: set IN_EMACSTOOL, TERM, TERMCAP * Updated 10-Sep-88, Jeff Peck: add XVIEW and JLE support * Updated 8-Oct-90, Jeff Peck: add Meta-bit for Xview * Updated 6-Mar-91, Jeff Peck: Hack to detect -Wt invocation * [note, TTYSW limitation means you must Click-To-Type in Openwin] * [fixed in OW3 or use local/tty.o] * for better results, this should move to using TERMSW. * Updated 10-Mar-91, Jeff Peck, et al: support for TERMSW (TTERM) * allows point-to-type even in OW2 * * [note: xvetool should be started with the "-nw" flag for emacs!] */ #ifdef XVIEW #include <xview/xview.h> #include <xview/panel.h> #include <xview/attr.h> #include <xview/tty.h> #include <xview/ttysw.h> /* private defines */ #include <xview/termsw.h> /* -DTTERM */ #include <xview/font.h> /* for testing */ #else #include <suntool/sunview.h> #include <suntool/tty.h> #include <suntool/ttysw.h> #endif XVIEW #ifdef JLE # include <locale.h> #endif JLE #include <stdio.h> #include <sys/file.h> #define BUFFER_SIZE 128 /* Size of all the buffers */ /* define WANT_CAPS_LOCK to make f-key T1 (aka F1) behave as CapsLock */ #define WANT_CAPS_LOCK #ifdef WANT_CAPS_LOCK int caps_lock; /* toggle indicator for f-key T1 caps lock */ static char *Caps = "[CAPS] "; /* Caps Lock prefix string */ #define CAPS_LEN 7 /* strlen (Caps) */ #endif static char *mouse_prefix = "\030\000"; /* C-x C-@ */ static int m_prefix_length = 2; /* mouse_prefix length */ static char *key_prefix = "\030*"; /* C-x * */ static int k_prefix_length = 2; /* key_prefix length */ #ifdef JLE static char *emacs_name = "nemacs"; /* default run command */ static char *title = "NEmacstool - "; /* initial title */ #else static char *emacs_name = "emacs"; /* default run command */ static char *title = "Emacstool - "; /* initial title */ #endif JLE static char buffer[BUFFER_SIZE]; /* send to ttysw_input */ static char *bold_name = 0; /* for -bold option */ Frame frame; /* Base frame for system */ #ifndef TTERM #define SWTYPE TTY Tty tty_win; /* Where emacs is reading */ #else #define SWTYPE TERMSW Termsw tty_win; /* Termsw does follow-mouse */ #endif TTERM #ifdef XVIEW Xv_Window tty_view; /* Where the events are in Xview*/ #else Tty tty_view; /* SunView place filler */ #endif XVIEW int font_width, font_height; /* For translating pixels to chars */ int left_margin = 0; /* default window -- frame offset */ int console_fd = 0; /* for debugging: setenv DEBUGEMACSTOOL */ FILE *console; /* for debugging: setenv DEBUGEMACSTOOL */ Icon frame_icon; /* make an icon_image for the default frame_icon */ static short default_image[258] = { #include <images/terminal.icon> }; mpr_static(icon_image, 64, 64, 1, default_image); /* * Assign a value to a set of keys */ int button_value (event) Event *event; { int retval = 0; /* * Code up the current situation: * * 1 = MS_LEFT; * 2 = MS_MIDDLE; * 4 = MS_RIGHT; * 8 = SHIFT; * 16 = CONTROL; * 32 = META; * 64 = DOUBLE; * 128 = UP; */ if (MS_LEFT == (event_id (event))) retval = 1; if (MS_MIDDLE == (event_id (event))) retval = 2; if (MS_RIGHT == (event_id (event))) retval = 4; if (event_shift_is_down (event)) retval += 8; if (event_ctrl_is_down (event)) retval += 16; if (event_meta_is_down (event)) retval += 32; if (event_is_up (event)) retval += 128; return retval; } /* * Variables to store the time of the previous mouse event that was * sent to emacs. * * The theory is that to time double clicks while ignoring UP buttons, * we must keep track of the accumulated time. * * If someone writes a SUN-SET-INPUT-MASK for emacstool, * That could be used to selectively disable UP events, * and then this cruft wouldn't be necessary. */ static long prev_event_sec = 0; static long prev_event_usec = 0; /* * Give the time difference in milliseconds, where one second * is considered infinite. */ int time_delta (now_sec, now_usec, prev_sec, prev_usec) long now_sec, now_usec, prev_sec, prev_usec; { long sec_delta = now_sec - prev_sec; long usec_delta = now_usec - prev_usec; if (usec_delta < 0) { /* "borrow" a second */ usec_delta += 1000000; --sec_delta; } if (sec_delta >= 10) return (9999); /* Infinity */ else return ((sec_delta * 1000) + (usec_delta / 1000)); } /* * Filter function to translate selected input events for emacs * Mouse button events become ^X^@(button x-col y-line time-delta) . * Function keys: ESC-*{c}{lrt} l,r,t for Left, Right, Top; * {c} encodes the keynumber as a character [a-o] */ static Notify_value input_event_filter_function (window, event, arg, type) #ifdef XVIEW Xv_Window window; #else Window window; #endif XVIEW Event *event; Notify_arg arg; Notify_event_type type; { struct timeval time_stamp; if (console_fd) fprintf(console, "Event: %d\n", event_id(event)); /* UP L1 is the STOP key */ if (event_id(event) == WIN_STOP) { ttysw_input(tty_win, "\007\007\007\007\007\007\007", 7); return NOTIFY_IGNORED; } /* UP L5 & L7 is Expose & Open, let them pass to sunview */ if (event_id(event) == KEY_LEFT(5) || event_id(event) == KEY_LEFT(7)) if(event_is_up (event)) return notify_next_event_func (window, event, arg, type); else return NOTIFY_IGNORED; if (event_is_button (event)) { /* do Mouse Button events */ /* Commented out so that we send mouse up events too. if (event_is_up (event)) return notify_next_event_func (window, event, arg, type); */ time_stamp = event_time (event); ttysw_input (tty_win, mouse_prefix, m_prefix_length); sprintf (buffer, "(%d %d %d %d)\015", button_value (event), (event_x (event) - left_margin) / font_width, event_y (event) / font_height, time_delta (time_stamp.tv_sec, time_stamp.tv_usec, prev_event_sec, prev_event_usec) ); ttysw_input (tty_win, buffer, strlen(buffer)); prev_event_sec = time_stamp.tv_sec; prev_event_usec = time_stamp.tv_usec; return NOTIFY_IGNORED; } { /* Do the function key events */ int d; char c = (char) 0; if ((event_is_key_left (event)) ? ((d = event_id(event) - KEY_LEFT(1) + 'a'), c='l') : ((event_is_key_right (event)) ? ((d = event_id(event) - KEY_RIGHT(1) + 'a'), c='r') : ((event_is_key_top (event)) ? ((d = event_id(event) - KEY_TOP(1) + 'a'), c='t') : 0))) { if (event_is_up(event)) return NOTIFY_IGNORED; if (event_shift_is_down (event)) c = c - 32; /* this will give a non-{lrt} for unshifted keys */ if (event_ctrl_is_down (event)) c = c - 64; if (event_meta_is_down (event)) c = c + 128; #ifdef WANT_CAPS_LOCK /* set a toggle and relabel window so T1 can act like caps-lock */ if (event_id(event) == KEY_TOP(1)) { /* make a frame label with and without CAPS */ strcpy (buffer, Caps); title = &buffer[CAPS_LEN]; strncpy (title, (char *)window_get (frame, FRAME_LABEL), BUFFER_SIZE - CAPS_LEN); buffer[BUFFER_SIZE] = (char) 0; if (strncmp (title, Caps, CAPS_LEN) == 0) title += CAPS_LEN; /* already Caps */ caps_lock = (caps_lock ? 0 : CAPS_LEN); window_set(frame, FRAME_LABEL, (title -= caps_lock), 0); return NOTIFY_IGNORED; } #endif ttysw_input (tty_win, key_prefix, k_prefix_length); sprintf (buffer, "%c%c", d, c); ttysw_input(tty_win, buffer, strlen(buffer)); return NOTIFY_IGNORED; } } if ((event_is_ascii(event) || event_is_meta(event)) && event_is_up(event)) return NOTIFY_IGNORED; #ifdef WANT_CAPS_LOCK /* shift alpha chars to upper case if toggle is set */ if ((caps_lock) && event_is_ascii(event) && (event_id(event) >= 'a') && (event_id(event) <= 'z')) event_set_id(event, (event_id(event) - 32)); /* crufty, but it works for now. is there an UPCASE(event)? */ #endif #ifndef NO_META_BIT /* under Openwindows/X, the meta bit is not set in the key event, * emacs expects this so we add it in here: */ if (event_is_ascii(event) && event_meta_is_down(event)) event_set_id(event, 128 | event_id(event)); #endif return notify_next_event_func (window, event, arg, type); } main (argc, argv) int argc; char **argv; { int error_code; /* Error codes */ #ifdef JLE setlocale(LC_ALL, ""); #endif JLE if(getenv("DEBUGEMACSTOOL")) console = fdopen (console_fd = open("/dev/console",O_WRONLY), "w"); putenv("IN_EMACSTOOL=t"); /* notify subprocess that it is in emacstool */ if (putenv("TERM=sun") != 0) /* TTY_WIN will be a TERM=sun window */ {fprintf (stderr, "%s: Could not set TERM=sun, using `%s'\n", argv[0], (char *)getenv("TERM")) ;}; /* * If TERMCAP starts with a slash, it is the pathname of the * termcap file, not an entry extracted from it, so KEEP it! * Otherwise, it may not relate to the new TERM, so Nuke-It. * If there is no TERMCAP environment variable, don't make one. */ { char *termcap ; /* Current TERMCAP value */ termcap = (char *)getenv("TERMCAP") ; if (termcap && (*termcap != '/')) { if (putenv("TERMCAP=") != 0) {fprintf (stderr, "%s: Could not clear TERMCAP\n", argv[0]) ;} ; } ; } ; /* find command to run as subprocess in window */ if (!(argv[0] = (char *)getenv("EMACSTOOL"))) /* Set emacs command name */ argv[0] = emacs_name; /* Emacstool recognizes two special args: -rc <file> and -bold <bold-name> */ for (argc = 1; argv[argc]; argc++) /* Use last one on line */ { if(!(strcmp ("-rc", argv[argc]))) /* Override if -rc given */ {int i = argc; argv[argc--]=0; /* kill the -rc argument */ if (argv[i+1]) { /* move to argv[0] and squeeze the rest */ argv[0]=argv[i+1]; for (; argv[i+2]; (argv[i]=argv[i+2],argv[++i]=0)); } } if (!(strcmp ("-bold", argv[argc]))) {int i = argc; argv[argc--]=0; /* kill the -bold argument */ if (argv[i+1]) { /* move to bold_name and squeeze the rest */ bold_name = argv[i+1]; for (; argv[i+2]; (argv[i]=argv[i+2],argv[++i]=0)); } } }; strcpy (buffer, title); strncat (buffer, argv[0], /* append run command name */ (BUFFER_SIZE - (strlen (buffer)) - (strlen (argv[0]))) - 1); error_code = interpose_on_window(argc,argv); if (error_code != 0) { /* Barf */ fprintf (stderr, "notify_interpose_event_func returns %d.\n", error_code); exit (1); } #ifdef XVIEW xv_main_loop (frame); /* And away we go */ #else window_main_loop (frame); #endif XVIEW } #ifdef XVIEW int interpose_on_window(argc,argv) int argc; char **argv; { #ifndef TTERM int i, font_width_adjust = 1; /* hackery, and heuristics */ /* if -Wt is not supplied, then font comes out as lucida-14 (width=8) * rather than the screen.r.12 (width=7) typically used * this hack attempts to workaround it. * could use a env var EMACSTOOL_DEFAULT_FONT_WIDTH instead */ for (i = 1; argv[i]; i++) { if (!(strcmp ("-Wt", argv[i]))) {font_width_adjust = 0; if (console_fd) fprintf(console, "-Wt = %d\n", font_width_adjust); break;} } #endif TTERM /* initialize Xview, and strip window args */ xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, 0); /* do this first, so arglist can override it */ frame_icon = icon_create (ICON_LABEL, "Emacstool", ICON_IMAGE, &icon_image, 0); /* Build a frame to run in */ frame = xv_create ((Xv_Window)NULL, FRAME, FRAME_LABEL, buffer, FRAME_ICON, frame_icon, 0); /* Create a tty with emacs in it */ tty_win = xv_create (frame, SWTYPE, WIN_IS_CLIENT_PANE, TTY_QUIT_ON_CHILD_DEATH, TRUE, TTY_BOLDSTYLE, TTYSW_BOLD_INVERT, TTY_ARGV, argv, 0); if (bold_name) { (void)xv_set(tty_win, TTY_BOLDSTYLE_NAME, bold_name, 0); } { Xv_font font; /* declare temp font variable */ font = (Xv_font)xv_get (tty_win, XV_FONT); font_height = (int)xv_get (font, FONT_DEFAULT_CHAR_HEIGHT); font_width = (int)xv_get (font, FONT_DEFAULT_CHAR_WIDTH); } if (console_fd) fprintf(console, "Width = %d\n", font_width); #ifndef TTERM font_width -= font_width_adjust; /* A guess! font bug in ttysw*/ #else /* make the termsw act as a tty */ xv_set(tty_win, TERMSW_MODE, TTYSW_MODE_TYPE, 0); /* termsw has variable offset depending on scrollbar size/location */ left_margin = (int)xv_get (tty_win, TEXTSW_LEFT_MARGIN); #endif TTERM tty_view = (Xv_Window) xv_get (tty_win, OPENWIN_NTH_VIEW, 0); xv_set(tty_view, WIN_CONSUME_EVENTS, WIN_MOUSE_BUTTONS, WIN_UP_EVENTS, ACTION_ADJUST, ACTION_MENU, WIN_ASCII_EVENTS, WIN_LEFT_KEYS, WIN_TOP_KEYS, WIN_RIGHT_KEYS, 0, 0); /* Interpose my event function */ return (int) notify_interpose_event_func (tty_view, input_event_filter_function, NOTIFY_SAFE); } #else int interpose_on_window (argc, argv) int argc; char **argv; { /* do this first, so arglist can override it */ frame_icon = icon_create (ICON_LABEL, "Emacstool", ICON_IMAGE, &icon_image, 0); /* Build a frame to run in */ frame = window_create ((Window)NULL, FRAME, FRAME_LABEL, buffer, FRAME_ICON, frame_icon, FRAME_ARGC_PTR_ARGV, &argc, argv, 0); /* Create a tty with emacs in it */ tty_win = window_create (frame, TTY, TTY_QUIT_ON_CHILD_DEATH, TRUE, TTY_BOLDSTYLE, TTYSW_BOLD_INVERT, TTY_ARGV, argv, 0); if (bold_name) { (void)window_set(tty_win, TTY_BOLDSTYLE_NAME, bold_name, 0); } /* ttysw uses pf_default, one must set WIN_FONT explicitly */ window_set (tty_win, WIN_FONT, pf_default(), 0); font_height = (int)window_get (tty_win, WIN_ROW_HEIGHT); font_width = (int)window_get (tty_win, WIN_COLUMN_WIDTH); tty_view = tty_win; window_set(tty_view, WIN_CONSUME_PICK_EVENTS, WIN_STOP, WIN_MOUSE_BUTTONS, WIN_UP_EVENTS, /* LOC_WINENTER, LOC_WINEXIT, LOC_MOVE, */ 0, WIN_CONSUME_KBD_EVENTS, WIN_STOP, WIN_ASCII_EVENTS, WIN_LEFT_KEYS, WIN_TOP_KEYS, WIN_RIGHT_KEYS, /* WIN_UP_ASCII_EVENTS, */ 0, 0); /* Interpose my event function */ return (int) notify_interpose_event_func (tty_view, input_event_filter_function, NOTIFY_SAFE); } #endif XVIEW