updated on Thu Jan 26 00:18:00 UTC 2012
[aur-mirror.git] / readline-vi-mode-changed-hook / vi_mode_changed_hook.patch
blobea6bb37d129a6aedf9246b098576d0fd8ca4d807
1 +++ bind.c 2010-10-28 23:09:12.788260925 +0200
2 @@ -1508,6 +1508,9 @@
3 static int sv_histsize PARAMS((const char *));
4 static int sv_isrchterm PARAMS((const char *));
5 static int sv_keymap PARAMS((const char *));
6 +static int sv_vi_insert_prompt PARAMS((const char *));
7 +static int sv_vi_command_prompt PARAMS((const char *));
8 +static int sv_vi_mode_changed_bin PARAMS((const char *));
10 static const struct {
11 const char * const name;
12 @@ -1522,6 +1525,9 @@
13 { "history-size", V_INT, sv_histsize },
14 { "isearch-terminators", V_STRING, sv_isrchterm },
15 { "keymap", V_STRING, sv_keymap },
16 + { "vi-insert-prompt", V_STRING, sv_vi_insert_prompt },
17 + { "vi-command-prompt", V_STRING, sv_vi_command_prompt },
18 + { "vi-mode-changed-bin", V_STRING, sv_vi_mode_changed_bin },
19 { (char *)NULL, 0 }
22 @@ -1694,6 +1700,30 @@
25 static int
26 +sv_vi_insert_prompt (value)
27 + const char *value;
29 + _rl_set_vi_insert_prompt (value);
30 + return 0;
33 +static int
34 +sv_vi_command_prompt (value)
35 + const char *value;
37 + _rl_set_vi_command_prompt (value);
38 + return 0;
41 +static int
42 +sv_vi_mode_changed_bin (value)
43 + const char *value;
45 + _rl_set_vi_mode_changed_bin (value);
46 + return 0;
49 +static int
50 sv_bell_style (value)
51 const char *value;
53 +++ rlprivate.h 2010-10-28 23:09:45.788262324 +0200
54 @@ -361,6 +361,9 @@
55 extern int (_rl_digit_value) PARAMS((int));
57 /* vi_mode.c */
58 +extern void _rl_set_vi_insert_prompt PARAMS((const char *));
59 +extern void _rl_set_vi_command_prompt PARAMS((const char *));
60 +extern void _rl_set_vi_mode_changed_bin PARAMS((const char *));
61 extern void _rl_vi_initialize_line PARAMS((void));
62 extern void _rl_vi_reset_last PARAMS((void));
63 extern void _rl_vi_set_last PARAMS((int, int, int));
64 +++ vi_mode.c 2010-10-28 23:21:54.038261767 +0200
65 @@ -49,6 +49,8 @@
67 #include <stdio.h>
69 +#include <fcntl.h>
71 /* Some standard library routines. */
72 #include "rldefs.h"
73 #include "rlmbutil.h"
74 @@ -128,16 +130,121 @@
75 static int _rl_vi_callback_char_search PARAMS((_rl_callback_generic_arg *));
76 #endif
78 +#define _RL_PROMPT_INITIAL_SIZE 256
79 +#define _VI_MODE_PROMPT_FORMAT_SIZE 256
80 +#define _VI_MODE_PROMPT_SIZE _RL_PROMPT_INITIAL_SIZE + _VI_MODE_PROMPT_FORMAT_SIZE
81 +static char _rl_prompt_initial[_RL_PROMPT_INITIAL_SIZE] = "\0";
82 +static char *_rl_prompt_initial_last_line;
83 +static char _rl_vi_insert_prompt[_VI_MODE_PROMPT_FORMAT_SIZE] = "\0";
84 +static char _rl_vi_command_prompt[_VI_MODE_PROMPT_FORMAT_SIZE] = "\0";
85 +#define _VI_MODE_CHANGED_BIN_SIZE 256
86 +static char _rl_vi_mode_changed_bin[_VI_MODE_CHANGED_BIN_SIZE] = "\0";
88 +void _rl_set_vi_insert_prompt PARAMS((const char *));
89 +void _rl_set_vi_command_prompt PARAMS((const char *));
90 +void _rl_set_vi_mode_changed_bin PARAMS((const char *));
92 +static void vi_mode_changed_prompt PARAMS((void));
93 +static void vi_mode_changed_bin PARAMS((void));
94 +static void vi_mode_changed PARAMS((void));
96 +static char *
97 +safe_strncpy (dest, src, n)
98 + char *dest;
99 + const char *src;
100 + int n;
102 + if (src) {
103 + strncpy (dest, src, n);
104 + dest[n - 1] = '\0';
106 + else {
107 + dest[0] = '\0';
109 + return dest;
112 +static char *
113 +parse_prompt_format_escapes (src)
114 + char *src;
116 + char *r, *w, c, o;
117 + static char buf[4] = "000";
119 + r = src;
120 + w = r;
121 + while (*r) {
122 + c = *r;
123 + if (c == '\\') {
124 + r++;
125 + if (*r == '\\') {
126 + c = '\\';
128 + else if (*r == '0') {
129 + c = *r;
130 + buf[1] = *(r + 1);
131 + buf[2] = *(r + 2);
132 + o = strtol (buf, NULL, 8);
133 + if (o > 0) {
134 + r += 2;
135 + c = o;
139 + r++;
140 + if (c > 0) {
141 + *w = c;
142 + w++;
145 + *w = '\0';
146 + return src;
149 +void
150 +_rl_set_vi_insert_prompt (value)
151 + const char *value;
153 + safe_strncpy (_rl_vi_insert_prompt, value, _VI_MODE_PROMPT_FORMAT_SIZE);
154 + parse_prompt_format_escapes (_rl_vi_insert_prompt);
157 +void
158 +_rl_set_vi_command_prompt (value)
159 + const char *value;
161 + safe_strncpy (_rl_vi_command_prompt, value, _VI_MODE_PROMPT_FORMAT_SIZE);
162 + parse_prompt_format_escapes (_rl_vi_command_prompt);
165 +void
166 +_rl_set_vi_mode_changed_bin (value)
167 + const char *value;
169 + safe_strncpy (_rl_vi_mode_changed_bin, value, _VI_MODE_CHANGED_BIN_SIZE);
172 void
173 _rl_vi_initialize_line ()
175 register int i, n;
176 + char *p;
178 n = sizeof (vi_mark_chars) / sizeof (vi_mark_chars[0]);
179 for (i = 0; i < n; i++)
180 vi_mark_chars[i] = -1;
182 RL_UNSETSTATE(RL_STATE_VICMDONCE);
184 + safe_strncpy (_rl_prompt_initial, rl_prompt, _RL_PROMPT_INITIAL_SIZE);
185 + p = strrchr (_rl_prompt_initial, '\n');
186 + if (p) {
187 + p++;
189 + else {
190 + p = _rl_prompt_initial;
192 + _rl_prompt_initial_last_line = p;
195 void
196 @@ -655,6 +762,86 @@
198 /* Insertion mode stuff. */
200 +/* This is meant to be called after vi mode changes. */
201 +static void
202 +vi_mode_changed_prompt ()
204 + char *prompt, *p;
205 + char pattern[] = "{}";
206 + static char buf[_VI_MODE_PROMPT_SIZE];
207 + int i, j;
209 + if (VI_INSERT_MODE()) {
210 + prompt = _rl_vi_insert_prompt;
212 + else if (VI_COMMAND_MODE()) {
213 + prompt = _rl_vi_command_prompt;
215 + if (strlen (prompt)) {
216 + i = _rl_prompt_initial_last_line - _rl_prompt_initial;
217 + memcpy (buf, _rl_prompt_initial, i);
218 + buf[i] = '\0';
219 + p = strstr (prompt, pattern);
220 + if (p) {
221 + j = p - prompt;
222 + memcpy (buf + i, prompt, j);
223 + buf[i + j] = '\0';
224 + strcat (buf, _rl_prompt_initial_last_line);
225 + strcat (buf, p + strlen (pattern));
227 + else {
228 + strcat (buf, prompt);
230 + prompt = buf;
232 + else {
233 + prompt = _rl_prompt_initial;
235 + rl_set_prompt (prompt);
236 + _rl_redisplay_after_sigwinch ();
239 +static void
240 +vi_mode_changed_bin ()
242 + pid_t pid;
243 + int status, fd_devnull;
244 + char *bin = _rl_vi_mode_changed_bin;
246 + if (!strlen (bin)) {
247 + return;
249 + pid = fork ();
250 + if (pid < 0) {
251 + perror ("vi_mode_changed_bin: fork failed");
252 + return;
254 + else if (pid == 0) {
255 + close (STDIN_FILENO);
256 + fd_devnull = open ("/dev/null", O_RDONLY);
257 + dup2 (fd_devnull, STDIN_FILENO);
258 + if (VI_INSERT_MODE()) {
259 + execl (bin, bin, "insert", NULL);
261 + else if (VI_COMMAND_MODE()) {
262 + execl (bin, bin, "command", NULL);
264 + perror ("vi_mode_changed_bin: execv failed");
265 + exit (1);
267 + waitpid (pid, &status, 0);
270 +static void
271 +vi_mode_changed ()
273 + if (!isatty (STDIN_FILENO) || !isatty (STDOUT_FILENO)) {
274 + return;
276 + vi_mode_changed_prompt ();
277 + vi_mode_changed_bin ();
280 /* Switching from one mode to the other really just involves
281 switching keymaps. */
283 @@ -663,6 +850,9 @@
285 _rl_keymap = vi_insertion_keymap;
286 _rl_vi_last_key_before_insert = key;
288 + vi_mode_changed ();
290 return (0);
293 @@ -747,6 +937,9 @@
294 rl_free_undo_list ();
296 RL_SETSTATE (RL_STATE_VICMDONCE);
298 + vi_mode_changed ();
300 return (0);