annotate info/echo_area.c @ 251:d2ada1d8b70c

[project @ 1993-12-06 19:49:25 by jwe]
author jwe
date Mon, 06 Dec 1993 19:49:25 +0000
parents d6fae6ef3e60
children 5fb4ee02da70
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1 /* echo_area.c -- How to read a line in the echo area. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3 /* This file is part of GNU Info, a program for reading online documentation
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4 stored in Info format.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
5
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
6 Copyright (C) 1993 Free Software Foundation, Inc.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
7
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
8 This program is free software; you can redistribute it and/or modify
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
10 the Free Software Foundation; either version 2, or (at your option)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
11 any later version.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
12
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
13 This program is distributed in the hope that it will be useful,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
16 GNU General Public License for more details.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
17
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
19 along with this program; if not, write to the Free Software
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
21
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
22 Written by Brian Fox (bfox@ai.mit.edu). */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
23
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
24 #include "info.h"
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
25
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
26 /* Non-zero means that C-g was used to quit reading input. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
27 int info_aborted_echo_area = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
28
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
29 /* Non-zero means that the echo area is being used to read input. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
30 int echo_area_is_active = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
31
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
32 /* The address of the last command executed in the echo area. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
33 VFunction *ea_last_executed_command = (VFunction *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
34
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
35 /* Non-zero means that the last command executed while reading input
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
36 killed some text. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
37 int echo_area_last_command_was_kill = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
38
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
39 /* Variables which hold on to the current state of the input line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
40 static char input_line[1 + EA_MAX_INPUT];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
41 static char *input_line_prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
42 static int input_line_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
43 static int input_line_beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
44 static int input_line_end;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
45 static NODE input_line_node = {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
46 (char *)NULL, (char *)NULL, (char *)NULL, input_line, EA_MAX_INPUT, 0
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
47 };
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
48
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
49 static void echo_area_initialize_node ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
50 static void push_echo_area (), pop_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
51 static int echo_area_stack_depth (), echo_area_stack_contains_completions_p ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
52
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
53 static void ea_kill_text ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
54
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
55 /* Non-zero means we force the user to complete. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
56 static int echo_area_must_complete_p = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
57 static int completions_window_p ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
58
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
59 /* If non-null, this is a window which was specifically created to display
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
60 possible completions output. We remember it so we can delete it when
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
61 appropriate. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
62 static WINDOW *echo_area_completions_window = (WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
63
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
64 /* Variables which keep track of the window which was active prior to
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
65 entering the echo area. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
66 static WINDOW *calling_window = (WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
67 static NODE *calling_window_node = (NODE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
68 static long calling_window_point = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
69 static long calling_window_pagetop = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
70
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
71 /* Remember the node and pertinent variables of the calling window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
72 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
73 remember_calling_window (window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
74 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
75 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
76 /* Only do this if the calling window is not the completions window, or,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
77 if it is the completions window and there is no other window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
78 if (!completions_window_p (window) ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
79 ((window == windows) && !(window->next)))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
80 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
81 calling_window = window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
82 calling_window_node = window->node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
83 calling_window_point = window->point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
84 calling_window_pagetop = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
85 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
86 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
87
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
88 /* Restore the caller's window so that it shows the node that it was showing
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
89 on entry to info_read_xxx_echo_area (). */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
90 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
91 restore_calling_window ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
92 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
93 register WINDOW *win, *compwin = (WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
94
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
95 /* If the calling window is still visible, and it is the window that
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
96 we used for completions output, then restore the calling window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
97 for (win = windows; win; win = win->next)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
98 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
99 if (completions_window_p (win))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
100 compwin = win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
101
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
102 if (win == calling_window && win == compwin)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
103 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
104 window_set_node_of_window (calling_window, calling_window_node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
105 calling_window->point = calling_window_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
106 calling_window->pagetop = calling_window_pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
107 compwin = (WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
108 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
109 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
110 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
111
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
112 /* Delete the completions window if it is still present, it isn't the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
113 last window on the screen, and there aren't any prior echo area reads
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
114 pending which created a completions window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
115 if (compwin)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
116 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
117 if ((compwin != windows || windows->next) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
118 !echo_area_stack_contains_completions_p ())
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
119 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
120 WINDOW *next;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
121 int pagetop, start, end, amount;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
122
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
123 next = compwin->next;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
124 if (next)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
125 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
126 start = next->first_row;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
127 end = start + next->height;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
128 amount = - (compwin->height + 1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
129 pagetop = next->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
130 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
131
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
132 info_delete_window_internal (compwin);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
133
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
134 /* This is not necessary because info_delete_window_internal ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
135 calls echo_area_inform_of_deleted_window (), which does the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
136 right thing. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
137 #if defined (UNNECESSARY)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
138 echo_area_completions_window = (WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
139 #endif /* UNNECESSARY */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
140
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
141 if (next)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
142 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
143 display_scroll_display (start, end, amount);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
144 next->pagetop = pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
145 display_update_display (windows);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
146 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
147 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
148 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
149 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
150
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
151 /* Set up a new input line with PROMPT. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
152 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
153 initialize_input_line (prompt)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
154 char *prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
155 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
156 input_line_prompt = prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
157 if (prompt)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
158 strcpy (input_line, prompt);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
159 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
160 input_line[0] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
161
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
162 input_line_beg = input_line_end = input_line_point = strlen (prompt);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
163 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
164
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
165 static char *
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
166 echo_area_after_read ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
167 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
168 char *return_value;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
169
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
170 if (info_aborted_echo_area)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
171 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
172 info_aborted_echo_area = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
173 return_value = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
174 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
175 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
176 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
177 if (input_line_beg == input_line_end)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
178 return_value = savestring ("");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
179 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
180 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
181 int line_len = input_line_end - input_line_beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
182 return_value = (char *) xmalloc (1 + line_len);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
183 strncpy (return_value, &input_line[input_line_beg], line_len);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
184 return_value[line_len] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
185 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
186 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
187 return (return_value);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
188 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
189
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
190 /* Read a line of text in the echo area. Return a malloc ()'ed string,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
191 or NULL if the user aborted out of this read. WINDOW is the currently
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
192 active window, so that we can restore it when we need to. PROMPT, if
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
193 non-null, is a prompt to print before reading the line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
194 char *
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
195 info_read_in_echo_area (window, prompt)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
196 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
197 char *prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
198 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
199 char *line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
200
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
201 /* If the echo area is already active, remember the current state. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
202 if (echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
203 push_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
204
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
205 /* Initialize our local variables. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
206 initialize_input_line (prompt);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
207
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
208 /* Initialize the echo area for the first (but maybe not the last) time. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
209 echo_area_initialize_node ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
210
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
211 /* Save away the original node of this window, and the window itself,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
212 so echo area commands can temporarily use this window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
213 remember_calling_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
214
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
215 /* Let the rest of Info know that the echo area is active. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
216 echo_area_is_active++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
217 active_window = the_echo_area;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
218
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
219 /* Read characters in the echo area. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
220 info_read_and_dispatch ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
221
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
222 echo_area_is_active--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
223
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
224 /* Restore the original active window and show point in it. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
225 active_window = calling_window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
226 restore_calling_window ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
227 display_cursor_at_point (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
228 fflush (stdout);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
229
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
230 /* Get the value of the line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
231 line = echo_area_after_read ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
232
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
233 /* If there is a previous loop waiting for us, restore it now. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
234 if (echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
235 pop_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
236
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
237 /* Return the results to the caller. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
238 return (line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
239 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
240
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
241 /* (re) Initialize the echo area node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
242 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
243 echo_area_initialize_node ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
244 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
245 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
246
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
247 for (i = input_line_end; i < sizeof (input_line); i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
248 input_line[i] = ' ';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
249
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
250 input_line[i - 1] = '\n';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
251 window_set_node_of_window (the_echo_area, &input_line_node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
252 input_line[input_line_end] = '\n';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
253 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
254
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
255 /* Prepare to read characters in the echo area. This can initialize the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
256 echo area node, but its primary purpose is to side effect the input
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
257 line buffer contents. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
258 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
259 echo_area_prep_read ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
260 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
261 if (the_echo_area->node != &input_line_node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
262 echo_area_initialize_node ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
263
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
264 the_echo_area->point = input_line_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
265 input_line[input_line_end] = '\n';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
266 display_update_one_window (the_echo_area);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
267 display_cursor_at_point (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
268 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
269
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
270
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
271 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
272 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
273 /* Echo Area Movement Commands */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
274 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
275 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
276
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
277 DECLARE_INFO_COMMAND (ea_forward, "Move forward a character")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
278 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
279 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
280 ea_backward (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
281 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
282 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
283 input_line_point += count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
284 if (input_line_point > input_line_end)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
285 input_line_point = input_line_end;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
286 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
287 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
288
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
289 DECLARE_INFO_COMMAND (ea_backward, "Move backward a character")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
290 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
291 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
292 ea_forward (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
293 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
294 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
295 input_line_point -= count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
296 if (input_line_point < input_line_beg)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
297 input_line_point = input_line_beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
298 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
299 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
300
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
301 DECLARE_INFO_COMMAND (ea_beg_of_line, "Move to the start of this line")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
302 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
303 input_line_point = input_line_beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
304 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
305
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
306 DECLARE_INFO_COMMAND (ea_end_of_line, "Move to the end of this line")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
307 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
308 input_line_point = input_line_end;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
309 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
310
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
311 #define alphabetic(c) (islower (c) || isupper (c) || isdigit (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
312
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
313 /* Move forward a word in the input line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
314 DECLARE_INFO_COMMAND (ea_forward_word, "Move forward a word")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
315 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
316 int c;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
317
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
318 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
319 ea_backward_word (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
320 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
321 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
322 while (count--)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
323 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
324 if (input_line_point == input_line_end)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
325 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
326
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
327 /* If we are not in a word, move forward until we are in one.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
328 Then, move forward until we hit a non-alphabetic character. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
329 c = input_line[input_line_point];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
330
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
331 if (!alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
332 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
333 while (++input_line_point < input_line_end)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
334 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
335 c = input_line[input_line_point];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
336 if (alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
337 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
338 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
339 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
340
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
341 if (input_line_point == input_line_end)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
342 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
343
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
344 while (++input_line_point < input_line_end)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
345 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
346 c = input_line[input_line_point];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
347 if (!alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
348 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
349 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
350 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
351 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
352 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
353
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
354 DECLARE_INFO_COMMAND (ea_backward_word, "Move backward a word")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
355 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
356 int c;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
357
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
358 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
359 ea_forward_word (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
360 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
361 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
362 while (count--)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
363 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
364 if (input_line_point == input_line_beg)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
365 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
366
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
367 /* Like ea_forward_word (), except that we look at the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
368 characters just before point. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
369
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
370 c = input_line[input_line_point - 1];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
371
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
372 if (!alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
373 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
374 while (--input_line_point)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
375 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
376 c = input_line[input_line_point - 1];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
377 if (alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
378 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
379 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
380 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
381
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
382 while (input_line_point != input_line_beg)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
383 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
384 c = input_line[input_line_point - 1];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
385 if (!alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
386 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
387 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
388 --input_line_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
389 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
390 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
391 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
392 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
393
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
394 DECLARE_INFO_COMMAND (ea_delete, "Delete the character under the cursor")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
395 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
396 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
397
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
398 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
399 ea_rubout (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
400 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
401 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
402 if (input_line_point == input_line_end)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
403 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
404
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
405 if (info_explicit_arg || count > 1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
406 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
407 int orig_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
408
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
409 orig_point = input_line_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
410 ea_forward (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
411 ea_kill_text (orig_point, input_line_point);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
412 input_line_point = orig_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
413 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
414 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
415 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
416 for (i = input_line_point; i < input_line_end; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
417 input_line[i] = input_line[i + 1];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
418
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
419 input_line_end--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
420 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
421 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
422 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
423
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
424 DECLARE_INFO_COMMAND (ea_rubout, "Delete the character behind the cursor")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
425 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
426 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
427 ea_delete (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
428 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
429 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
430 int start;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
431
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
432 if (input_line_point == input_line_beg)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
433 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
434
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
435 start = input_line_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
436 ea_backward (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
437
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
438 if (info_explicit_arg || count > 1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
439 ea_kill_text (start, input_line_point);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
440 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
441 ea_delete (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
442 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
443 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
444
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
445 DECLARE_INFO_COMMAND (ea_abort, "Cancel or quit operation")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
446 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
447 /* If any text, just discard it, and restore the calling window's node.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
448 If no text, quit. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
449 if (input_line_end != input_line_beg)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
450 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
451 terminal_ring_bell ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
452 input_line_end = input_line_point = input_line_beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
453 if (calling_window->node != calling_window_node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
454 restore_calling_window ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
455 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
456 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
457 info_aborted_echo_area = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
458 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
459
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
460 DECLARE_INFO_COMMAND (ea_newline, "Accept (or force completion of) this line")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
461 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
462 /* Stub does nothing. Simply here to see if it has been executed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
463 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
464
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
465 DECLARE_INFO_COMMAND (ea_quoted_insert, "Insert next character verbatim")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
466 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
467 unsigned char character;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
468
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
469 character = info_get_another_input_char ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
470 ea_insert (window, count, character);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
471 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
472
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
473 DECLARE_INFO_COMMAND (ea_insert, "Insert this character")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
474 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
475 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
476
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
477 if ((input_line_end + 1) == EA_MAX_INPUT)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
478 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
479 terminal_ring_bell ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
480 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
481 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
482
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
483 for (i = input_line_end + 1; i != input_line_point; i--)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
484 input_line[i] = input_line[i - 1];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
485
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
486 input_line[input_line_point] = key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
487 input_line_point++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
488 input_line_end++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
489 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
490
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
491 DECLARE_INFO_COMMAND (ea_tab_insert, "Insert a TAB character")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
492 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
493 ea_insert (window, count, '\t');
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
494 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
495
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
496 /* Transpose the characters at point. If point is at the end of the line,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
497 then transpose the characters before point. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
498 DECLARE_INFO_COMMAND (ea_transpose_chars, "Transpose characters at point")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
499 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
500 /* Handle conditions that would make it impossible to transpose
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
501 characters. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
502 if (!count || !input_line_point || (input_line_end - input_line_beg) < 2)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
503 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
504
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
505 while (count)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
506 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
507 int t;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
508 if (input_line_point == input_line_end)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
509 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
510 t = input_line[input_line_point - 1];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
511
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
512 input_line[input_line_point - 1] = input_line[input_line_point - 2];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
513 input_line[input_line_point - 2] = t;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
514 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
515 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
516 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
517 t = input_line[input_line_point];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
518
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
519 input_line[input_line_point] = input_line[input_line_point - 1];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
520 input_line[input_line_point - 1] = t;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
521
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
522 if (count < 0 && input_line_point != input_line_beg)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
523 input_line_point--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
524 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
525 input_line_point++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
526 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
527
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
528 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
529 count++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
530 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
531 count--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
532 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
533 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
534
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
535 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
536 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
537 /* Echo Area Killing and Yanking */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
538 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
539 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
540
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
541 static char **kill_ring = (char **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
542 static int kill_ring_index = 0; /* Number of kills appearing in KILL_RING. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
543 static int kill_ring_slots = 0; /* Number of slots allocated to KILL_RING. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
544 static int kill_ring_loc = 0; /* Location of current yank pointer. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
545
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
546 /* The largest number of kills that we remember at one time. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
547 static int max_retained_kills = 15;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
548
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
549 DECLARE_INFO_COMMAND (ea_yank, "Yank back the contents of the last kill")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
550 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
551 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
552 register char *text;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
553
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
554 if (!kill_ring_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
555 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
556 inform_in_echo_area ("Kill ring is empty");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
557 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
558 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
559
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
560 text = kill_ring[kill_ring_loc];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
561
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
562 for (i = 0; text[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
563 ea_insert (window, 1, text[i]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
564 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
565
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
566 /* If the last command was yank, or yank_pop, and the text just before
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
567 point is identical to the current kill item, then delete that text
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
568 from the line, rotate the index down, and yank back some other text. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
569 DECLARE_INFO_COMMAND (ea_yank_pop, "Yank back a previous kill")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
570 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
571 register int len;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
572
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
573 if (((ea_last_executed_command != ea_yank) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
574 (ea_last_executed_command != ea_yank_pop)) ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
575 (kill_ring_index == 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
576 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
577
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
578 len = strlen (kill_ring[kill_ring_loc]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
579
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
580 /* Delete the last yanked item from the line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
581 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
582 register int i, counter;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
583
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
584 counter = input_line_end - input_line_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
585
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
586 for (i = input_line_point - len; counter; i++, counter--)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
587 input_line[i] = input_line[i + len];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
588
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
589 input_line_end -= len;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
590 input_line_point -= len;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
591 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
592
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
593 /* Get a previous kill, and yank that. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
594 kill_ring_loc--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
595 if (kill_ring_loc < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
596 kill_ring_loc = kill_ring_index - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
597
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
598 ea_yank (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
599 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
600
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
601 /* Delete the text from point to end of line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
602 DECLARE_INFO_COMMAND (ea_kill_line, "Kill to the end of the line")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
603 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
604 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
605 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
606 ea_kill_text (input_line_point, input_line_beg);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
607 input_line_point = input_line_beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
608 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
609 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
610 ea_kill_text (input_line_point, input_line_end);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
611 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
612
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
613 /* Delete the text from point to beg of line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
614 DECLARE_INFO_COMMAND (ea_backward_kill_line,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
615 "Kill to the beginning of the line")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
616 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
617 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
618 ea_kill_text (input_line_point, input_line_end);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
619 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
620 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
621 ea_kill_text (input_line_point, input_line_beg);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
622 input_line_point = input_line_beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
623 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
624 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
625
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
626 /* Delete from point to the end of the current word. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
627 DECLARE_INFO_COMMAND (ea_kill_word, "Kill the word following the cursor")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
628 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
629 int orig_point = input_line_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
630
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
631 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
632 ea_backward_kill_word (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
633 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
634 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
635 ea_forward_word (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
636
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
637 if (input_line_point != orig_point)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
638 ea_kill_text (orig_point, input_line_point);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
639
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
640 input_line_point = orig_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
641 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
642 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
643
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
644 /* Delete from point to the start of the current word. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
645 DECLARE_INFO_COMMAND (ea_backward_kill_word,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
646 "Kill the word preceding the cursor")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
647 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
648 int orig_point = input_line_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
649
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
650 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
651 ea_kill_word (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
652 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
653 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
654 ea_backward_word (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
655
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
656 if (input_line_point != orig_point)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
657 ea_kill_text (orig_point, input_line_point);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
658 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
659 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
660
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
661 /* The way to kill something. This appends or prepends to the last
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
662 kill, if the last command was a kill command. If FROM is less
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
663 than TO, then the killed text is appended to the most recent kill,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
664 otherwise it is prepended. If the last command was not a kill command,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
665 then a new slot is made for this kill. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
666 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
667 ea_kill_text (from, to)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
668 int from, to;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
669 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
670 register int i, counter, distance;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
671 int killing_backwards, slot;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
672 char *killed_text;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
673
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
674 killing_backwards = (from > to);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
675
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
676 /* If killing backwards, reverse the values of FROM and TO. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
677 if (killing_backwards)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
678 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
679 int temp = from;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
680 from = to;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
681 to = temp;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
682 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
683
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
684 /* Remember the text that we are about to delete. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
685 distance = to - from;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
686 killed_text = (char *)xmalloc (1 + distance);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
687 strncpy (killed_text, &input_line[from], distance);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
688 killed_text[distance] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
689
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
690 /* Actually delete the text from the line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
691 counter = input_line_end - to;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
692
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
693 for (i = from; counter; i++, counter--)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
694 input_line[i] = input_line[i + distance];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
695
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
696 input_line_end -= distance;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
697
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
698 /* If the last command was a kill, append or prepend the killed text to
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
699 the last command's killed text. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
700 if (echo_area_last_command_was_kill)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
701 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
702 char *old, *new;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
703
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
704 slot = kill_ring_loc;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
705 old = kill_ring[slot];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
706 new = (char *)xmalloc (1 + strlen (old) + strlen (killed_text));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
707
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
708 if (killing_backwards)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
709 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
710 /* Prepend TEXT to current kill. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
711 strcpy (new, killed_text);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
712 strcat (new, old);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
713 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
714 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
715 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
716 /* Append TEXT to current kill. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
717 strcpy (new, old);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
718 strcat (new, killed_text);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
719 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
720
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
721 free (old);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
722 free (killed_text);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
723 kill_ring[slot] = new;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
724 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
725 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
726 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
727 /* Try to store the kill in a new slot, unless that would cause there
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
728 to be too many remembered kills. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
729 slot = kill_ring_index;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
730
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
731 if (slot == max_retained_kills)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
732 slot = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
733
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
734 if (slot + 1 > kill_ring_slots)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
735 kill_ring = (char **) xrealloc
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
736 (kill_ring,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
737 (kill_ring_slots += max_retained_kills) * sizeof (char *));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
738
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
739 if (slot != kill_ring_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
740 free (kill_ring[slot]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
741 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
742 kill_ring_index++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
743
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
744 kill_ring[slot] = killed_text;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
745
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
746 kill_ring_loc = slot;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
747 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
748
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
749 /* Notice that the last command was a kill. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
750 echo_area_last_command_was_kill++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
751 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
752
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
753 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
754 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
755 /* Echo Area Completion */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
756 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
757 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
758
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
759 /* Pointer to an array of REFERENCE to complete over. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
760 static REFERENCE **echo_area_completion_items = (REFERENCE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
761
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
762 /* Sorted array of REFERENCE * which is the possible completions found in
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
763 the variable echo_area_completion_items. If there is only one element,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
764 it is the only possible completion. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
765 static REFERENCE **completions_found = (REFERENCE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
766 static int completions_found_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
767 static int completions_found_slots = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
768
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
769 /* The lowest common denominator found while completing. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
770 static REFERENCE *LCD_completion;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
771
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
772 /* Internal functions used by the user calls. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
773 static void build_completions (), completions_must_be_rebuilt ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
774
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
775 /* Variable which holds the output of completions. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
776 static NODE *possible_completions_output_node = (NODE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
777
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
778 static char *compwin_name = "*Completions*";
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
779
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
780 /* Return non-zero if WINDOW is a window used for completions output. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
781 static int
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
782 completions_window_p (window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
783 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
784 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
785 int result = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
786
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
787 if (internal_info_node_p (window->node) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
788 (strcmp (window->node->nodename, compwin_name) == 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
789 result = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
790
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
791 return (result);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
792 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
793
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
794 /* Workhorse for completion readers. If FORCE is non-zero, the user cannot
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
795 exit unless the line read completes, or is empty. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
796 char *
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
797 info_read_completing_internal (window, prompt, completions, force)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
798 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
799 char *prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
800 REFERENCE **completions;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
801 int force;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
802 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
803 char *line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
804
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
805 /* If the echo area is already active, remember the current state. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
806 if (echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
807 push_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
808
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
809 echo_area_must_complete_p = force;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
810
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
811 /* Initialize our local variables. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
812 initialize_input_line (prompt);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
813
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
814 /* Initialize the echo area for the first (but maybe not the last) time. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
815 echo_area_initialize_node ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
816
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
817 /* Save away the original node of this window, and the window itself,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
818 so echo area commands can temporarily use this window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
819 remember_calling_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
820
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
821 /* Save away the list of items to complete over. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
822 echo_area_completion_items = completions;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
823 completions_must_be_rebuilt ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
824
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
825 active_window = the_echo_area;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
826 echo_area_is_active++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
827
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
828 /* Read characters in the echo area. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
829 while (1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
830 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
831 info_read_and_dispatch ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
832
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
833 line = echo_area_after_read ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
834
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
835 /* Force the completion to take place if the user hasn't accepted
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
836 a default or aborted, and if FORCE is active. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
837 if (force && line && *line && completions)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
838 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
839 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
840
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
841 build_completions ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
842
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
843 /* If there is only one completion, then make the line be that
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
844 completion. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
845 if (completions_found_index == 1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
846 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
847 free (line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
848 line = savestring (completions_found[0]->label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
849 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
850 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
851
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
852 /* If one of the completions matches exactly, then that is okay, so
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
853 return the current line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
854 for (i = 0; i < completions_found_index; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
855 if (stricmp (completions_found[i]->label, line) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
856 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
857 free (line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
858 line = savestring (completions_found[i]->label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
859 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
860 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
861
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
862 /* If no match, go back and try again. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
863 if (i == completions_found_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
864 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
865 inform_in_echo_area ("Not complete");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
866 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
867 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
868 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
869 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
870 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
871 echo_area_is_active--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
872
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
873 /* Restore the original active window and show point in it. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
874 active_window = calling_window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
875 restore_calling_window ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
876 display_cursor_at_point (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
877 fflush (stdout);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
878
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
879 echo_area_completion_items = (REFERENCE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
880 completions_must_be_rebuilt ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
881
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
882 /* If there is a previous loop waiting for us, restore it now. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
883 if (echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
884 pop_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
885
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
886 return (line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
887 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
888
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
889 /* Read a line in the echo area with completion over COMPLETIONS. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
890 char *
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
891 info_read_completing_in_echo_area (window, prompt, completions)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
892 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
893 char *prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
894 REFERENCE **completions;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
895 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
896 return (info_read_completing_internal (window, prompt, completions, 1));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
897 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
898
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
899 /* Read a line in the echo area allowing completion over COMPLETIONS, but
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
900 not requiring it. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
901 char *
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
902 info_read_maybe_completing (window, prompt, completions)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
903 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
904 char *prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
905 REFERENCE **completions;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
906 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
907 return (info_read_completing_internal (window, prompt, completions, 0));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
908 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
909
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
910 DECLARE_INFO_COMMAND (ea_possible_completions, "List possible completions")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
911 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
912 if (!echo_area_completion_items)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
913 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
914 ea_insert (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
915 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
916 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
917
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
918 build_completions ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
919
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
920 if (!completions_found_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
921 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
922 terminal_ring_bell ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
923 inform_in_echo_area ("No completions");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
924 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
925 else if ((completions_found_index == 1) && (key != '?'))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
926 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
927 inform_in_echo_area ("Sole completion");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
928 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
929 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
930 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
931 register int i, l;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
932 int limit, count, max_label = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
933
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
934 initialize_message_buffer ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
935 printf_to_message_buffer
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
936 ("There %s %d ", completions_found_index == 1 ? "is" : "are",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
937 completions_found_index);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
938 printf_to_message_buffer
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
939 ("completion%s:\n", completions_found_index == 1 ? "" : "s");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
940
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
941 /* Find the maximum length of a label. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
942 for (i = 0; i < completions_found_index; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
943 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
944 int len = strlen (completions_found[i]->label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
945 if (len > max_label)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
946 max_label = len;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
947 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
948
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
949 max_label += 4;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
950
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
951 /* Find out how many columns we should print in. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
952 limit = calling_window->width / max_label;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
953 if (limit != 1 && (limit * max_label == calling_window->width))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
954 limit--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
955
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
956 /* Avoid a possible floating exception. If max_label > width then
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
957 the limit will be 0 and a divide-by-zero fault will result. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
958 if (limit == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
959 limit = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
960
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
961 /* How many iterations of the printing loop? */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
962 count = (completions_found_index + (limit - 1)) / limit;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
963
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
964 /* Watch out for special case. If the number of completions is less
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
965 than LIMIT, then just do the inner printing loop. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
966 if (completions_found_index < limit)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
967 count = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
968
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
969 /* Print the sorted items, up-and-down alphabetically. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
970 for (i = 0; i < count; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
971 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
972 register int j;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
973
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
974 for (j = 0, l = i; j < limit; j++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
975 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
976 if (l >= completions_found_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
977 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
978 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
979 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
980 char *label;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
981 int printed_length, k;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
982
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
983 label = completions_found[l]->label;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
984 printed_length = strlen (label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
985 printf_to_message_buffer ("%s", label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
986
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
987 if (j + 1 < limit)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
988 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
989 for (k = 0; k < max_label - printed_length; k++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
990 printf_to_message_buffer (" ");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
991 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
992 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
993 l += count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
994 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
995 printf_to_message_buffer ("\n");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
996 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
997
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
998 /* Make a new node to hold onto possible completions. Don't destroy
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
999 dangling pointers. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1000 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1001 NODE *temp;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1002
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1003 temp = message_buffer_to_node ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1004 add_gcable_pointer (temp->contents);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1005 name_internal_node (temp, compwin_name);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1006 possible_completions_output_node = temp;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1007 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1008
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1009 /* Find a suitable window for displaying the completions output.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1010 First choice is an existing window showing completions output.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1011 If there is only one window, and it is large, make another
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1012 (smaller) window, and use that one. Otherwise, use the caller's
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1013 window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1014 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1015 WINDOW *compwin;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1016
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1017 compwin = get_internal_info_window (compwin_name);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1018
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1019 if (!compwin)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1020 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1021 /* If we can split the window to display most of the completion
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1022 items, then do so. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1023 if (calling_window->height > (count * 2))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1024 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1025 int start, end, pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1026
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1027 active_window = calling_window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1028
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1029 /* Perhaps we can scroll this window on redisplay. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1030 start = calling_window->first_row;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1031 pagetop = calling_window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1032
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1033 compwin =
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1034 window_make_window (possible_completions_output_node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1035 active_window = the_echo_area;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1036 window_change_window_height
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1037 (compwin, -(compwin->height - (count + 2)));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1038
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1039 window_adjust_pagetop (calling_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1040 remember_calling_window (calling_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1041
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1042 #if defined (SPLIT_BEFORE_ACTIVE)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1043 /* If the pagetop hasn't changed, scrolling the calling
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1044 window is a reasonable thing to do. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1045 if (pagetop == calling_window->pagetop)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1046 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1047 end = start + calling_window->height;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1048 display_scroll_display
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1049 (start, end, calling_window->prev->height + 1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1050 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1051 #else /* !SPLIT_BEFORE_ACTIVE */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1052 /* If the pagetop has changed, set the new pagetop here. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1053 if (pagetop != calling_window->pagetop)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1054 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1055 int newtop = calling_window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1056 calling_window->pagetop = pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1057 set_window_pagetop (calling_window, newtop);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1058 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1059 #endif /* !SPLIT_BEFORE_ACTIVE */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1060
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1061 echo_area_completions_window = compwin;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1062 remember_window_and_node (compwin, compwin->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1063 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1064 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1065 compwin = calling_window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1066 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1067
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1068 if (compwin->node != possible_completions_output_node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1069 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1070 window_set_node_of_window
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1071 (compwin, possible_completions_output_node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1072 remember_window_and_node (compwin, compwin->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1073 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1074
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1075 display_update_display (windows);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1076 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1077 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1078 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1079
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1080 DECLARE_INFO_COMMAND (ea_complete, "Insert completion")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1081 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1082 if (!echo_area_completion_items)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1083 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1084 ea_insert (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1085 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1086 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1087
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1088 /* If KEY is SPC, and we are not forcing completion to take place, simply
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1089 insert the key. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1090 if (!echo_area_must_complete_p && key == SPC)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1091 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1092 ea_insert (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1093 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1094 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1095
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1096 if (ea_last_executed_command == ea_complete)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1097 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1098 /* If the keypress is a SPC character, and we have already tried
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1099 completing once, and there are several completions, then check
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1100 the batch of completions to see if any continue with a space.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1101 If there are some, insert the space character and continue. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1102 if (key == SPC && completions_found_index > 1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1103 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1104 register int i, offset;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1105
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1106 offset = input_line_end - input_line_beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1107
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1108 for (i = 0; i < completions_found_index; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1109 if (completions_found[i]->label[offset] == ' ')
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1110 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1111
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1112 if (completions_found[i])
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1113 ea_insert (window, 1, ' ');
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1114 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1115 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1116 ea_possible_completions (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1117 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1118 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1119 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1120 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1121 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1122 ea_possible_completions (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1123 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1124 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1125 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1126
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1127 input_line_point = input_line_end;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1128 build_completions ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1129
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1130 if (!completions_found_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1131 terminal_ring_bell ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1132 else if (LCD_completion->label[0] == '\0')
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1133 ea_possible_completions (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1134 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1135 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1136 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1137 input_line_point = input_line_end = input_line_beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1138 for (i = 0; LCD_completion->label[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1139 ea_insert (window, 1, LCD_completion->label[i]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1140 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1141 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1142
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1143 /* Utility REFERENCE used to store possible LCD. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1144 static REFERENCE LCD_reference = { (char *)NULL, (char *)NULL, (char *)NULL };
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1145
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1146 static void remove_completion_duplicates ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1147
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1148 /* Variables which remember the state of the most recent call
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1149 to build_completions (). */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1150 static char *last_completion_request = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1151 static REFERENCE **last_completion_items = (REFERENCE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1152
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1153 /* How to tell the completion builder to reset internal state. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1154 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1155 completions_must_be_rebuilt ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1156 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1157 maybe_free (last_completion_request);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1158 last_completion_request = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1159 last_completion_items = (REFERENCE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1160 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1161
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1162 /* Build a list of possible completions from echo_area_completion_items,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1163 and the contents of input_line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1164 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1165 build_completions ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1166 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1167 register int i, len;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1168 register REFERENCE *entry;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1169 char *request;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1170 int informed_of_lengthy_job = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1172 /* If there are no items to complete over, exit immediately. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1173 if (!echo_area_completion_items)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1174 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1175 completions_found_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1176 LCD_completion = (REFERENCE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1177 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1178 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1179
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1180 /* Check to see if this call to build completions is the same as the last
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1181 call to build completions. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1182 len = input_line_end - input_line_beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1183 request = (char *)xmalloc (1 + len);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1184 strncpy (request, &input_line[input_line_beg], len);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1185 request[len] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1186
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1187 if (last_completion_request && last_completion_items &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1188 last_completion_items == echo_area_completion_items &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1189 (strcmp (last_completion_request, request) == 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1190 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1191 free (request);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1192 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1193 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1194
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1195 maybe_free (last_completion_request);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1196 last_completion_request = request;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1197 last_completion_items = echo_area_completion_items;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1198
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1199 /* Always start at the beginning of the list. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1200 completions_found_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1201 LCD_completion = (REFERENCE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1202
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1203 for (i = 0; entry = echo_area_completion_items[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1204 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1205 if (strnicmp (request, entry->label, len) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1206 add_pointer_to_array (entry, completions_found_index,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1207 completions_found, completions_found_slots,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1208 20, REFERENCE *);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1209
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1210 if (!informed_of_lengthy_job && completions_found_index > 100)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1211 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1212 informed_of_lengthy_job = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1213 window_message_in_echo_area ("Building completions...");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1214 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1215 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1216
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1217 if (!completions_found_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1218 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1219
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1220 /* Sort and prune duplicate entries from the completions array. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1221 remove_completion_duplicates ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1222
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1223 /* If there is only one completion, just return that. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1224 if (completions_found_index == 1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1225 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1226 LCD_completion = completions_found[0];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1227 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1228 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1229
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1230 /* Find the least common denominator. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1231 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1232 long shortest = 100000;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1233
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1234 for (i = 1; i < completions_found_index; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1235 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1236 register int j;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1237 int c1, c2;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1238
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1239 for (j = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1240 (c1 = info_tolower (completions_found[i - 1]->label[j])) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1241 (c2 = info_tolower (completions_found[i]->label[j]));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1242 j++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1243 if (c1 != c2)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1244 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1245
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1246 if (shortest > j)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1247 shortest = j;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1248 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1249
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1250 maybe_free (LCD_reference.label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1251 LCD_reference.label = (char *)xmalloc (1 + shortest);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1252 strncpy (LCD_reference.label, completions_found[0]->label, shortest);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1253 LCD_reference.label[shortest] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1254 LCD_completion = &LCD_reference;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1255 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1256
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1257 if (informed_of_lengthy_job)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1258 echo_area_initialize_node ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1259 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1260
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1261 /* Function called by qsort. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1262 static int
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1263 compare_references (entry1, entry2)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1264 REFERENCE **entry1, **entry2;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1265 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1266 return (stricmp ((*entry1)->label, (*entry2)->label));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1267 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1268
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1269 /* Prune duplicate entries from COMPLETIONS_FOUND. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1270 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1271 remove_completion_duplicates ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1272 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1273 register int i, j;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1274 REFERENCE **temp;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1275 int newlen;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1276
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1277 if (!completions_found_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1278 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1279
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1280 /* Sort the items. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1281 qsort (completions_found, completions_found_index, sizeof (REFERENCE *),
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1282 compare_references);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1283
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1284 for (i = 0, newlen = 1; i < completions_found_index - 1; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1285 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1286 if (strcmp (completions_found[i]->label,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1287 completions_found[i + 1]->label) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1288 completions_found[i] = (REFERENCE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1289 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1290 newlen++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1291 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1292
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1293 /* We have marked all the dead slots. It is faster to copy the live slots
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1294 twice than to prune the dead slots one by one. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1295 temp = (REFERENCE **)xmalloc ((1 + newlen) * sizeof (REFERENCE *));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1296 for (i = 0, j = 0; i < completions_found_index; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1297 if (completions_found[i])
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1298 temp[j++] = completions_found[i];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1299
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1300 for (i = 0; i < newlen; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1301 completions_found[i] = temp[i];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1302
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1303 completions_found[i] = (REFERENCE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1304 completions_found_index = newlen;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1305 free (temp);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1306 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1307
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1308 /* Scroll the "other" window. If there is a window showing completions, scroll
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1309 that one, otherwise scroll the window which was active on entering the read
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1310 function. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1311 DECLARE_INFO_COMMAND (ea_scroll_completions_window, "Scroll the completions window")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1312 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1313 WINDOW *compwin;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1314 int old_pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1315
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1316 compwin = get_internal_info_window (compwin_name);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1317
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1318 if (!compwin)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1319 compwin = calling_window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1320
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1321 old_pagetop = compwin->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1322
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1323 /* Let info_scroll_forward () do the work, and print any messages that
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1324 need to be displayed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1325 info_scroll_forward (compwin, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1326 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1327
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1328 /* Function which gets called when an Info window is deleted while the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1329 echo area is active. WINDOW is the window which has just been deleted. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1330 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1331 echo_area_inform_of_deleted_window (window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1332 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1333 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1334 /* If this is the calling_window, forget what we remembered about it. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1335 if (window == calling_window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1336 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1337 if (active_window != the_echo_area)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1338 remember_calling_window (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1339 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1340 remember_calling_window (windows);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1341 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1342
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1343 /* If this window was the echo_area_completions_window, then notice that
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1344 the window has been deleted. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1345 if (window == echo_area_completions_window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1346 echo_area_completions_window = (WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1347 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1348
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1349 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1350 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1351 /* Pushing and Popping the Echo Area */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1352 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1353 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1354
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1355 /* Push and Pop the echo area. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1356 typedef struct {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1357 char *line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1358 char *prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1359 REFERENCE **comp_items;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1360 int point, beg, end;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1361 int must_complete;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1362 NODE node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1363 WINDOW *compwin;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1364 } PUSHED_EA;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1365
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1366 static PUSHED_EA **pushed_echo_areas = (PUSHED_EA **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1367 static int pushed_echo_areas_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1368 static int pushed_echo_areas_slots = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1369
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1370 /* Pushing the echo_area has a side effect of zeroing the completion_items. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1371 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1372 push_echo_area ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1373 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1374 PUSHED_EA *pushed;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1375
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1376 pushed = (PUSHED_EA *)xmalloc (sizeof (PUSHED_EA));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1377 pushed->line = savestring (input_line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1378 pushed->prompt = input_line_prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1379 pushed->point = input_line_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1380 pushed->beg = input_line_beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1381 pushed->end = input_line_end;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1382 pushed->node = input_line_node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1383 pushed->comp_items = echo_area_completion_items;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1384 pushed->must_complete = echo_area_must_complete_p;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1385 pushed->compwin = echo_area_completions_window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1386
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1387 add_pointer_to_array (pushed, pushed_echo_areas_index, pushed_echo_areas,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1388 pushed_echo_areas_slots, 4, PUSHED_EA *);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1389
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1390 echo_area_completion_items = (REFERENCE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1391 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1392
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1393 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1394 pop_echo_area ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1395 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1396 PUSHED_EA *popped;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1397
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1398 popped = pushed_echo_areas[--pushed_echo_areas_index];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1399
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1400 strcpy (input_line, popped->line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1401 free (popped->line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1402 input_line_prompt = popped->prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1403 input_line_point = popped->point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1404 input_line_beg = popped->beg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1405 input_line_end = popped->end;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1406 input_line_node = popped->node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1407 echo_area_completion_items = popped->comp_items;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1408 echo_area_must_complete_p = popped->must_complete;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1409 echo_area_completions_window = popped->compwin;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1410 completions_must_be_rebuilt ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1411
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1412 /* If the completion window no longer exists, forget about it. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1413 if (echo_area_completions_window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1414 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1415 register WINDOW *win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1416
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1417 for (win = windows; win; win = win->next)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1418 if (echo_area_completions_window == win)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1419 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1420
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1421 /* If the window wasn't found, then it has already been deleted. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1422 if (!win)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1423 echo_area_completions_window = (WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1424 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1425
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1426 free (popped);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1427 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1428
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1429 static int
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1430 echo_area_stack_depth ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1431 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1432 return (pushed_echo_areas_index);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1433 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1434
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1435 /* Returns non-zero if any of the prior stacked calls to read in the echo
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1436 area produced a completions window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1437 static int
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1438 echo_area_stack_contains_completions_p ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1439 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1440 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1441
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1442 for (i = 0; i < pushed_echo_areas_index; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1443 if (pushed_echo_areas[i]->compwin)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1444 return (1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1445
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1446 return (0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1447 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1448
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1449 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1450 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1451 /* Error Messages While Reading in Echo Area */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1452 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1453 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1454
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1455 #if defined (HAVE_SYS_TIME_H)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1456 # include <sys/time.h>
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1457 # define HAVE_STRUCT_TIMEVAL
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1458 #endif /* HAVE_SYS_TIME_H */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1459
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1460 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1461 pause_or_input ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1462 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1463 #if defined (FD_SET)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1464 struct timeval timer;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1465 fd_set readfds;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1466 int ready;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1467
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1468 FD_ZERO (&readfds);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1469 FD_SET (fileno (stdin), &readfds);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1470 timer.tv_sec = 2;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1471 timer.tv_usec = 750;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1472 ready = select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1473 #endif /* FD_SET */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1474 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1475
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1476 /* Print MESSAGE right after the end of the current line, and wait
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1477 for input or 2.75 seconds, whichever comes first. Then flush the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1478 informational message that was printed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1479 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1480 inform_in_echo_area (message)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1481 char *message;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1482 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1483 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1484 char *text;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1485
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1486 text = savestring (message);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1487 for (i = 0; text[i] && text[i] != '\n'; i++);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1488 text[i] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1489
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1490 echo_area_initialize_node ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1491 sprintf (&input_line[input_line_end], "%s[%s]\n",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1492 echo_area_is_active ? " ": "", text);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1493 free (text);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1494 the_echo_area->point = input_line_point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1495 display_update_one_window (the_echo_area);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1496 display_cursor_at_point (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1497 fflush (stdout);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1498 pause_or_input ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1499 echo_area_initialize_node ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1500 }