Merge with much improved version from gdb4.11

This commit is contained in:
Andrey A. Chernov 1994-05-09 20:36:08 +00:00
parent 9b39195f89
commit ce4acff5b6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=1472
22 changed files with 3112 additions and 1152 deletions

View File

@ -1,46 +1,40 @@
GNU GENERAL PUBLIC LICENSE
Version 1, February 1989
Version 2, June 1991
Copyright (C) 1989 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
The Free Software Foundation has exempted Bash from the requirement of
Paragraph 2c of the General Public License. This is to say, there is
no requirement for Bash to print a notice when it is started
interactively in the usual way. We made this exception because users
and standards expect shells not to print such messages. This
exception applies to any program that serves as a shell and that is
based primarily on Bash as opposed to other GNU software.
Preamble
The license agreements of most software companies try to keep users
at the mercy of those companies. By contrast, our General Public
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. The
General Public License applies to the Free Software Foundation's
software and to any other program whose authors commit to using it.
You can use it for your programs, too.
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Specifically, the General Public License is designed to make
sure that you have the freedom to give away or sell copies of free
software, that you receive source code or can get it if you want it,
that you can change the software or use pieces of it in new free
programs; and that you know you can do these things.
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of a such a program, whether
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must tell them their rights.
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
@ -53,122 +47,209 @@ want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any program or other work which
contains a notice placed by the copyright holder saying it may be
distributed under the terms of this General Public License. The
"Program", below, refers to any such program or work, and a "work based
on the Program" means either the Program or any work containing the
Program or a portion of it, either verbatim or with modifications. Each
licensee is addressed as "you".
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
1. You may copy and distribute verbatim copies of the Program's source
code as you receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice and
disclaimer of warranty; keep intact all the notices that refer to this
General Public License and to the absence of any warranty; and give any
other recipients of the Program a copy of this General Public License
along with the Program. You may charge a fee for the physical act of
transferring a copy.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
2. You may modify your copy or copies of the Program or any portion of
it, and copy and distribute such modifications under the terms of Paragraph
1 above, provided that you also do the following:
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
a) cause the modified files to carry prominent notices stating that
you changed the files and the date of any change; and
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
b) cause the whole of any work that you distribute or publish, that
in whole or in part contains the Program or any part thereof, either
with or without modifications, to be licensed at no charge to all
third parties under the terms of this General Public License (except
that you may choose to grant warranty protection to some or all
third parties, at your option).
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
c) If the modified program normally reads commands interactively when
run, you must cause it, when started running for such interactive use
in the simplest and most usual way, to print or display an
announcement including an appropriate copyright notice and a notice
that there is no warranty (or else, saying that you provide a
warranty) and that users may redistribute the program under these
conditions, and telling the user how to view a copy of this General
Public License.
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
d) You may charge a fee for the physical act of transferring a
copy, and you may at your option offer warranty protection in
exchange for a fee.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
Mere aggregation of another independent work with the Program (or its
derivative) on a volume of a storage or distribution medium does not bring
the other work under the scope of these terms.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
3. You may copy and distribute the Program (or a portion or derivative of
it, under Paragraph 2) in object code or executable form under the terms of
Paragraphs 1 and 2 above provided that you also do one of the following:
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
a) accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of
Paragraphs 1 and 2 above; or,
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
b) accompany it with a written offer, valid for at least three
years, to give any third party free (except for a nominal charge
for the cost of distribution) a complete machine-readable copy of the
corresponding source code, to be distributed under the terms of
Paragraphs 1 and 2 above; or,
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
c) accompany it with the information you received as to where the
corresponding source code may be obtained. (This alternative is
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form alone.)
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
Source code for a work means the preferred form of the work for making
modifications to it. For an executable file, complete source code means
all the source code for all modules it contains; but, as a special
exception, it need not include source code for modules which are standard
libraries that accompany the operating system on which the executable
file runs, or for standard header files or definitions files that
accompany that operating system.
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
4. You may not copy, modify, sublicense, distribute or transfer the
Program except as expressly provided under this General Public License.
Any attempt otherwise to copy, modify, sublicense, distribute or transfer
the Program is void, and will automatically terminate your rights to use
the Program under this License. However, parties who have received
copies, or rights to use copies, from you under this General Public
License will not have their licenses terminated so long as such parties
remain in full compliance.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. By copying, distributing or modifying the Program (or any work based
on the Program) you indicate your acceptance of this license to do so,
and all its terms and conditions.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the original
licensor to copy, distribute or modify the Program subject to these
terms and conditions. You may not impose any further restrictions on the
recipients' exercise of the rights granted herein.
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
7. The Free Software Foundation may publish revised and/or new versions
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of the license which applies to it and "any
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
the license, you may choose any version ever published by the Free Software
this License, you may choose any version ever published by the Free Software
Foundation.
8. If you wish to incorporate parts of the Program into other free
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
@ -176,7 +257,7 @@ of promoting the sharing and reuse of software generally.
NO WARRANTY
9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
@ -186,7 +267,7 @@ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
@ -201,22 +282,21 @@ POSSIBILITY OF SUCH DAMAGES.
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
Copyright (C) 19yy <name of author>
This program 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 1, or (at your option)
any later version.
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
@ -232,26 +312,28 @@ Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19xx name of author
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the
appropriate parts of the General Public License. Of course, the
commands you use may be called something other than `show w' and `show
c'; they could even be mouse-clicks or menu items--whatever suits your
program.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here a sample; alter the names:
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
program `Gnomovision' (a program to direct compilers to make passes
at assemblers) written by James Hacker.
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
That's all there is to it!
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View File

@ -1,3 +1,384 @@
Fri Oct 22 07:55:08 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* configure.in: Add * to end of all OS names.
Tue Oct 5 12:33:51 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* readline.c: Add stuff for HIUX to place where we detect termio
vs. sgtty (ugh, but I don't see a simple better way).
Wed Sep 29 11:02:58 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* readline.c (parser_if): Free tname when done with it (change
imported from from bash 1.12 readline).
Tue Sep 7 17:15:37 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* configure.in (m88k-*-sysvr4*): Comment out previous change.
Fri Jul 2 11:05:34 1993 Ian Lance Taylor (ian@cygnus.com)
* configure.in (*-*-riscos*): New entry; use mh-sysv.
Wed Jun 23 13:00:12 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* configure.in: Add comment.
Mon Jun 14 14:28:55 1993 Jim Kingdon (kingdon@eric)
* configure.in (m88k-*-sysvr4*): Use sysdep-norm.h.
Sun Jun 13 13:04:09 1993 Jim Kingdon (kingdon@cygnus.com)
* Makefile.in ({real,dist}clean): Remove sysdep.h.
Thu Jun 10 11:22:41 1993 Jim Kingdon (kingdon@cygnus.com)
* Makefile.in: Add mostlyclean, distclean, and realclean targets.
Fri May 21 17:09:28 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* config/mh-isc: New file.
* configure.in: Use it.
Sat Apr 17 00:40:12 1993 Jim Kingdon (kingdon at calvin)
* readline.c, history.c: Don't include sys/types.h; sysdep.h does.
* config/mh-sysv: Define TIOCGWINSZ_BROKEN.
readline.c: Check it.
Wed Mar 24 02:06:15 1993 david d `zoo' zuhn (zoo at poseidon.cygnus.com)
* Makefile.in: add installcheck & dvi targets
Fri Mar 12 18:36:53 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com)
* configure.in: recognize *-*-solaris2* instead of *-*-solaris* (a
number of people want to call SunOS 4.1.2 "solaris1.0"
and get it right)
Tue Mar 2 21:25:36 1993 Fred Fish (fnf@cygnus.com)
* sysdep-sysv4.h: New file for SVR4.
* configure.in (*-*-sysv4*): Use sysdep-sysv4.h.
* configure.in (*-*-ultrix2): Add triplet from Michael Rendell
(michael@mercury.cs.mun.ca)
Tue Dec 15 12:38:16 1992 Ian Lance Taylor (ian@cygnus.com)
* configure.in (i[34]86-*-sco3.2v4*): use mh-sco4.
* config/mh-sco4: New file, like mh-sco but without defining
_POSIX_SOURCE.
Wed Nov 11 21:20:14 1992 John Gilmore (gnu@cygnus.com)
* configure.in: Reformat to one-case-per-line.
Handle SunOS 3.5, as per Karl Berry, <karl@claude.cs.umb.edu>.
Wed Nov 4 15:32:31 1992 Stu Grossman (grossman at cygnus.com)
* sysdep-norm.h: Remove some crud, install dire warning.
Thu Oct 22 01:08:13 1992 Stu Grossman (grossman at cygnus.com)
* configure.in: Make SCO work again...
Mon Oct 12 15:04:07 1992 Ian Lance Taylor (ian@cygnus.com)
* readline.c (init_terminal_io): if tgetent returns 0, the
terminal type is unknown.
Thu Oct 1 23:44:14 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com)
* configure.in: use cpu-vendor-os triple instead of nested cases
Wed Sep 30 12:58:57 1992 Stu Grossman (grossman at cygnus.com)
* readline.c (rl_complete_internal): Cast alloca to (char *) to
avoid warning.
Fri Sep 25 12:45:05 1992 Stu Grossman (grossman at cygnus.com)
* readline.c (clear_to_eol, rl_generic_bind): Make static.
(rl_digit_loop): Add arg to call to rl_message().
* vi_mode.c (rl_vi_first_print): Add arg to call to
rl_back_to_indent().
Wed Aug 19 14:59:07 1992 Ian Lance Taylor (ian@cygnus.com)
* Makefile.in: always create installation directories, use full
file name for install target.
Wed Aug 12 15:50:57 1992 John Gilmore (gnu@cygnus.com)
* readline.c (last_readline_init_file): Fix typo made by Steve
Chamberlain/DJ Delorie. Proper control file name is ~/.inputrc,
not ~/inputrc.
Thu Jun 25 16:15:27 1992 Stu Grossman (grossman at cygnus.com)
* configure.in: Make bsd based systems use sysdep-obsd.h.
Tue Jun 23 23:22:53 1992 Per Bothner (bothner@cygnus.com)
* config/mh-posix: New file, for Posix-compliant systems.
* configure.in: Use mh-posix for Linux (free Unix clone).
Tue Jun 23 21:59:20 1992 Fred Fish (fnf@cygnus.com)
* sysdep-norm.h (alloca): Protect against previous definition as
a macro with arguments.
Fri Jun 19 15:48:54 1992 Stu Grossman (grossman at cygnus.com)
* sysdep-obsd.h: #include <sys/types.h> to make this more Kosher.
Fri Jun 19 12:53:28 1992 John Gilmore (gnu at cygnus.com)
* config/mh-apollo68v, mh-sco, mh-sysv, mh-sysv4}: RANLIB=true.
Mon Jun 15 13:50:34 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com)
* configure.in: use mh-sysv4 on solaris2
Mon Jun 15 12:28:24 1992 Fred Fish (fnf@cygnus.com)
* config/mh-ncr3000 (INSTALL): Don't use /usr/ucb/install,
it is broken on ncr 3000's.
* config/mh-ncr3000 (RANLIB): Use RANLIB=true.
Mon Jun 15 01:35:55 1992 John Gilmore (gnu at cygnus.com)
* readline.c: Make new SIGNALS_* macros to parameterize the
ugly changes in signal blocking. Use them throughout,
reducing #ifdef HAVE_POSIX_SIGNALS and HAVE_BSD_SIGNALS clutter
significantly. Make all such places use POSIX if available,
to avoid losing with poor `sigsetmask' emulation from libiberty.
Sun Jun 14 15:19:51 1992 Stu Grossman (grossman at cygnus.com)
* readline.c (insert_some_chars): Return void.
Thu Jun 11 01:27:45 1992 John Gilmore (gnu at cygnus.com)
* readline.c: #undef PC, which Solaris2 defines in sys/types.h,
clobbering the termcap global variable PC.
Tue Jun 9 17:30:23 1992 Fred Fish (fnf@cygnus.com)
* config/{mh-ncr3000, mh-sysv4}: Change INSTALL to use
/usr/ucb/install.
Mon Jun 8 23:10:07 1992 Fred Fish (fnf@cygnus.com)
* readline.h (rl_completer_quote_characters): Add declaration.
* readline.c (rl_completer_quote_characters): Add global var.
* readline.c (strpbrk): Add prototype and function.
* readline.c (rl_complete_internal): Add code to handle
expansion of quoted strings.
Mon May 11 12:39:30 1992 John Gilmore (gnu at cygnus.com)
* readline.c: Can't initialize FILE *'s with stdin and stdout,
because they might not be constant. Patch from Tom Quinn,
trq@dinoysos.thphys.ox.ac.uk.
Tue Apr 28 21:52:34 1992 John Gilmore (gnu at cygnus.com)
* readline.h: Declare rl_event_hook (which already existed).
Suggested by Christoph Tietz <tietz@zi.gmd.dbp.de>.
Wed Apr 22 18:08:01 1992 K. Richard Pixley (rich@rtl.cygnus.com)
* configure.in: remove subdirs declaration. The obsolete semantic
for subdirs has been usurped by per's new meaning.
Tue Apr 21 11:54:23 1992 K. Richard Pixley (rich@cygnus.com)
* Makefile.in: rework CFLAGS so that they can be set on the
command line to make. Remove MINUS_G. Default CFLAGS to -g.
Fri Apr 10 23:02:27 1992 Fred Fish (fnf@cygnus.com)
* configure.in: Recognize new ncr3000 config.
* config/mh-ncr3000: New NCR 3000 config file.
Wed Mar 25 10:46:30 1992 John Gilmore (gnu at cygnus.com)
* history.c (stifle_history): Negative arg treated as zero.
Tue Mar 24 23:46:20 1992 K. Richard Pixley (rich@cygnus.com)
* config/mh-sysv: INSTALL_PROG -> INSTALL.
Mon Feb 10 01:41:35 1992 Brian Fox (bfox at gnuwest.fsf.org)
* history.c (history_do_write) Build a buffer of all of the lines
to write and write them in one fell swoop (lower overhead than
calling write () for each line). Suggested by Peter Ho.
* vi_mode.c (rl_vi_subst) Don't forget to end the undo group.
Sat Mar 7 00:15:36 1992 K. Richard Pixley (rich@rtl.cygnus.com)
* Makefile.in: remove FIXME's on info and install-info targets.
Fri Mar 6 22:02:04 1992 K. Richard Pixley (rich@cygnus.com)
* Makefile.in: added check target.
Wed Feb 26 18:04:40 1992 K. Richard Pixley (rich@cygnus.com)
* Makefile.in, configure.in: removed traces of namesubdir,
-subdirs, $(subdir), $(unsubdir), some rcs triggers. Forced
copyrights to '92, changed some from Cygnus to FSF.
Fri Feb 21 14:37:32 1992 Steve Chamberlain (sac at rtl.cygnus.com)
* readline.c, examples/fileman.c: patches from DJ to support DOS
Thu Feb 20 23:23:16 1992 Stu Grossman (grossman at cygnus.com)
* readline.c (rl_read_init_file): Make sure that null filename is
not passed to open() or else we end up opening the directory, and
read a bunch of garbage into keymap[].
Mon Feb 17 17:15:09 1992 Fred Fish (fnf at cygnus.com)
* readline.c (readline_default_bindings): Only make use of VLNEXT
when both VLNEXT and TERMIOS_TTY_DRIVER is defined. On SVR4
<termio.h> includes <termios.h>, so VLNEXT is always defined.
* sysdep-norm.h (_POSIX_VERSION): Define this for all SVR4
systems so that <termios.h> gets used, instead of <termio.h>.
Fri Dec 20 12:04:31 1991 Fred Fish (fnf at cygnus.com)
* configure.in: Change svr4 references to sysv4.
Tue Dec 10 04:07:20 1991 K. Richard Pixley (rich at rtl.cygnus.com)
* Makefile.in: infodir belongs in datadir.
Fri Dec 6 23:23:14 1991 K. Richard Pixley (rich at rtl.cygnus.com)
* Makefile.in: remove spaces following hyphens, bsd make can't
cope. added clean-info. added standards.text support. Don't
know how to make info anymore.
* configure.in: commontargets is no longer a recognized hook, so
remove it. new subdir called doc.
Thu Dec 5 22:46:10 1991 K. Richard Pixley (rich at rtl.cygnus.com)
* Makefile.in: idestdir and ddestdir go away. Added copyrights
and shift gpl to v2. Added ChangeLog if it didn't exist. docdir
and mandir now keyed off datadir by default.
Fri Nov 22 09:02:32 1991 John Gilmore (gnu at cygnus.com)
* sysdep-obsd.h: Rename from sysdep-newsos.h.
* configure.in: Use sysdep-obsd for Mach as well as NEWs.
* sysdep-norm.h, sysdep-aix.h: Add <sys/types.h>, which POSIX
requires to make <dirent.h> work. Improve Sun alloca decl.
Thu Nov 21 18:48:08 1991 John Gilmore (gnu at cygnus.com)
* Makefile.in: Clean up ../glob/tilde.c -> tilde.o path.
Clean up makefile a bit in general.
Thu Nov 21 14:40:29 1991 Stu Grossman (grossman at cygnus.com)
* configure.in, config/mh-svr4: Make SVR4 work.
* readline.c: Move config stuff to sysdep.h, use typedef dirent
consistently, remove refs to d_namlen (& D_NAMLEN) to improve
portability. Also, update copyright notice.
readline.h: remove config stuff that I added erroneously in the
first place.
* emacs_keymap.c, funmap.c, history.c, keymaps.c, vi_keymap.c,
vi_mode.c: move config stuff to sysdep.h, update copyright notices.
Tue Nov 19 15:02:13 1991 Stu Grossman (grossman at cygnus.com)
* history.c: #include "sysdep.h".
Tue Nov 19 10:49:17 1991 Fred Fish (fnf at cygnus.com)
* Makefile.in, config/hm-sysv, config/hm-sco: Change SYSV to
USG to match current usage.
* readline.c: Add USGr4 to list of defined things to check for
to use <dirent.h> style directory access.
* config/hm-svr4: New file for System V Release 4 (USGr4).
Mon Nov 18 23:59:52 1991 Stu Grossman (grossman at cygnus.com)
* readline.c (filename_completion_function): use struct dirent
instead of struct direct.
Fri Nov 1 07:02:13 1991 Brian Fox (bfox at gnuwest.fsf.org)
* readline.c (rl_translate_keyseq) Make C-? translate to RUBOUT
unconditionally.
Mon Oct 28 11:34:52 1991 Brian Fox (bfox at gnuwest.fsf.org)
* readline.c; Use Posix directory routines and macros.
* funmap.c; Add entry for call-last-kbd-macro.
* readline.c (rl_prep_term); Use system EOF character on POSIX
systems also.
Thu Oct 3 16:19:53 1991 Brian Fox (bfox at gnuwest.fsf.org)
* readline.c; Make a distinction between having a TERMIOS tty
driver, and having POSIX signal handling. You might one without
the other. New defines used HAVE_POSIX_SIGNALS, and
TERMIOS_TTY_DRIVER.
Tue Jul 30 22:37:26 1991 Brian Fox (bfox at gnuwest.fsf.org)
* readline.c: rl_getc () If a call to read () returns without an
error, but with zero characters, the file is empty, so return EOF.
Thu Jul 11 20:58:38 1991 Brian Fox (bfox at gnuwest.fsf.org)
* readline.c: (rl_get_next_history, rl_get_previous_history)
Reallocate the buffer space if the line being moved to is longer
the the current space allocated. Amazing that no one has found
this bug until now.
Sun Jul 7 02:37:05 1991 Brian Fox (bfox at gnuwest.fsf.org)
* readline.c:(rl_parse_and_bind) Allow leading whitespace.
Make sure TERMIO and TERMIOS systems treat CR and NL
disctinctly.
Tue Jun 25 04:09:27 1991 Brian Fox (bfox at gnuwest.fsf.org)
* readline.c: Rework parsing conditionals to pay attention to the
prior states of the conditional stack. This makes $if statements
work correctly.
Mon Jun 24 20:45:59 1991 Brian Fox (bfox at gnuwest.fsf.org)
* readline.c: support for displaying key binding information
includes the functions rl_list_funmap_names (),
invoking_keyseqs_in_map (), rl_invoking_keyseqs (),
rl_dump_functions (), and rl_function_dumper ().
funmap.c: support for same includes rl_funmap_names ().
readline.c, funmap.c: no longer define STATIC_MALLOC. However,
update both version of xrealloc () to handle a null pointer.
Thu Apr 25 12:03:49 1991 Brian Fox (bfox at gnuwest.fsf.org)
* vi_mode.c (rl_vi_fword, fWord, etc. All functions use

View File

@ -1,9 +1,11 @@
# $Id: Makefile,v 1.1.1.1 1994/05/09 15:59:08 ache Exp $
# $Id: Makefile,v 1.1 1993/12/28 07:54:51 ache Exp $
SHLIB_MAJOR=1
SHLIB_MINOR=0
CFLAGS+= -I${.CURDIR} -I${.CURDIR}/readline -DVOID_SIGHANDLER -Dstricmp=strcasecmp -Dstrnicmp=strncasecmp
CFLAGS+= -I${.CURDIR} -I${.CURDIR}/readline -DVOID_SIGHANDLER \
-DHAVE_UNISTD_H -DSTATIC_MALLOC \
-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp
LIB= readline
SRCS+= readline.c history.c funmap.c keymaps.c

View File

@ -11,4 +11,6 @@ Workaround for this implemented via TIOCGWINSZ/TIOCSWINSZ
with same winsize structure: it does nothing expect polling
process from background. Look tcsh_hack.readme for details.
Here is megred version with readline comes from gdb4.11
ache@astral.msk.su

View File

@ -0,0 +1,8 @@
Tue Feb 2 11:40:04 1993 Roland H. Pesch (pesch@fowanton.cygnus.com)
* Makefile.in: configurable (and useable) Makefile template
* Makefile: removed, replaced with configurable Makefile.in
* texindex.c texinfo.tex: remove, replacing w/refs to tools
elsewhere in distribution tree
* configure.in: pro forma configure stub
* ChangeLog: new file

View File

@ -3,7 +3,7 @@
@setfilename history.info
@settitle GNU Readline Library
@comment %**end of header (This is for running Texinfo on a region.)
@synindex fn vr
@synindex vr fn
@setchapternewpage odd
@ifinfo

View File

@ -0,0 +1,155 @@
@ignore
This file is completely identical to hsuser.texinfo, except that it has the
reference to the programming manual removed. There are definately better ways
to do this!
This file documents the user interface to the GNU History library.
Copyright (C) 1988, 1991 Free Software Foundation, Inc.
Authored by Brian Fox.
Permission is granted to make and distribute verbatim copies of this manual
provided the copyright notice and this permission notice are preserved on
all copies.
Permission is granted to process this file through Tex and print the
results, provided the printed document carries copying permission notice
identical to this one except for the removal of this paragraph (this
paragraph not being relevant to the printed manual).
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that the
GNU Copyright statement is available to the distributee, and provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions.
@end ignore
@node Using History Interactively
@appendix Using History Interactively
This chapter describes how to use the GNU History Library interactively,
from a user's standpoint.
@menu
* History Interaction:: What it feels like using History as a user.
@end menu
@node History Interaction
@section History Interaction
@cindex expansion
The History library provides a history expansion feature that is similar
to the history expansion in Csh. The following text describes the sytax
that you use to manipulate the history information.
History expansion takes place in two parts. The first is to determine
which line from the previous history should be used during substitution.
The second is to select portions of that line for inclusion into the
current one. The line selected from the previous history is called the
@dfn{event}, and the portions of that line that are acted upon are
called @dfn{words}. The line is broken into words in the same fashion
that the Bash shell does, so that several English (or Unix) words
surrounded by quotes are considered as one word.
@menu
* Event Designators:: How to specify which history line to use.
* Word Designators:: Specifying which words are of interest.
* Modifiers:: Modifying the results of susbstitution.
@end menu
@node Event Designators
@subsection Event Designators
@cindex event designators
An event designator is a reference to a command line entry in the
history list.
@table @asis
@item @code{!}
Start a history subsititution, except when followed by a space, tab, or
the end of the line... @key{=} or @key{(}.
@item @code{!!}
Refer to the previous command. This is a synonym for @code{!-1}.
@item @code{!n}
Refer to command line @var{n}.
@item @code{!-n}
Refer to the command line @var{n} lines back.
@item @code{!string}
Refer to the most recent command starting with @var{string}.
@item @code{!?string}[@code{?}]
Refer to the most recent command containing @var{string}.
@end table
@node Word Designators
@subsection Word Designators
A @key{:} separates the event specification from the word designator. It
can be omitted if the word designator begins with a @key{^}, @key{$},
@key{*} or @key{%}. Words are numbered from the beginning of the line,
with the first word being denoted by a 0 (zero).
@table @code
@item 0 (zero)
The zero'th word. For many applications, this is the command word.
@item n
The @var{n}'th word.
@item ^
The first argument. that is, word 1.
@item $
The last argument.
@item %
The word matched by the most recent @code{?string?} search.
@item x-y
A range of words; @code{-@var{y}} Abbreviates @code{0-@var{y}}.
@item *
All of the words, excepting the zero'th. This is a synonym for @code{1-$}.
It is not an error to use @key{*} if there is just one word in the event.
The empty string is returned in that case.
@end table
@node Modifiers
@subsection Modifiers
After the optional word designator, you can add a sequence of one or more
of the following modifiers, each preceded by a @key{:}.
@table @code
@item #
The entire command line typed so far. This means the current command,
not the previous command, so it really isn't a word designator, and doesn't
belong in this section.
@item h
Remove a trailing pathname component, leaving only the head.
@item r
Remove a trailing suffix of the form @samp{.}@var{suffix}, leaving the basename.
@item e
Remove all but the suffix.
@item t
Remove all leading pathname components, leaving the tail.
@item p
Print the new command but do not execute it.
@end table

View File

@ -3,12 +3,12 @@
@setfilename readline.info
@settitle GNU Readline Library
@comment %**end of header (This is for running Texinfo on a region.)
@synindex fn vr
@synindex vr fn
@setchapternewpage odd
@ifinfo
This document describes the GNU Readline Library, a utility for aiding
in the consitency of user interface across discrete programs that need
This document describes the GNU Readline Library, a utility which aids
in the consistency of user interface across discrete programs that need
to provide a command line interface.
Copyright (C) 1988, 1991 Free Software Foundation, Inc.
@ -44,7 +44,7 @@ by the Foundation.
@center April 1991
@page
This document describes the GNU Readline Library, a utility for aiding
This document describes the GNU Readline Library, a utility which aids
in the consistency of user interface across discrete programs that need
to provide a command line interface.
@ -74,7 +74,7 @@ Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
@node Top
@top GNU Readline Library
This document describes the GNU Readline Library, a utility for aiding
This document describes the GNU Readline Library, a utility which aids
in the consistency of user interface across discrete programs that need
to provide a command line interface.
@ -91,13 +91,13 @@ to provide a command line interface.
@include rltech.texinfo
@node Concept Index
@appendix Concept Index
@unnumbered Concept Index
@printindex cp
@node Function and Variable Index
@appendix Function and Variable Index
@printindex vr
@contents
@unnumbered Function and Variable Index
@printindex fn
@contents
@bye

View File

@ -1,6 +1,5 @@
@comment %**start of header (This is for running Texinfo on a region.)
@setfilename rltech.info
@synindex fn vr
@comment %**end of header (This is for running Texinfo on a region.)
@setchapternewpage odd
@ -132,7 +131,7 @@ with @code{rl_bind_key ()}.
@findex rl_bind_key ()
@example
@code{int rl_bind_key (int @var{key}, (int (*)())@var{function});}
@code{int rl_bind_key (int @var{key}, int (*@var{function})());}
@end example
@code{rl_bind_key ()} takes 2 arguments; @var{key} is the character that
@ -423,10 +422,10 @@ invert_case_line (count, key)
@section Custom Completers
Typically, a program that reads commands from the user has a way of
disambiguating between commands and data. If your program is one of
these, then it can provide completion for either commands, or data, or
both commands and data. The following sections describe how your
program and Readline cooperate to provide this service to end users.
disambiguating commands and data. If your program is one of these, then
it can provide completion for either commands, or data, or both commands
and data. The following sections describe how your program and Readline
cooperate to provide this service to end users.
@menu
* How Completing Works:: The logic used to do completion.
@ -455,7 +454,7 @@ There are three major functions used to perform completion:
The user-interface function @code{rl_complete ()}. This function is
called interactively with the same calling conventions as other
functions in readline intended for interactive use; i.e. @var{count},
and @code{invoking-key}. It isolates the word to be completed and calls
and @var{invoking-key}. It isolates the word to be completed and calls
@code{completion_matches ()} to generate a list of possible completions.
It then either lists the possible completions or actually performs the
completion, depending on which behaviour is desired.
@ -576,7 +575,7 @@ she wants to see them all. The default value is 100.
@defvar {char *rl_basic_word_break_characters}
The basic list of characters that signal a break between words for the
completer routine. The contents of this variable is what breaks words
in the Bash shell, i.e. " \t\n\"\\'`@@$><=".
in the Bash shell, i.e. " \t\n\"\\'`@@$><=;|&@{(".
@end defvar
@defvar {char *rl_completer_word_break_characters}
@ -603,12 +602,12 @@ within a completion entry generator function.
@defvar {Function *rl_ignore_some_completions_function}
This function, if defined, is called by the completer when real filename
completion is done, after all the matching names have been generated. It
is passed a @code{NULL} terminated array of pointers to @code{(char *)}
known as @var{matches} in the code. The 1st element (@code{matches[0]})
is the maximal substring that is common to all matches. This function
can re-arrange the list of matches as required, but each deleted
element of the array must be @code{free()}'d.
completion is done, after all the matching names have been generated.
It is passed a @code{NULL} terminated array of @code{(char *)} known as
@var{matches} in the code. The 1st element (@code{matches[0]}) is the
maximal substring that is common to all matches. This function can
re-arrange the list of matches as required, but each deleted element of
the array must be @code{free()}'d.
@end defvar
@node A Short Completion Example
@ -868,6 +867,9 @@ static char syscom[1024];
com_list (arg)
char *arg;
@{
if (!arg)
arg = "*";
sprintf (syscom, "ls -FClg %s", arg);
system (syscom);
@}

View File

@ -1,9 +1,3 @@
@comment %**start of header (This is for running Texinfo on a region.)
@setfilename rluser.info
@synindex fn vr
@comment %**end of header (This is for running Texinfo on a region.)
@setchapternewpage odd
@ignore
This file documents the end user interface to the GNU command line
editing feautres. It is to be an appendix to manuals for programs which
@ -35,7 +29,7 @@ into another language, under the above conditions for modified versions.
@end ignore
@node Command Line Editing
@chapter Command Line Editing
@appendix Command Line Editing
This text describes GNU's command line editing interface.
@ -48,7 +42,8 @@ This text describes GNU's command line editing interface.
@node Introduction and Notation
@section Introduction to Line Editing
In this tex a the following notation is used to describe keystrokes.
The following paragraphs describe the notation we use to represent
keystrokes.
The text @key{C-k} is read as `Control-K' and describes the character
produced when the Control key is depressed and the @key{k} key is struck.
@ -156,10 +151,6 @@ operate on characters while meta keystrokes operate on words.
@node Readline Killing Commands
@subsection Readline Killing Commands
The act of @dfn{cutting} text means to delete the text from the line, and
to save away the deleted text for later use, just as if you had cut the
text out of the line with a pair of scissors. There is a
@dfn{Killing} text means to delete the text from the line, but to save
it away for later use, usually by @dfn{yanking} it back into the line.
If the description for a command says that it `kills' text, then you can
@ -177,7 +168,8 @@ Kill from the cursor to the end of the current word, or if between
words, to the end of the next word.
@item M-DEL
Kill fromthe cursor the start ofthe previous word, or if between words, to the start of the previous word.
Kill from the cursor to the start of the previous word, or if between
words, to the start of the previous word.
@item C-w
Kill from the cursor to the previous whitespace. This is different than
@ -234,6 +226,9 @@ file is @file{~/.inputrc}.
When a program which uses the Readline library starts up, the
@file{~/.inputrc} file is read, and the keybindings are set.
In addition, the @key{C-x C-r} command re-reads this init file, thus
incorporating any changes that you might have made to it.
@menu
* Readline Init Syntax:: Syntax for the commands in @file{~/.inputrc}.
* Readline Vi Mode:: Switching to @code{vi} mode in Readline.
@ -242,38 +237,99 @@ When a program which uses the Readline library starts up, the
@node Readline Init Syntax
@subsection Readline Init Syntax
You can start up with a vi-like editing mode by placing
There are only four constructs allowed in the @file{~/.inputrc}
file:
@table @asis
@item Variable Settings
You can change the state of a few variables in Readline. You do this by
using the @code{set} command within the init file. Here is how you
would specify that you wish to use Vi line editing commands:
@example
@code{set editing-mode vi}
set editing-mode vi
@end example
in your @file{~/.inputrc} file.
Right now, there are only a few variables which can be set; so few in
fact, that we just iterate them here:
You can have Readline use a single line for display, scrolling the input
between the two edges of the screen by placing
@table @code
@example
@code{set horizontal-scroll-mode On}
@end example
@item editing-mode
@vindex editing-mode
The @code{editing-mode} variable controls which editing mode you are
using. By default, GNU Readline starts up in Emacs editing mode, where
the keystrokes are most similar to Emacs. This variable can either be
set to @code{emacs} or @code{vi}.
in your @file{~/.inputrc} file.
@item horizontal-scroll-mode
@vindex horizontal-scroll-mode
This variable can either be set to @code{On} or @code{Off}. Setting it
to @code{On} means that the text of the lines that you edit will scroll
horizontally on a single screen line when they are larger than the width
of the screen, instead of wrapping onto a new screen line. By default,
this variable is set to @code{Off}.
@item mark-modified-lines
@vindex mark-modified-lines
This variable when set to @code{On}, says to display an asterisk
(@samp{*}) at the starts of history lines which have been modified.
This variable is off by default.
@item prefer-visible-bell
@vindex prefer-visible-bell
If this variable is set to @code{On} it means to use a visible bell if
one is available, rather than simply ringing the terminal bell. By
default, the value is @code{Off}.
@end table
@item Key Bindings
The syntax for controlling keybindings in the @file{~/.inputrc} file is
simple. First you have to know the @i{name} of the command that you
want to change. The following pages contain tables of the command name, the
default keybinding, and a short description of what the command does.
want to change. The following pages contain tables of the command name,
the default keybinding, and a short description of what the command
does.
Once you know the name of the command, simply place the name of the key
you wish to bind the command to, a colon, and then the name of the
command on a line in the @file{~/.inputrc} file. Here is an example:
command on a line in the @file{~/.inputrc} file. The name of the key
can be expressed in different ways, depending on which is most
comfortable for you.
@table @asis
@item @w{@var{keyname}: @var{function-name} or @var{macro}}
@var{keyname} is the name of a key spelled out in English. For example:
@example
Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: ">&output"
@end example
In the above example, @key{C-u} is bound to the function
@code{universal-argument}, and @key{C-o} is bound to run the macro
expressed on the right hand side (that is, to insert the text
@samp{>&output} into the line).
@item @w{"@var{keyseq}": @var{function-name} or @var{macro}}
@var{keyseq} differs from @var{keyname} above in that strings denoting
an entire key sequence can be specified. Simply place the key sequence
in double quotes. GNU Emacs style key escapes can be used, as in the
following example:
@example
# This is a comment line.
Meta-Rubout: backward-kill-word
Control-u: universal-argument
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
"\e[11~": "Function Key 1"
@end example
In the above example, @key{C-u} is bound to the function
@code{universal-argument} (just as it was in the first example),
@key{C-x C-r} is bound to the function @code{re-read-init-file}, and
@key{ESC [ 1 1 ~} is bound to insert the text @samp{Function Key 1}.
@end table
@end table
@menu
* Commands For Moving:: Moving about the line.
* Commands For History:: Getting at previous lines.
@ -286,159 +342,159 @@ Control-u: universal-argument
@node Commands For Moving
@subsubsection Commands For Moving
@table @code
@item beginning-of-line (C-a)
@ftable @code
@item beginning-of-line (@key{C-a})
Move to the start of the current line.
@item end-of-line (C-e)
@item end-of-line (@key{C-e})
Move to the end of the line.
@item forward-char (C-f)
@item forward-char (@key{C-f})
Move forward a character.
@item backward-char (C-b)
@item backward-char (@key{C-b})
Move back a character.
@item forward-word (M-f)
@item forward-word (@key{M-f})
Move forward to the end of the next word.
@item backward-word (M-b)
@item backward-word (@key{M-b})
Move back to the start of this, or the previous, word.
@item clear-screen (C-l)
@item clear-screen (@key{C-l})
Clear the screen leaving the current line at the top of the screen.
@end table
@end ftable
@node Commands For History
@subsubsection Commands For Manipulating The History
@table @code
@ftable @code
@item accept-line (Newline, Return)
Accept the line regardless of where the cursor is. If this line is
non-empty, add it too the history list. If this line was a history
non-empty, add it to the history list. If this line was a history
line, then restore the history line to its original state.
@item previous-history (C-p)
@item previous-history (@key{C-p})
Move `up' through the history list.
@item next-history (C-n)
@item next-history (@key{C-n})
Move `down' through the history list.
@item beginning-of-history (M-<)
@item beginning-of-history (@key{M-<})
Move to the first line in the history.
@item end-of-history (M->)
@item end-of-history (@key{M->})
Move to the end of the input history, i.e., the line you are entering!
@item reverse-search-history (C-r)
@item reverse-search-history (@key{C-r})
Search backward starting at the current line and moving `up' through
the history as necessary. This is an incremental search.
@item forward-search-history (C-s)
@item forward-search-history (@key{C-s})
Search forward starting at the current line and moving `down' through
the the history as neccessary.
@end table
@end ftable
@node Commands For Text
@subsubsection Commands For Changing Text
@table @code
@item delete-char (C-d)
@ftable @code
@item delete-char (@key{C-d})
Delete the character under the cursor. If the cursor is at the
beginning of the line, and there are no characters in the line, and
the last character typed was not C-d, then return EOF.
the last character typed was not @key{C-d}, then return EOF.
@item backward-delete-char (Rubout)
Delete the character behind the cursor. A numeric arg says to kill
the characters instead of deleting them.
@item quoted-insert (C-q, C-v)
@item quoted-insert (@key{C-q}, @key{C-v})
Add the next character that you type to the line verbatim. This is
how to insert things like C-q for example.
how to insert things like @key{C-q} for example.
@item tab-insert (M-TAB)
@item tab-insert (@key{M-TAB})
Insert a tab character.
@item self-insert (a, b, A, 1, !, ...)
Insert yourself.
@item transpose-chars (C-t)
@item transpose-chars (@key{C-t})
Drag the character before point forward over the character at point.
Point moves forward as well. If point is at the end of the line, then
transpose the two characters before point. Negative args don't work.
@item transpose-words (M-t)
@item transpose-words (@key{M-t})
Drag the word behind the cursor past the word in front of the cursor
moving the cursor over that word as well.
@item upcase-word (M-u)
Uppercase the current (or following) word. With a negative argument,
do the previous word, but do not move point.
@item upcase-word (@key{M-u})
Uppercase all letters in the current (or following) word. With a
negative argument, do the previous word, but do not move point.
@item downcase-word (M-l)
Lowercase the current (or following) word. With a negative argument,
do the previous word, but do not move point.
@item downcase-word (@key{M-l})
Lowercase all letters in the current (or following) word. With a
negative argument, do the previous word, but do not move point.
@item capitalize-word (M-c)
Uppercase the current (or following) word. With a negative argument,
do the previous word, but do not move point.
@item capitalize-word (@key{M-c})
Uppercase the first letter in the current (or following) word. With a
negative argument, do the previous word, but do not move point.
@end table
@end ftable
@node Commands For Killing
@subsubsection Killing And Yanking
@table @code
@ftable @code
@item kill-line (C-k)
@item kill-line (@key{C-k})
Kill the text from the current cursor position to the end of the line.
@item backward-kill-line ()
Kill backward to the beginning of the line. This is normally unbound.
@item kill-word (M-d)
@item kill-word (@key{M-d})
Kill from the cursor to the end of the current word, or if between
words, to the end of the next word.
@item backward-kill-word (M-DEL)
@item backward-kill-word (@key{M-DEL})
Kill the word behind the cursor.
@item unix-line-discard (C-u)
Do what C-u used to do in Unix line input. We save the killed text on
@item unix-line-discard (@key{C-u})
Do what @key{C-u} used to do in Unix line input. We save the killed text on
the kill-ring, though.
@item unix-word-rubout (C-w)
Do what C-w used to do in Unix line input. The killed text is saved
@item unix-word-rubout (@key{C-w})
Do what @key{C-w} used to do in Unix line input. The killed text is saved
on the kill-ring. This is different than backward-kill-word because
the word boundaries differ.
@item yank (C-y)
@item yank (@key{C-y})
Yank the top of the kill ring into the buffer at point.
@item yank-pop (M-y)
@item yank-pop (@key{M-y})
Rotate the kill-ring, and yank the new top. You can only do this if
the prior command is yank or yank-pop.
@end table
@end ftable
@node Numeric Arguments
@subsubsection Specifying Numeric Arguments
@table @code
@ftable @code
@item digit-argument (M-0, M-1, ... M--)
@item digit-argument (@key{M-0}, @key{M-1}, ... @key{M--})
Add this digit to the argument already accumulating, or start a new
argument. M-- starts a negative argument.
argument. @key{M--} starts a negative argument.
@item universal-argument ()
Do what C-u does in emacs. By default, this is not bound.
@end table
Do what @key{C-u} does in emacs. By default, this is not bound.
@end ftable
@node Commands For Completion
@subsubsection Letting Readline Type For You
@table @code
@ftable @code
@item complete (TAB)
Attempt to do completion on the text before point. This is
implementation defined. Generally, if you are typing a filename
@ -449,41 +505,54 @@ you can do variable name completion...
@item possible-completions (M-?)
List the possible completions of the text before point.
@end table
@end ftable
@node Miscellaneous Commands
@subsubsection Some Miscellaneous Commands
@table @code
@ftable @code
@item abort (C-g)
Ding! Stops things.
@item re-read-init-file (@key{C-x} @key{C-r})
Read in the contents of your @file{~/.inputrc} file, and incorporate
any bindings found there.
@item do-uppercase-version (M-a, M-b, ...)
@item abort (@key{C-g})
Stop running the current editing command.
@ignore
@c I have no idea what this means, and can't figure it out by
@c experiment, and can't find it in the readline source.
@c pesch@cygnus.com, 20may1993.
@item do-uppercase-version (@key{M-a}, @key{M-b}, ...)
Run the command that is bound to your uppercase brother.
@end ignore
@item prefix-meta (ESC)
Make the next character that you type be metafied. This is for
people without a meta key. @key{ESC-f} is equivalent to @key{M-f}.
Make the next character that you type be metafied. This is for people
without a meta key. Typing @key{ESC f} is equivalent to typing
@key{M-f}.
@item undo (C-_)
@item undo (@key{C-_})
Incremental undo, separately remembered for each line.
@item revert-line (M-r)
@item revert-line (@key{M-r})
Undo all changes made to this line. This is like typing the `undo'
command enough times to get back to the beginning.
@end table
@end ftable
@node Readline Vi Mode
@subsection Readline Vi Mode
@cindex @code{vi} style command editing
@kindex toggle-editing-mode
While the Readline library does not have a full set of Vi editing
functions, it does contain enough to allow simple editing of the line.
In order to switch interactively between Emacs and Vi editing modes, use
the command M-C-j (toggle-editing-mode).
the command @key{M-C-j} (toggle-editing-mode).
When you enter a line in Vi mode, you are already placed in `insertion'
mode, as if you had typed an `i'. Pressing @key{ESC} switches you into
`edit' mode, where you can edit the text of the line with the standard
Vi movement keys, move to previous history lines with `k', and following
lines with `j', and so forth.

View File

@ -1,29 +1,23 @@
/* emacs_keymap.c -- the keymap for emacs_mode in readline (). */
/* Copyright (C) 1988,1989 Free Software Foundation, Inc.
/* Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc.
This file is part of GNU Readline, a library for reading lines
of text with interactive input and history editing.
Readline 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 1, or (at your option) any
later version.
Readline 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.
Readline 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.
Readline 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 Readline; see the file COPYING. If not, write to the Free
Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifndef BUFSIZ
#include <stdio.h>
#endif /* BUFSIZ */
#include "readline.h"
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* An array of function pointers, one for each possible key.
If the type byte is ISKMAP, then the pointer is the address of

View File

@ -0,0 +1,58 @@
# My ~/.inputrc file is in -*- text -*- for easy editing with Emacs.
#
# Notice the various bindings which are conditionalized depending
# on which program is running, or what terminal is active.
#
# In all programs, all terminals, make sure this is bound.
"\C-x\C-r": re-read-init-file
# Hp terminals (and some others) have ugly default behaviour for C-h.
"\C-h": backward-delete-char
"\e\C-h": backward-kill-word
"\C-xd": dump-functions
# In xterm windows, make the arrow keys do the right thing.
$if TERM=xterm
"\e[A": previous-history
"\e[B": next-history
"\e[C": forward-char
"\e[D": backward-char
# Under Xterm in Bash, we bind local Function keys to do something useful.
$if Bash
"\e[11~": "Function Key 1"
"\e[12~": "Function Key 2"
"\e[13~": "Function Key 3"
"\e[14~": "Function Key 4"
"\e[15~": "Function Key 5"
# I know the following escape sequence numbers are 1 greater than
# the function key. Don't ask me why, I didn't design the xterm terminal.
"\e[17~": "Function Key 6"
"\e[18~": "Function Key 7"
"\e[19~": "Function Key 8"
"\e[20~": "Function Key 9"
"\e[21~": "Function Key 10"
$endif
$endif
# For Bash, all terminals, add some Bash specific hacks.
$if Bash
"\C-xv": show-bash-version
"\C-x\C-e": shell-expand-line
# Here is one for editing my path.
"\C-xp": "$PATH\C-x\C-e\C-e\"\C-aPATH=\":\C-b"
# Make C-x r read my mail in emacs.
# "\C-xr": "emacs -f rmail\C-j"
$endif
# For FTP, different hacks:
$if Ftp
"\C-xg": "get \M-?"
"\C-xt": "put \M-?"
$endif
" ": self-insert

View File

@ -244,7 +244,14 @@ static char syscom[1024];
com_list (arg)
char *arg;
{
if (!arg)
arg = "*";
#ifdef __GO32__
sprintf (syscom, "ls -lp %s", arg);
#else
sprintf (syscom, "ls -FClg %s", arg);
#endif
system (syscom);
}
@ -390,3 +397,49 @@ valid_argument (caller, arg)
* compile-command: "cc -g -I../.. -L.. -o fileman fileman.c -lreadline -ltermcap"
* end:
*/
#ifdef __GO32__
/* **************************************************************** */
/* */
/* xmalloc and xrealloc () */
/* */
/* **************************************************************** */
static void memory_error_and_abort ();
char *
xmalloc (bytes)
int bytes;
{
char *temp = (char *)malloc (bytes);
if (!temp)
memory_error_and_abort ();
return (temp);
}
char *
xrealloc (pointer, bytes)
char *pointer;
int bytes;
{
char *temp;
if (!pointer)
temp = (char *)xmalloc (bytes);
else
temp = (char *)realloc (pointer, bytes);
if (!temp)
memory_error_and_abort ();
return (temp);
}
static void
memory_error_and_abort ()
{
fprintf (stderr, "xmalloc: Out of virtual memory!\n");
abort ();
}
#endif

View File

@ -1,34 +1,33 @@
/* funmap.c -- attach names to functions. */
/* Copyright (C) 1988,1989 Free Software Foundation, Inc.
/* Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc.
This file is part of GNU Readline, a library for reading lines
of text with interactive input and history editing.
Readline 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 1, or (at your option) any
later version.
Readline 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.
Readline 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.
Readline 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 Readline; see the file COPYING. If not, write to the Free
Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define STATIC_MALLOC
#ifndef STATIC_MALLOC
/* #define STATIC_MALLOC */
#if !defined (STATIC_MALLOC)
extern char *xmalloc (), *xrealloc ();
#else
static char *xmalloc (), *xrealloc ();
#endif
#endif /* STATIC_MALLOC */
#ifndef BUFSIZ
#include "sysdep.h"
#include <stdio.h>
#endif /* BUFSIZ */
#include "readline.h"
@ -36,94 +35,103 @@ FUNMAP **funmap = (FUNMAP **)NULL;
static int funmap_size = 0;
static int funmap_entry = 0;
/* After initializing the function map, this is the index of the first
program specific function. */
int funmap_program_specific_entry_start;
static FUNMAP default_funmap[] = {
{ "abort", rl_abort },
{ "accept-line", rl_newline },
{ "arrow-key-prefix", rl_arrow_keys },
{ "redraw-current-line", rl_refresh_line},
{ "beginning-of-line", rl_beg_of_line },
{ "backward-char", rl_backward },
{ "backward-delete-char", rl_rubout },
{ "backward-kill-line", rl_backward_kill_line },
{ "backward-kill-word", rl_backward_kill_word },
{ "backward-word", rl_backward_word },
{ "beginning-of-history", rl_beginning_of_history },
{ "beginning-of-line", rl_beg_of_line },
{ "call-last-kbd-macro", rl_call_last_kbd_macro },
{ "capitalize-word", rl_capitalize_word },
{ "clear-screen", rl_clear_screen },
{ "complete", rl_complete },
{ "delete-char", rl_delete },
{ "digit-argument", rl_digit_argument },
{ "do-lowercase-version", rl_do_lowercase_version },
{ "downcase-word", rl_downcase_word },
{ "dump-functions", rl_dump_functions },
{ "end-kbd-macro", rl_end_kbd_macro },
{ "end-of-history", rl_end_of_history },
{ "end-of-line", rl_end_of_line },
{ "forward-char", rl_forward },
{ "accept-line", rl_newline },
{ "forward-search-history", rl_forward_search_history },
{ "forward-word", rl_forward_word },
{ "kill-line", rl_kill_line },
{ "clear-screen", rl_clear_screen },
{ "kill-word", rl_kill_word },
{ "next-history", rl_get_next_history },
{ "possible-completions", rl_possible_completions },
{ "previous-history", rl_get_previous_history },
{ "quoted-insert", rl_quoted_insert },
{ "re-read-init-file", rl_re_read_init_file },
{ "redraw-current-line", rl_refresh_line},
{ "reverse-search-history", rl_reverse_search_history },
{ "forward-search-history", rl_forward_search_history },
{ "transpose-chars", rl_transpose_chars },
{ "unix-line-discard", rl_unix_line_discard },
{ "unix-word-rubout", rl_unix_word_rubout },
{ "yank", rl_yank },
{ "yank-pop", rl_yank_pop },
{ "yank-nth-arg", rl_yank_nth_arg },
{ "backward-delete-char", rl_rubout },
{ "backward-word", rl_backward_word },
{ "kill-word", rl_kill_word },
{ "forward-word", rl_forward_word },
{ "tab-insert", rl_tab_insert },
{ "backward-kill-word", rl_backward_kill_word },
{ "backward-kill-line", rl_backward_kill_line },
{ "transpose-words", rl_transpose_words },
{ "digit-argument", rl_digit_argument },
{ "complete", rl_complete },
{ "possible-completions", rl_possible_completions },
{ "do-lowercase-version", rl_do_lowercase_version },
{ "digit-argument", rl_digit_argument },
{ "universal-argument", rl_universal_argument },
{ "abort", rl_abort },
{ "undo", rl_undo_command },
{ "upcase-word", rl_upcase_word },
{ "downcase-word", rl_downcase_word },
{ "capitalize-word", rl_capitalize_word },
{ "revert-line", rl_revert_line },
{ "beginning-of-history", rl_beginning_of_history },
{ "end-of-history", rl_end_of_history },
{ "self-insert", rl_insert },
{ "start-kbd-macro", rl_start_kbd_macro },
{ "end-kbd-macro", rl_end_kbd_macro },
{ "re-read-init-file", rl_re_read_init_file },
#ifdef VI_MODE
{ "vi-movement-mode", rl_vi_movement_mode },
{ "vi-insertion-mode", rl_vi_insertion_mode },
{ "vi-arg-digit", rl_vi_arg_digit },
{ "vi-prev-word", rl_vi_prev_word },
{ "vi-next-word", rl_vi_next_word },
{ "vi-char-search", rl_vi_char_search },
{ "vi-editing-mode", rl_vi_editing_mode },
{ "vi-eof-maybe", rl_vi_eof_maybe },
{ "vi-append-mode", rl_vi_append_mode },
{ "vi-put", rl_vi_put },
{ "tab-insert", rl_tab_insert },
{ "transpose-chars", rl_transpose_chars },
{ "transpose-words", rl_transpose_words },
{ "undo", rl_undo_command },
{ "universal-argument", rl_universal_argument },
{ "unix-line-discard", rl_unix_line_discard },
{ "unix-word-rubout", rl_unix_word_rubout },
{ "upcase-word", rl_upcase_word },
{ "yank", rl_yank },
{ "yank-nth-arg", rl_yank_nth_arg },
{ "yank-pop", rl_yank_pop },
#if defined (VI_MODE)
{ "vi-append-eol", rl_vi_append_eol },
{ "vi-insert-beg", rl_vi_insert_beg },
{ "vi-delete", rl_vi_delete },
{ "vi-append-mode", rl_vi_append_mode },
{ "vi-arg-digit", rl_vi_arg_digit },
{ "vi-bWord", rl_vi_bWord },
{ "vi-bracktype", rl_vi_bracktype },
{ "vi-bword", rl_vi_bword },
{ "vi-change-case", rl_vi_change_case },
{ "vi-change-char", rl_vi_change_char },
{ "vi-change-to", rl_vi_change_to },
{ "vi-char-search", rl_vi_char_search },
{ "vi-column", rl_vi_column },
{ "vi-comment", rl_vi_comment },
{ "vi-complete", rl_vi_complete },
{ "vi-delete", rl_vi_delete },
{ "vi-delete-to", rl_vi_delete_to },
{ "vi-dosearch", rl_vi_dosearch },
{ "vi-eWord", rl_vi_eWord },
{ "vi-editing-mode", rl_vi_editing_mode },
{ "vi-end-word", rl_vi_end_word },
{ "vi-eof-maybe", rl_vi_eof_maybe },
{ "vi-eword", rl_vi_eword },
{ "vi-fWord", rl_vi_fWord },
{ "vi-first-print", rl_vi_first_print },
{ "vi-fword", rl_vi_fword },
{ "vi-fWord", rl_vi_fWord },
{ "vi-bword", rl_vi_bword },
{ "vi-bWord", rl_vi_bWord },
{ "vi-eword", rl_vi_eword },
{ "vi-eWord", rl_vi_eWord },
{ "vi-end-word", rl_vi_end_word },
{ "vi-change-case", rl_vi_change_case },
{ "vi-insert-beg", rl_vi_insert_beg },
{ "vi-insertion-mode", rl_vi_insertion_mode },
{ "vi-match", rl_vi_match },
{ "vi-bracktype", rl_vi_bracktype },
{ "vi-change-char", rl_vi_change_char },
{ "vi-yank-arg", rl_vi_yank_arg },
{ "vi-search", rl_vi_search },
{ "vi-search-again", rl_vi_search_again },
{ "vi-dosearch", rl_vi_dosearch },
{ "vi-subst", rl_vi_subst },
{ "vi-movement-mode", rl_vi_movement_mode },
{ "vi-next-word", rl_vi_next_word },
{ "vi-overstrike", rl_vi_overstrike },
{ "vi-overstrike-delete", rl_vi_overstrike_delete },
{ "vi-prev-word", rl_vi_prev_word },
{ "vi-put", rl_vi_put },
{ "vi-replace, ", rl_vi_replace },
{ "vi-column", rl_vi_column },
{ "vi-delete-to", rl_vi_delete_to },
{ "vi-change-to", rl_vi_change_to },
{ "vi-search", rl_vi_search },
{ "vi-search-again", rl_vi_search_again },
{ "vi-subst", rl_vi_subst },
{ "vi-yank-arg", rl_vi_yank_arg },
{ "vi-yank-to", rl_vi_yank_to },
{ "vi-complete", rl_vi_complete },
#endif /* VI_MODE */
{(char *)NULL, (Function *)NULL }
@ -161,6 +169,48 @@ rl_initialize_funmap ()
rl_add_funmap_entry (default_funmap[i].name, default_funmap[i].function);
funmap_initialized = 1;
funmap_program_specific_entry_start = i;
}
/* Stupid comparison routine for qsort () ing strings. */
static int
qsort_string_compare (s1, s2)
register char **s1, **s2;
{
return (strcmp (*s1, *s2));
}
/* Produce a NULL terminated array of known function names. The array
is sorted. The array itself is allocated, but not the strings inside.
You should free () the array when you done, but not the pointrs. */
char **
rl_funmap_names ()
{
char **result = (char **)NULL;
int result_size, result_index;
result_size = result_index = 0;
/* Make sure that the function map has been initialized. */
rl_initialize_funmap ();
for (result_index = 0; funmap[result_index]; result_index++)
{
if (result_index + 2 > result_size)
{
if (!result)
result = (char **)xmalloc ((result_size = 20) * sizeof (char *));
else
result = (char **)
xrealloc (result, (result_size += 20) * sizeof (char *));
}
result[result_index] = funmap[result_index]->name;
result[result_index + 1] = (char *)NULL;
}
qsort (result, result_index, sizeof (char *), qsort_string_compare);
return (result);
}
/* Things that mean `Control'. */
@ -172,7 +222,7 @@ char *possible_meta_prefixes[] = {
"Meta", "M-", (char *)NULL
};
#ifdef STATIC_MALLOC
#if defined (STATIC_MALLOC)
/* **************************************************************** */
/* */
@ -198,7 +248,12 @@ xrealloc (pointer, bytes)
char *pointer;
int bytes;
{
char *temp = (char *)realloc (pointer, bytes);
char *temp;
if (!pointer)
temp = (char *)malloc (bytes);
else
temp = (char *)realloc (pointer, bytes);
if (!temp)
memory_error_and_abort ();

View File

@ -1,53 +1,44 @@
/* History.c -- standalone history library */
/* Copyright (C) 1989 Free Software Foundation, Inc.
/* Copyright (C) 1989, 1991 Free Software Foundation, Inc.
This file contains the GNU History Library (the Library), a set of
routines for managing the text of previously typed lines.
The Library 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 1, or (at your option)
any later version.
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
The Library 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.
The Library 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.
The GNU General Public License is often shipped with GNU software, and
is generally kept in a file called COPYING or LICENSE. If you do not
have a copy of the license, write to the Free Software Foundation,
675 Mass Ave, Cambridge, MA 02139, USA. */
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* The goal is to make the implementation transparent, so that you
don't have to know what data types are used, just what functions
you can call. I think I have done that. */
/* Remove these declarations when we have a complete libgnu.a. */
#define STATIC_MALLOC
#ifndef STATIC_MALLOC
#if !defined (STATIC_MALLOC)
extern char *xmalloc (), *xrealloc ();
#else
static char *xmalloc (), *xrealloc ();
#endif
#include "sysdep.h"
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
#ifndef NO_SYS_FILE
#include <sys/file.h>
#endif
#include <sys/stat.h>
#include <fcntl.h>
#ifdef __GNUC__
#define alloca __builtin_alloca
#else
#if defined (sparc) && defined (sun)
#include <alloca.h>
#else
extern char *alloca ();
#endif
#endif
#include "history.h"
#ifndef savestring
@ -132,6 +123,8 @@ history_total_bytes ()
{
register int i, result;
result = 0;
for (i = 0; the_history && the_history[i]; i++)
result += strlen (the_history[i]->line);
@ -232,15 +225,22 @@ where_history ()
}
/* Search the history for STRING, starting at history_offset.
If DIRECTION < 0, then the search is through previous entries,
else through subsequent. If the string is found, then
current_history () is the history entry, and the value of this function
is the offset in the line of that history entry that the string was
found in. Otherwise, nothing is changed, and a -1 is returned. */
int
history_search (string, direction)
If DIRECTION < 0, then the search is through previous entries, else
through subsequent. If ANCHORED is non-zero, the string must
appear at the beginning of a history line, otherwise, the string
may appear anywhere in the line. If the string is found, then
current_history () is the history entry, and the value of this
function is the offset in the line of that history entry that the
string was found in. Otherwise, nothing is changed, and a -1 is
returned. */
#define ANCHORED_SEARCH 1
#define NON_ANCHORED_SEARCH 0
static int
history_search_internal (string, direction, anchored)
char *string;
int direction;
int direction, anchored;
{
register int i = history_offset;
register int reverse = (direction < 0);
@ -272,7 +272,19 @@ history_search (string, direction)
if (string_len > index)
goto next_line;
/* Do the actual search. */
/* Handle anchored searches first. */
if (anchored == ANCHORED_SEARCH)
{
if (strncmp (string, line, string_len) == 0)
{
history_offset = i;
return (0);
}
goto next_line;
}
/* Do substring search. */
if (reverse)
{
index -= string_len;
@ -289,7 +301,7 @@ history_search (string, direction)
}
else
{
register int limit = (string_len - index) + 1;
register int limit = index - string_len + 1;
index = 0;
while (index < limit)
@ -310,6 +322,24 @@ history_search (string, direction)
}
}
/* Do a non-anchored search for STRING through the history in DIRECTION. */
int
history_search (string, direction)
char *string;
int direction;
{
return (history_search_internal (string, direction, NON_ANCHORED_SEARCH));
}
/* Do an anchored search for string through the history in DIRECTION. */
int
history_search_prefix (string, direction)
char *string;
int direction;
{
return (history_search_internal (string, direction, ANCHORED_SEARCH));
}
/* Remove history element WHICH from the history. The removed
element is returned to you so you can free the line, data,
and containing structure. */
@ -340,6 +370,8 @@ void
stifle_history (max)
int max;
{
if (max < 0)
max = 0;
if (history_length > max)
{
register int i, j;
@ -416,7 +448,7 @@ read_history_range (filename, from, to)
{
register int line_start, line_end;
char *input, *buffer = (char *)NULL;
int file, current_line, done;
int file, current_line;
struct stat finfo;
extern int errno;
@ -497,7 +529,7 @@ history_truncate_file (fname, lines)
if (stat (filename, &finfo) == -1)
goto truncate_exit;
file = open (filename, O_RDONLY, 066);
file = open (filename, O_RDONLY, 0666);
if (file == -1)
goto truncate_exit;
@ -554,10 +586,9 @@ history_do_write (filename, nelements, overwrite)
int nelements, overwrite;
{
extern int errno;
register int i;
register int i, j;
char *output = history_filename (filename);
int file, mode;
char cr = '\n';
if (overwrite)
mode = O_WRONLY | O_CREAT | O_TRUNC;
@ -570,13 +601,30 @@ history_do_write (filename, nelements, overwrite)
if (nelements > history_length)
nelements = history_length;
for (i = history_length - nelements; i < history_length; i++)
{
if (write (file, the_history[i]->line, strlen (the_history[i]->line)) < 0)
break;
if (write (file, &cr, 1) < 0)
break;
}
/* Build a buffer of all the lines to write, and write them in one syscall.
Suggested by Peter Ho (peter@robosts.oxford.ac.uk). */
{
register int j = 0;
int buffer_size = 0;
char *buffer;
/* Calculate the total number of bytes to write. */
for (i = history_length - nelements; i < history_length; i++)
buffer_size += 1 + strlen (the_history[i]->line);
/* Allocate the buffer, and fill it. */
buffer = (char *)xmalloc (buffer_size);
for (i = history_length - nelements; i < history_length; i++)
{
strcpy (buffer + j, the_history[i]->line);
j += strlen (the_history[i]->line);
buffer[j++] = '\n';
}
write (file, buffer, buffer_size);
free (buffer);
}
close (file);
return (0);
@ -815,7 +863,8 @@ get_history_event (string, caller_index, delimiting_quote)
search_again:
index = history_search (temp, -1);
index = history_search_internal
(temp, -1, substring_okay ? NON_ANCHORED_SEARCH : ANCHORED_SEARCH);
if (index < 0)
search_lost:
@ -824,9 +873,7 @@ get_history_event (string, caller_index, delimiting_quote)
return ((char *)NULL);
}
if (index == 0 || substring_okay ||
(strncmp (temp, the_history[history_offset]->line,
strlen (temp)) == 0))
if (index == 0)
{
search_won:
entry = current_history ();

View File

@ -1,24 +1,27 @@
/* keymaps.c -- Functions and keymaps for the GNU Readline library. */
/* Copyright (C) 1988,1989 Free Software Foundation, Inc.
/* Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc.
This file is part of GNU Readline, a library for reading lines
of text with interactive input and history editing.
Readline 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 1, or (at your option) any
later version.
Readline 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.
Readline 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.
Readline 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 Readline; see the file COPYING. If not, write to the Free
Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "sysdep.h"
#include <stdio.h>
#include "readline.h"
#include "keymaps.h"
#include "emacs_keymap.c"
@ -27,12 +30,12 @@
#endif
/* Remove these declarations when we have a complete libgnu.a. */
#define STATIC_MALLOC
#ifndef STATIC_MALLOC
/* #define STATIC_MALLOC */
#if !defined (STATIC_MALLOC)
extern char *xmalloc (), *xrealloc ();
#else
static char *xmalloc (), *xrealloc ();
#endif
#endif /* STATIC_MALLOC */
/* **************************************************************** */
/* */
@ -86,8 +89,7 @@ rl_copy_keymap (map)
Keymap
rl_make_keymap ()
{
extern rl_insert (), rl_rubout (), rl_do_lowercase_version ();
extern rl_digit_argument ();
extern rl_insert (), rl_rubout ();
register int i;
Keymap newmap;
@ -157,7 +159,12 @@ xrealloc (pointer, bytes)
char *pointer;
int bytes;
{
char *temp = (char *)realloc (pointer, bytes);
char *temp;
if (!pointer)
temp = (char *)malloc (bytes);
else
temp = (char *)realloc (pointer, bytes);
if (!temp)
memory_error_and_abort ();

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
/* History.h -- the names of functions that you can call in history. */
/* The structure used to store a history entry. */
typedef struct _hist_entry {
char *line;
char *data;

View File

@ -1,49 +1,51 @@
/* Readline.h -- the names of functions callable from within readline. */
#ifndef _READLINE_H_
#if !defined (_READLINE_H_)
#define _READLINE_H_
#include <readline/keymaps.h>
#ifndef __FUNCTION_DEF
#if !defined (__FUNCTION_DEF)
typedef int Function ();
#define __FUNCTION_DEF
#endif
#endif /* __FUNCTION_DEF */
/* The functions for manipulating the text of the line within readline.
Most of these functions are bound to keys by default. */
extern int
rl_beg_of_line (), rl_backward (), rl_delete (), rl_end_of_line (),
rl_forward (), ding (), rl_backward (), rl_newline (), rl_kill_line (),
rl_clear_screen (), rl_get_next_history (), rl_get_previous_history (),
rl_quoted_insert (), rl_reverse_search_history (), rl_transpose_chars
(), rl_unix_line_discard (), rl_quoted_insert (), rl_unix_word_rubout
(), rl_yank (), rl_rubout (), rl_backward_word (), rl_kill_word (),
rl_forward_word (), rl_tab_insert (), rl_yank_pop (), rl_yank_nth_arg (),
rl_backward_kill_word (), rl_backward_kill_line (), rl_transpose_words
(), rl_complete (), rl_possible_completions (), rl_do_lowercase_version
(), rl_digit_argument (), rl_universal_argument (), rl_abort (),
rl_undo_command (), rl_revert_line (), rl_beginning_of_history (),
rl_end_of_history (), rl_forward_search_history (), rl_insert (),
rl_upcase_word (), rl_downcase_word (), rl_capitalize_word (),
rl_restart_output (), rl_re_read_init_file ();
rl_beg_of_line (), rl_backward (), rl_delete (), rl_end_of_line (),
rl_forward (), ding (), rl_backward (), rl_newline (), rl_kill_line (),
rl_clear_screen (), rl_get_next_history (), rl_get_previous_history (),
rl_quoted_insert (), rl_reverse_search_history (), rl_transpose_chars (),
rl_unix_line_discard (), rl_quoted_insert (), rl_unix_word_rubout (),
rl_yank (), rl_rubout (), rl_backward_word (), rl_kill_word (),
rl_forward_word (), rl_tab_insert (), rl_yank_pop (), rl_yank_nth_arg (),
rl_backward_kill_word (), rl_backward_kill_line (), rl_transpose_words (),
rl_complete (), rl_possible_completions (), rl_do_lowercase_version (),
rl_digit_argument (), rl_universal_argument (), rl_abort (),
rl_undo_command (), rl_revert_line (), rl_beginning_of_history (),
rl_end_of_history (), rl_forward_search_history (), rl_insert (),
rl_upcase_word (), rl_downcase_word (), rl_capitalize_word (),
rl_restart_output (), rl_re_read_init_file (), rl_dump_functions ();
/* These are *both* defined even when VI_MODE is not. */
extern int rl_vi_editing_mode (), rl_emacs_editing_mode ();
#ifdef VI_MODE
#if defined (VI_MODE)
/* Things for vi mode. */
extern int rl_vi_movement_mode (), rl_vi_insertion_mode (), rl_vi_arg_digit (),
rl_vi_prev_word (), rl_vi_next_word (), rl_vi_char_search (),
rl_vi_eof_maybe (), rl_vi_append_mode (), rl_vi_put (),
rl_vi_append_eol (), rl_vi_insert_beg (), rl_vi_delete (), rl_vi_comment (),
rl_vi_first_print (), rl_vi_fword (), rl_vi_fWord (), rl_vi_bword (),
rl_vi_bWord (), rl_vi_eword (), rl_vi_eWord (), rl_vi_end_word (),
rl_vi_change_case (), rl_vi_match (), rl_vi_bracktype (), rl_vi_change_char (),
rl_vi_yank_arg (), rl_vi_search (), rl_vi_search_again (),
rl_vi_dosearch (), rl_vi_subst (), rl_vi_overstrike (),
rl_vi_overstrike_delete (), rl_vi_replace(), rl_vi_column (),
rl_vi_delete_to (), rl_vi_change_to (), rl_vi_yank_to (), rl_vi_complete ();
extern int
rl_vi_movement_mode (), rl_vi_insertion_mode (), rl_vi_arg_digit (),
rl_vi_prev_word (), rl_vi_next_word (), rl_vi_char_search (),
rl_vi_eof_maybe (), rl_vi_append_mode (), rl_vi_put (),
rl_vi_append_eol (), rl_vi_insert_beg (), rl_vi_delete (), rl_vi_comment (),
rl_vi_first_print (), rl_vi_fword (), rl_vi_fWord (), rl_vi_bword (),
rl_vi_bWord (), rl_vi_eword (), rl_vi_eWord (), rl_vi_end_word (),
rl_vi_change_case (), rl_vi_match (), rl_vi_bracktype (),
rl_vi_change_char (), rl_vi_yank_arg (), rl_vi_search (),
rl_vi_search_again (), rl_vi_dosearch (), rl_vi_subst (),
rl_vi_overstrike (), rl_vi_overstrike_delete (), rl_vi_replace(),
rl_vi_column (), rl_vi_delete_to (), rl_vi_change_to (), rl_vi_yank_to (),
rl_vi_complete (), rl_vi_fetch_history ();
#endif /* VI_MODE */
/* Keyboard macro commands. */
@ -111,6 +113,12 @@ extern char *rl_basic_word_break_characters;
rl_basic_word_break_characters. */
extern char *rl_completer_word_break_characters;
/* List of characters which are used to quote a substring of the command
line, upon which completion is to be performed for the entire substring.
Within quoted substrings, rl_completer_word_break_characters are treated
as normal characters, unless they also appear in this list. */
extern char *rl_completer_quote_characters;
/* List of characters that are word break characters, but should be left
in TEXT when it is passed to the completion function. The shell uses
this to help determine what kind of completing to do. */
@ -153,10 +161,37 @@ extern Function *rl_startup_hook;
the address of a string (the current directory name) as an arg. */
extern Function *rl_symbolic_link_hook;
/* If non-zero then this is the address of a function you want called
while Readline is waiting for character input. */
extern Function *rl_event_hook;
/* Non-zero means that modified history lines are preceded
with an asterisk. */
extern int rl_show_star;
/* **************************************************************** */
/* */
/* Tilde Variables That Can be Externally Set */
/* */
/* **************************************************************** */
/* If non-null, this contains the address of a function to call if the
standard meaning for expanding a tilde fails. The function is called
with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
which is the expansion, or a NULL pointer if there is no expansion. */
extern Function *tilde_expansion_failure_hook;
/* When non-null, this is a NULL terminated array of strings which
are duplicates for a tilde prefix. Bash uses this to expand
`=~' and `:~'. */
extern char **tilde_additional_prefixes;
/* When non-null, this is a NULL terminated array of strings which match
the end of a username, instead of just "/". Bash sets this to
`/' and `:'. */
extern char **tilde_additional_suffixes;
/* **************************************************************** */
/* */
/* Well Published Functions */

View File

@ -0,0 +1,37 @@
/* System-dependent stuff, for ``normal'' systems */
/* If you think you need to change this file, then you are wrong. In order to
avoid a huge ugly mass of nested #ifdefs, you should create a new file just
for your system, which contains exactly those #includes and definitions that
your system needs, AND NOTHING MORE! Then, add that file to the appropriate
place in configure.in, and viola, you are done. sysdep-sunos4.h is a good
example of how to do this. */
#ifdef __GNUC__
#define alloca __builtin_alloca
#else
#if defined (sparc) && defined (sun)
#include <alloca.h>
#endif
#ifndef alloca /* May be a macro, with args. */
extern char *alloca ();
#endif
#endif
#include <sys/types.h> /* Needed by dirent.h */
#include <sys/ioctl.h> /* Needed for TIOC?WINSZ */
#if defined (USG) && defined (TIOCGWINSZ)
#include <sys/stream.h>
#if defined (USGr4) || defined (USGr3)
#include <sys/ptem.h>
#endif /* USGr4 */
#endif /* USG && TIOCGWINSZ */
#include <dirent.h>
typedef struct dirent dirent;
/* SVR4 systems should use <termios.h> rather than <termio.h>. */
#if defined (USGr4)
#define _POSIX_VERSION
#endif

View File

@ -1,29 +1,23 @@
/* vi_keymap.c -- the keymap for vi_mode in readline (). */
/* Copyright (C) 1988,1989 Free Software Foundation, Inc.
/* Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc.
This file is part of GNU Readline, a library for reading lines
of text with interactive input and history editing.
Readline 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 1, or (at your option) any
later version.
Readline 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.
Readline 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.
Readline 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 Readline; see the file COPYING. If not, write to the Free
Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifndef BUFSIZ
#include <stdio.h>
#endif /* BUFSIZ */
#include "readline.h"
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
extern KEYMAP_ENTRY_ARRAY vi_escape_keymap;
@ -99,7 +93,7 @@ KEYMAP_ENTRY_ARRAY vi_movement_keymap = {
{ ISFUNC, (Function *)0x0 }, /* : */
{ ISFUNC, rl_vi_char_search }, /* ; */
{ ISFUNC, (Function *)0x0 }, /* < */
{ ISFUNC, (Function *)0x0 }, /* = */
{ ISFUNC, rl_vi_complete }, /* = */
{ ISFUNC, (Function *)0x0 }, /* > */
{ ISFUNC, rl_vi_search }, /* ? */
{ ISFUNC, (Function *)0x0 }, /* @ */
@ -111,7 +105,7 @@ KEYMAP_ENTRY_ARRAY vi_movement_keymap = {
{ ISFUNC, rl_vi_delete_to }, /* D */
{ ISFUNC, rl_vi_end_word }, /* E */
{ ISFUNC, rl_vi_char_search }, /* F */
{ ISFUNC, (Function *)0x0 }, /* G */
{ ISFUNC, rl_vi_fetch_history }, /* G */
{ ISFUNC, (Function *)0x0 }, /* H */
{ ISFUNC, rl_vi_insert_beg }, /* I */
{ ISFUNC, (Function *)0x0 }, /* J */
@ -134,7 +128,7 @@ KEYMAP_ENTRY_ARRAY vi_movement_keymap = {
/* Some more punctuation. */
{ ISFUNC, (Function *)0x0 }, /* [ */
{ ISFUNC, (Function *)0x0 }, /* \ */
{ ISFUNC, rl_vi_complete }, /* \ */
{ ISFUNC, (Function *)0x0 }, /* ] */
{ ISFUNC, rl_vi_first_print }, /* ^ */
{ ISFUNC, rl_vi_yank_arg }, /* _ */

View File

@ -1,7 +1,25 @@
/* vi_mode.c -- A vi emulation mode for Bash.
Derived from code written by Jeff Sparkes (jsparkes@bnr.ca). */
Derived from code written by Jeff Sparkes (jeff1@????).
*/
/* Copyright (C) 1988, 1991 Free Software Foundation, Inc.
This file is part of the GNU Readline Library (the Library), a set of
routines for providing Emacs style line input to programs that ask
for it.
The Library 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.
The Library 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* **************************************************************** */
@ -9,6 +27,49 @@
/* VI Emulation Mode */
/* */
/* **************************************************************** */
#if defined (VI_MODE)
/* Some standard library routines. */
#include "sysdep.h"
#include <stdio.h>
#include "readline.h"
#include "history.h"
#ifndef digit
#define digit(c) ((c) >= '0' && (c) <= '9')
#endif
#ifndef isletter
#define isletter(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z'))
#endif
#ifndef digit_value
#define digit_value(c) ((c) - '0')
#endif
#ifndef member
#define member(c, s) ((c) ? index ((s), (c)) : 0)
#endif
#ifndef isident
#define isident(c) ((isletter(c) || digit(c) || c == '_'))
#endif
#ifndef exchange
#define exchange(x, y) {int temp = x; x = y; y = temp;}
#endif
/* Variables imported from readline.c */
extern int rl_point, rl_end, rl_mark, rl_done;
extern FILE *rl_instream;
extern int rl_line_buffer_len, rl_explicit_arg, rl_numeric_arg;
extern Keymap keymap;
extern char *rl_prompt;
extern char *rl_line_buffer;
extern int rl_arg_sign;
extern char *xmalloc (), *xrealloc ();
extern void rl_extend_line_buffer ();
/* Last string searched for from `/' or `?'. */
static char *vi_last_search = (char *)NULL;
@ -17,6 +78,9 @@ static int vi_histpos;
/* Non-zero means enter insertion mode. */
int vi_doing_insert = 0;
/* String inserted into the line by rl_vi_comment (). */
char *rl_vi_comment_begin = (char *)NULL;
/* *** UNCLEAN *** */
/* Command keys which do movement for xxx_to commands. */
static char *vi_motion = " hl^$0ftFt;,%wbeWBE|";
@ -26,13 +90,43 @@ static char *vi_motion = " hl^$0ftFt;,%wbeWBE|";
static Keymap vi_replace_map = (Keymap)NULL;
/* The number of characters inserted in the last replace operation. */
static vi_replace_count = 0;
static int vi_replace_count = 0;
/* Yank the nth arg from the previous line into this line at point. */
rl_vi_yank_arg (count)
int count;
{
rl_yank_nth_arg (count, 0);
/* Readline thinks that the first word on a line is the 0th, while vi
thinks the first word on a line is the 1st. Compensate. */
if (rl_explicit_arg)
rl_yank_nth_arg (count - 1, 0);
else
rl_yank_nth_arg ('$', 0);
}
/* With an argument, move back that many history lines, else move to the
beginning of history. */
rl_vi_fetch_history (count, c)
int count, c;
{
extern int rl_explicit_arg;
int current = where_history ();
/* Giving an argument of n means we want the nth command in the history
file. The command number is interpreted the same way that the bash
`history' command does it -- that is, giving an argument count of 450
to this command would get the command listed as number 450 in the
output of `history'. */
if (rl_explicit_arg)
{
int wanted = history_base + current - count;
if (wanted <= 0)
rl_beginning_of_history (0, 0);
else
rl_get_previous_history (wanted);
}
else
rl_beginning_of_history (count, 0);
}
/* Search again for the last thing searched for. */
@ -78,7 +172,7 @@ rl_vi_search (count, key)
save_pos = rl_point;
/* Reuse the line input buffer to read the search string. */
the_line[0] = 0;
rl_line_buffer[0] = 0;
rl_end = rl_point = 0;
p = (char *)alloca (2 + (rl_prompt ? strlen (rl_prompt) : 0));
@ -128,8 +222,38 @@ rl_vi_search (count, key)
if (vi_last_search)
free (vi_last_search);
vi_last_search = savestring (the_line);
rl_vi_dosearch (the_line, dir);
vi_last_search = savestring (rl_line_buffer);
rl_vi_dosearch (rl_line_buffer, dir);
}
/* Search for STRING in the history list. DIR is < 0 for searching
backwards. POS is an absolute index into the history list at
which point to begin searching. If the first character of STRING
is `^', the string must match a prefix of a history line, otherwise
a full substring match is performed. */
static int
vi_history_search_pos (string, dir, pos)
char *string;
int dir, pos;
{
int ret, old = where_history ();
history_set_pos (pos);
if (*string == '^')
ret = history_search_prefix (string + 1, dir);
else
ret = history_search (string, dir);
if (ret == -1)
{
history_set_pos (old);
return (-1);
}
ret = where_history ();
history_set_pos (old);
return ret;
}
rl_vi_dosearch (string, dir)
@ -145,7 +269,7 @@ rl_vi_dosearch (string, dir)
return;
}
if ((save = history_search_pos (string, dir, vi_histpos + dir)) == -1)
if ((save = vi_history_search_pos (string, dir, vi_histpos + dir)) == -1)
{
maybe_unsave_line ();
rl_clear_message ();
@ -161,9 +285,16 @@ rl_vi_dosearch (string, dir)
h = current_history ();
history_set_pos (old);
strcpy (the_line, h->line);
{
int line_len = strlen (h->line);
if (line_len >= rl_line_buffer_len)
rl_extend_line_buffer (line_len);
strcpy (rl_line_buffer, h->line);
}
rl_undo_list = (UNDO_LIST *)h->data;
rl_end = strlen (the_line);
rl_end = strlen (rl_line_buffer);
rl_point = 0;
rl_clear_message ();
}
@ -172,19 +303,21 @@ rl_vi_dosearch (string, dir)
rl_vi_complete (ignore, key)
int ignore, key;
{
if ((rl_point < rl_end) && (!whitespace (the_line[rl_point])))
if ((rl_point < rl_end) && (!whitespace (rl_line_buffer[rl_point])))
{
if (!whitespace (the_line[rl_point + 1]))
if (!whitespace (rl_line_buffer[rl_point + 1]))
rl_vi_end_word (1, 'E');
rl_point++;
}
if (key == '*')
rl_complete_internal ('*');
rl_complete_internal ('*'); /* Expansion and replacement. */
else if (key == '=')
rl_complete_internal ('?'); /* List possible completions. */
else if (key == '\\')
rl_complete_internal (TAB); /* Standard Readline completion. */
else
rl_complete (0, key);
rl_vi_insertion_mode ();
}
/* Previous word in vi mode. */
@ -197,6 +330,12 @@ rl_vi_prev_word (count, key)
return;
}
if (rl_point == 0)
{
ding ();
return;
}
if (uppercase_p (key))
rl_vi_bWord (count);
else
@ -213,6 +352,12 @@ rl_vi_next_word (count, key)
return;
}
if (rl_point >= (rl_end - 1))
{
ding ();
return;
}
if (uppercase_p (key))
rl_vi_fWord (count);
else
@ -235,7 +380,6 @@ rl_vi_end_word (count, key)
rl_vi_eword (count);
}
/* Move forward a word the way that 'W' does. */
/* Move forward a word the way that 'W' does. */
rl_vi_fWord (count)
int count;
@ -243,12 +387,12 @@ rl_vi_fWord (count)
while (count-- && rl_point < (rl_end - 1))
{
/* Skip until whitespace. */
while (!whitespace (the_line[rl_point]) && rl_point < rl_end)
rl_point++;
while (!whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
rl_point++;
/* Now skip whitespace. */
while (whitespace (the_line[rl_point]) && rl_point < rl_end)
rl_point++;
while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
rl_point++;
}
}
@ -258,19 +402,19 @@ rl_vi_bWord (count)
while (count-- && rl_point > 0)
{
/* If we are at the start of a word, move back to whitespace so
we will go back to the start of the previous word. */
if (!whitespace (the_line[rl_point]) &&
whitespace (the_line[rl_point - 1]))
rl_point--;
we will go back to the start of the previous word. */
if (!whitespace (rl_line_buffer[rl_point]) &&
whitespace (rl_line_buffer[rl_point - 1]))
rl_point--;
while (rl_point > 0 && whitespace (the_line[rl_point]))
rl_point--;
while (rl_point > 0 && whitespace (rl_line_buffer[rl_point]))
rl_point--;
if (rl_point > 0)
{
while (--rl_point >= 0 && !whitespace (the_line[rl_point]));
rl_point++;
}
{
while (--rl_point >= 0 && !whitespace (rl_line_buffer[rl_point]));
rl_point++;
}
}
}
@ -279,23 +423,26 @@ rl_vi_eWord (count)
{
while (count-- && rl_point < (rl_end - 1))
{
/* Move to white space. */
while (++rl_point < rl_end && whitespace (the_line[rl_point]))
;
if (!whitespace (rl_line_buffer[rl_point]))
rl_point++;
/* Move to the next non-whitespace character (to the start of the
next word). */
while (++rl_point < rl_end && whitespace (rl_line_buffer[rl_point]));
if (rl_point && rl_point < rl_end)
{
/* Skip whitespace. */
while (rl_point < rl_end && whitespace (the_line[rl_point]))
rl_point++;
{
/* Skip whitespace. */
while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
rl_point++;
/* Skip until whitespace. */
while (rl_point < rl_end && !whitespace (the_line[rl_point]))
rl_point++;
/* Skip until whitespace. */
while (rl_point < rl_end && !whitespace (rl_line_buffer[rl_point]))
rl_point++;
/* Move back to the last character of the word. */
rl_point--;
}
/* Move back to the last character of the word. */
rl_point--;
}
}
}
@ -305,21 +452,21 @@ rl_vi_fword (count)
while (count-- && rl_point < (rl_end - 1))
{
/* Move to white space (really non-identifer). */
if (isident (the_line[rl_point]))
{
while (isident (the_line[rl_point]) && rl_point < rl_end)
rl_point++;
}
else /* if (!whitespace (the_line[rl_point])) */
{
while (!isident (the_line[rl_point]) &&
!whitespace (the_line[rl_point]) && rl_point < rl_end)
rl_point++;
}
if (isident (rl_line_buffer[rl_point]))
{
while (isident (rl_line_buffer[rl_point]) && rl_point < rl_end)
rl_point++;
}
else /* if (!whitespace (rl_line_buffer[rl_point])) */
{
while (!isident (rl_line_buffer[rl_point]) &&
!whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
rl_point++;
}
/* Move past whitespace. */
while (whitespace (the_line[rl_point]) && rl_point < rl_end)
rl_point++;
while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
rl_point++;
}
}
@ -330,32 +477,33 @@ rl_vi_bword (count)
{
int last_is_ident;
/* If we are at the start of a word, move back to a non-identifier
so we will go back to the start of the previous word. */
if (isident (the_line[rl_point]) && !isident (the_line[rl_point - 1]))
rl_point--;
/* If we are at the start of a word, move back to whitespace
so we will go back to the start of the previous word. */
if (!whitespace (rl_line_buffer[rl_point]) &&
whitespace (rl_line_buffer[rl_point - 1]))
rl_point--;
/* If this character and the previous character are `opposite', move
back so we don't get messed up by the rl_point++ down there in
the while loop. Without this code, words like `l;' screw up the
function. */
last_is_ident = isident (the_line[rl_point - 1]);
if ((isident (the_line[rl_point]) && !last_is_ident) ||
(!isident (the_line[rl_point]) && last_is_ident))
rl_point--;
back so we don't get messed up by the rl_point++ down there in
the while loop. Without this code, words like `l;' screw up the
function. */
last_is_ident = isident (rl_line_buffer[rl_point - 1]);
if ((isident (rl_line_buffer[rl_point]) && !last_is_ident) ||
(!isident (rl_line_buffer[rl_point]) && last_is_ident))
rl_point--;
while (rl_point > 0 && whitespace (the_line[rl_point]))
rl_point--;
while (rl_point > 0 && whitespace (rl_line_buffer[rl_point]))
rl_point--;
if (rl_point > 0)
{
if (isident (the_line[rl_point]))
while (--rl_point >= 0 && isident (the_line[rl_point]));
else
while (--rl_point >= 0 && !isident (the_line[rl_point]) &&
!whitespace (the_line[rl_point]));
rl_point++;
}
{
if (isident (rl_line_buffer[rl_point]))
while (--rl_point >= 0 && isident (rl_line_buffer[rl_point]));
else
while (--rl_point >= 0 && !isident (rl_line_buffer[rl_point]) &&
!whitespace (rl_line_buffer[rl_point]));
rl_point++;
}
}
}
@ -364,18 +512,21 @@ rl_vi_eword (count)
{
while (count-- && rl_point < rl_end - 1)
{
while (++rl_point < rl_end && whitespace (the_line[rl_point]))
;
if (!whitespace (rl_line_buffer[rl_point]))
rl_point++;
while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
rl_point++;
if (rl_point < rl_end)
{
if (isident (the_line[rl_point]))
while (++rl_point < rl_end && isident (the_line[rl_point]));
else
while (++rl_point < rl_end && !isident (the_line[rl_point])
&& !whitespace (the_line[rl_point]));
rl_point--;
}
{
if (isident (rl_line_buffer[rl_point]))
while (++rl_point < rl_end && isident (rl_line_buffer[rl_point]));
else
while (++rl_point < rl_end && !isident (rl_line_buffer[rl_point])
&& !whitespace (rl_line_buffer[rl_point]));
}
rl_point--;
}
}
@ -444,39 +595,41 @@ rl_vi_arg_digit (count, c)
rl_digit_argument (count, c);
}
/* Doesn't take an arg count in vi */
rl_vi_change_case (ignore1, ignore2)
int ignore1, ignore2;
rl_vi_change_case (count, ignore)
int count, ignore;
{
char c = 0;
/* Don't try this on an empty line. */
if (rl_point >= rl_end - 1)
if (rl_point >= rl_end)
return;
if (uppercase_p (the_line[rl_point]))
c = to_lower (the_line[rl_point]);
else if (lowercase_p (the_line[rl_point]))
c = to_upper (the_line[rl_point]);
/* Vi is kind of strange here. */
if (c)
while (count-- && rl_point < rl_end)
{
rl_begin_undo_group ();
rl_delete (1, c);
rl_insert (1, c);
rl_end_undo_group ();
rl_vi_check ();
if (uppercase_p (rl_line_buffer[rl_point]))
c = to_lower (rl_line_buffer[rl_point]);
else if (lowercase_p (rl_line_buffer[rl_point]))
c = to_upper (rl_line_buffer[rl_point]);
/* Vi is kind of strange here. */
if (c)
{
rl_begin_undo_group ();
rl_delete (1, c);
rl_insert (1, c);
rl_end_undo_group ();
rl_vi_check ();
}
else
rl_forward (1);
}
else
rl_forward (1);
}
rl_vi_put (count, key)
int count, key;
{
if (!uppercase_p (key) && (rl_point + 1 <= rl_end))
rl_forward (1);
rl_point++;
rl_yank ();
rl_backward (1);
@ -501,6 +654,9 @@ rl_vi_domove (key, nextkey)
int key, *nextkey;
{
int c, save;
int old_end, added_blank;
added_blank = 0;
rl_mark = rl_point;
c = rl_read_key ();
@ -511,10 +667,14 @@ rl_vi_domove (key, nextkey)
if (digit (c))
{
save = rl_numeric_arg;
rl_numeric_arg = digit_value (c);
rl_digit_loop1 ();
rl_numeric_arg *= save;
c = rl_read_key (); /* real command */
*nextkey = c;
}
else if ((key == 'd' && c == 'd') ||
(key == 'y' && c == 'y') ||
(key == 'c' && c == 'c'))
{
rl_mark = rl_end;
@ -525,15 +685,41 @@ rl_vi_domove (key, nextkey)
return (-1);
}
/* Append a blank character temporarily so that the motion routines
work right at the end of the line. */
old_end = rl_end;
rl_line_buffer[rl_end++] = ' '; /* This looks pretty bogus to me??? */
rl_line_buffer[rl_end] = '\0';
added_blank++;
rl_dispatch (c, keymap);
/* Remove the blank that we added. */
rl_end = old_end;
rl_line_buffer[rl_end] = '\0';
if (rl_point > rl_end)
rl_point = rl_end - 1;
/* No change in position means the command failed. */
if (rl_mark == rl_point)
return (-1);
if ((c == 'w' || c == 'W') && rl_point < rl_end)
/* rl_vi_f[wW]ord () leaves the cursor on the first character of the next
word. If we are not at the end of the line, and we are on a
non-whitespace character, move back one (presumably to whitespace). */
if ((c == 'w' || c == 'W') && (rl_point < rl_end) &&
!whitespace (rl_line_buffer[rl_point]))
rl_point--;
/* If cw or cW, back up to the end of a word, so the behaviour of ce
or cE is the actual result. Brute-force, no subtlety. Do the same
thing for dw or dW. */
if (key == 'c' && (to_upper (c) == 'W'))
{
while (rl_point && whitespace (rl_line_buffer[rl_point]))
rl_point--;
}
if (rl_mark < rl_point)
exchange (rl_point, rl_mark);
@ -548,7 +734,7 @@ rl_digit_loop1 ()
while (1)
{
rl_message ("(arg: %d) ", arg_sign * rl_numeric_arg, 0);
rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg, 0);
key = c = rl_read_key ();
if (keymap[c].type == ISFUNC &&
@ -562,9 +748,9 @@ rl_digit_loop1 ()
if (numeric (c))
{
if (rl_explicit_arg)
rl_numeric_arg = (rl_numeric_arg * 10) + (c - '0');
rl_numeric_arg = (rl_numeric_arg * 10) + digit_value (c);
else
rl_numeric_arg = (c - '0');
rl_numeric_arg = digit_value (c);
rl_explicit_arg = 1;
}
else
@ -590,7 +776,7 @@ rl_vi_delete_to (count, key)
return;
}
if ((c != '|') && (c != 'h') && rl_mark < rl_end)
if ((c != 'l') && (c != '|') && (c != 'h') && rl_mark < rl_end)
rl_mark++;
rl_kill_text (rl_point, rl_mark);
@ -610,7 +796,7 @@ rl_vi_change_to (count, key)
return;
}
if ((c != '|') && (c != 'h') && rl_mark < rl_end)
if ((c != 'l') && (c != '|') && (c != 'h') && rl_mark < rl_end)
rl_mark++;
rl_begin_undo_group ();
@ -633,6 +819,9 @@ rl_vi_yank_to (count, key)
return;
}
if ((c != 'l') && (c != '|') && (c != 'h') && rl_mark < rl_end)
rl_mark++;
rl_begin_undo_group ();
rl_kill_text (rl_point, rl_mark);
rl_end_undo_group ();
@ -666,21 +855,26 @@ rl_vi_delete (count)
rl_vi_comment ()
{
rl_beg_of_line ();
rl_insert_text (": "); /* `#' doesn't work in interactive mode */
if (rl_vi_comment_begin != (char *)NULL)
rl_insert_text (rl_vi_comment_begin);
else
rl_insert_text (": "); /* Default. */
rl_redisplay ();
rl_newline (1, '\010');
}
rl_vi_first_print ()
{
rl_back_to_indent ();
rl_back_to_indent (0, 0);
}
rl_back_to_indent (ignore1, ignore2)
int ignore1, ignore2;
{
rl_beg_of_line ();
while (rl_point < rl_end && whitespace (the_line[rl_point]))
while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
rl_point++;
}
@ -701,70 +895,88 @@ rl_vi_char_search (count, key)
dir = (key == ';' ? orig_dir : -orig_dir);
else
{
target = rl_getc (in_stream);
target = rl_getc (rl_instream);
switch (key)
{
case 't':
orig_dir = dir = FTO;
break;
{
case 't':
orig_dir = dir = FTO;
break;
case 'T':
orig_dir = dir = BTO;
break;
case 'T':
orig_dir = dir = BTO;
break;
case 'f':
orig_dir = dir = FFIND;
break;
case 'f':
orig_dir = dir = FFIND;
break;
case 'F':
orig_dir = dir = BFIND;
break;
}
case 'F':
orig_dir = dir = BFIND;
break;
}
}
pos = rl_point;
if (dir < 0)
while (count--)
{
pos--;
do
if (dir < 0)
{
if (the_line[pos] == target)
if (pos == 0)
{
if (dir == BTO)
rl_point = pos + 1;
else
rl_point = pos;
ding ();
return;
}
pos--;
do
{
if (rl_line_buffer[pos] == target)
{
if (dir == BTO)
rl_point = pos + 1;
else
rl_point = pos;
break;
}
}
while (pos--);
if (pos < 0)
{
ding ();
return;
}
}
while (pos--);
if (pos < 0)
{
ding ();
return;
}
}
else
{ /* dir > 0 */
pos++;
do
{
if (the_line[pos] == target)
else
{ /* dir > 0 */
if (pos >= rl_end)
{
if (dir == FTO)
rl_point = pos - 1;
else
rl_point = pos;
ding ();
return;
}
pos++;
do
{
if (rl_line_buffer[pos] == target)
{
if (dir == FTO)
rl_point = pos - 1;
else
rl_point = pos;
break;
}
}
while (++pos < rl_end);
if (pos >= (rl_end - 1))
{
ding ();
return;
}
}
while (++pos < rl_end);
if (pos >= (rl_end - 1))
ding ();
}
}
@ -774,9 +986,9 @@ rl_vi_match ()
int count = 1, brack, pos;
pos = rl_point;
if ((brack = rl_vi_bracktype (the_line[rl_point])) == 0)
if ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0)
{
while ((brack = rl_vi_bracktype (the_line[rl_point])) == 0 &&
while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0 &&
rl_point < rl_end - 1)
rl_forward (1);
@ -796,7 +1008,7 @@ rl_vi_match ()
{
if (--pos >= 0)
{
int b = rl_vi_bracktype (the_line[pos]);
int b = rl_vi_bracktype (rl_line_buffer[pos]);
if (b == -brack)
count--;
else if (b == brack)
@ -815,7 +1027,7 @@ rl_vi_match ()
{
if (++pos < rl_end)
{
int b = rl_vi_bracktype (the_line[pos]);
int b = rl_vi_bracktype (rl_line_buffer[pos]);
if (b == -brack)
count--;
else if (b == brack)
@ -847,24 +1059,26 @@ rl_vi_bracktype (c)
}
}
rl_vi_change_char ()
rl_vi_change_char (count, key)
int count, key;
{
int c;
c = rl_getc (in_stream);
c = rl_getc (rl_instream);
switch (c)
if (c == '\033' || c == CTRL ('C'))
return;
while (count-- && rl_point < rl_end)
{
case '\033':
case CTRL('C'):
return;
default:
rl_begin_undo_group ();
rl_delete (1, c);
rl_insert (1, c);
if (count == 0)
rl_backward (1);
rl_end_undo_group ();
break;
}
}
@ -882,6 +1096,7 @@ rl_vi_subst (count, key)
else
rl_delete (count, key);
rl_end_undo_group ();
rl_vi_insertion_mode ();
}
@ -942,21 +1157,33 @@ rl_vi_overstrike_delete (count)
}
}
rl_vi_replace ()
rl_vi_replace (count, key)
int count, key;
{
int i;
vi_replace_count = 0;
vi_replace_map = rl_make_bare_keymap ();
if (!vi_replace_map)
{
vi_replace_map = rl_make_bare_keymap ();
for (i = ' '; i < 127; i++)
vi_replace_map[i].function = rl_vi_overstrike;
for (i = ' '; i < 127; i++)
vi_replace_map[i].function = rl_vi_overstrike;
vi_replace_map[RUBOUT].function = rl_vi_overstrike_delete;
vi_replace_map[ESC].function = rl_vi_movement_mode;
vi_replace_map[RETURN].function = rl_newline;
vi_replace_map[NEWLINE].function = rl_newline;
vi_replace_map[RUBOUT].function = rl_vi_overstrike_delete;
vi_replace_map[ESC].function = rl_vi_movement_mode;
vi_replace_map[RETURN].function = rl_newline;
vi_replace_map[NEWLINE].function = rl_newline;
/* If the normal vi insertion keymap has ^H bound to erase, do the
same here. Probably should remove the assignment to RUBOUT up
there, but I don't think it will make a difference in real life. */
if (vi_insertion_keymap[CTRL ('H')].type == ISFUNC &&
vi_insertion_keymap[CTRL ('H')].function == rl_rubout)
vi_replace_map[CTRL ('H')].function = rl_vi_overstrike_delete;
}
keymap = vi_replace_map;
}
@ -969,12 +1196,12 @@ rl_vi_possible_completions()
{
int save_pos = rl_point;
if (!index (" ;", the_line[rl_point]))
if (!index (" ;", rl_line_buffer[rl_point]))
{
while (!index(" ;", the_line[++rl_point]))
while (!index(" ;", rl_line_buffer[++rl_point]))
;
}
else if (the_line[rl_point-1] == ';')
else if (rl_line_buffer[rl_point-1] == ';')
{
ding ();
return (0);
@ -985,3 +1212,5 @@ rl_vi_possible_completions()
return (0);
}
#endif /* VI_MODE */