mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2025-01-11 17:04:19 +01:00
Merge with much improved version from gdb4.11
This commit is contained in:
parent
9b39195f89
commit
ce4acff5b6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=1472
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
8
gnu/lib/libreadline/doc/ChangeLog
Normal file
8
gnu/lib/libreadline/doc/ChangeLog
Normal 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
|
@ -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
|
||||
|
155
gnu/lib/libreadline/doc/inc-hist.texi
Normal file
155
gnu/lib/libreadline/doc/inc-hist.texi
Normal 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
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
@}
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
58
gnu/lib/libreadline/examples/Inputrc
Normal file
58
gnu/lib/libreadline/examples/Inputrc
Normal 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
|
@ -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
|
||||
|
@ -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 ();
|
||||
|
@ -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 ();
|
||||
|
@ -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
@ -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;
|
||||
|
@ -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 */
|
||||
|
37
gnu/lib/libreadline/sysdep.h
Normal file
37
gnu/lib/libreadline/sysdep.h
Normal 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
|
@ -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 }, /* _ */
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user