freebsd-ports/shells/bash/files/extrapatch-colonbreakswords
Emanuel Haupt 03edf9b7fc - Reset maintainer of shells/bash, shells/bash-static
- Takeover maintainership
- Merge changes from shells/bash-devel this updates the port to 4.3
- Remove the now useless -devel ports
- Document change in ports/MOVED

Approved by:    portmgr (bapt)
2014-03-03 08:55:45 +00:00

176 lines
5.8 KiB
Text

--- bashline.c.orig 2014-03-02 13:26:23.000000000 -0500
+++ bashline.c 2014-03-02 13:30:09.000000000 -0500
@@ -255,6 +255,11 @@
host list. */
int perform_hostname_completion = 1;
+/* If non-zero, we do hostname completion, breaking words at `@' and
+ trying to complete the stuff after the `@' from our own internal
+ host list. */
+int colon_is_wordbreak = 1;
+
/* If non-zero, we don't do command completion on an empty line. */
int no_empty_command_completion;
@@ -284,7 +289,8 @@
static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";
static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
-/* )) */
+static char *bash_nocolon_word_break_characters = " \t\n\"'@><=;|&(";
+/* ))) */
static const char *default_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~"; /*}*/
static char *custom_filename_quote_characters = 0;
@@ -403,6 +409,80 @@
return (old_value);
}
+/* When this function returns, rl_completer_word_break_characters points to
+ dynamically allocated memory. */
+int
+enable_colon_wordbreak (on_or_off)
+ int on_or_off;
+{
+ int old_value;
+ char *at, *nv, *nval;
+
+ old_value = colon_is_wordbreak;
+
+ if (on_or_off)
+ {
+ colon_is_wordbreak = 1;
+ rl_filename_quote_characters = default_filename_quote_characters;
+ }
+ else
+ {
+ colon_is_wordbreak = 0;
+ rl_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!{~"; /*}*/
+ }
+
+ /* Now we need to figure out how to appropriately modify and assign
+ rl_completer_word_break_characters depending on whether we want
+ the colon to be a word break or not. */
+
+ /* If this is the first time this has been called
+ (bash_readline_initialized == 0), use the sames values as before, but
+ allocate new memory for rl_completer_word_break_characters. */
+
+ if (bash_readline_initialized == 0 &&
+ (rl_completer_word_break_characters == 0 ||
+ rl_completer_word_break_characters == rl_basic_word_break_characters))
+ {
+ if (on_or_off)
+ rl_completer_word_break_characters = savestring (bash_completer_word_break_characters);
+ else
+ rl_completer_word_break_characters = savestring (bash_nocolon_word_break_characters);
+ }
+ else
+ {
+ /* See if we have anything to do. */
+ at = strchr (rl_completer_word_break_characters, ':');
+ if ((at == 0 && on_or_off == 0) || (at != 0 && on_or_off != 0))
+ return old_value;
+
+ /* We have something to do. Do it. */
+ nval = (char *)xmalloc (strlen (rl_completer_word_break_characters) + 1 + on_or_off);
+
+ if (on_or_off == 0)
+ {
+ /* Turn it off -- just remove `:' from word break chars. We want
+ to remove all occurrences of `:' from the char list, so we loop
+ rather than just copy the rest of the list over AT. */
+ for (nv = nval, at = rl_completer_word_break_characters; *at; )
+ if (*at != ':')
+ *nv++ = *at++;
+ else
+ at++;
+ *nv = '\0';
+ }
+ else
+ {
+ nval[0] = ':';
+ strcpy (nval + 1, rl_completer_word_break_characters);
+ }
+
+ free (rl_completer_word_break_characters);
+ rl_completer_word_break_characters = nval;
+ }
+
+ return (old_value);
+}
+
/* Called once from parse.y if we are going to use readline. */
void
initialize_readline ()
@@ -573,8 +653,13 @@
completion is enabled. */
enable_hostname_completion (perform_hostname_completion);
+ /* This sets rl_completer_word_break_characters and rl_filename_quote_characters
+ to the appropriate values, depending on whether or not a colon
+ should break completion words or not. */
+ enable_colon_wordbreak (colon_is_wordbreak);
+
/* characters that need to be quoted when appearing in filenames. */
- rl_filename_quote_characters = default_filename_quote_characters;
+// rl_filename_quote_characters = default_filename_quote_characters;
set_filename_bstab (rl_filename_quote_characters);
rl_filename_quoting_function = bash_quote_filename;
--- builtins/shopt.def.orig 2014-03-02 13:30:44.000000000 -0500
+++ builtins/shopt.def 2014-03-02 13:31:38.000000000 -0500
@@ -103,6 +103,8 @@
extern int complete_fullquote;
extern int enable_hostname_completion __P((int));
+extern int colon_is_wordbreak;
+extern int enable_colon_wordbreak __P((int));
#endif
#if defined (PROGRAMMABLE_COMPLETION)
@@ -166,6 +168,9 @@
{ "direxpand", &dircomplete_expand, shopt_set_complete_direxpand },
{ "dirspell", &dircomplete_spelling, (shopt_set_func_t *)NULL },
#endif
+#if defined (READLINE)
+ { "colonbreakswords", &colon_is_wordbreak, enable_colon_wordbreak },
+#endif
{ "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
{ "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
{ "expand_aliases", &expand_aliases, (shopt_set_func_t *)NULL },
--- doc/bash.1.orig 2014-03-02 13:32:14.000000000 -0500
+++ doc/bash.1 2014-03-02 13:32:40.000000000 -0500
@@ -9252,6 +9252,18 @@
command in the same history entry. This allows
easy re-editing of multi-line commands.
.TP 8
+.B colonbreakswords
+If set, and
+.B readline
+is being used, \fBbash\fP will treat \fB:\fP as
+separating word being completed (see
+.B Completing
+under
+.SM
+.B READLINE
+above).
+This is enabled by default.
+.TP 8
.B compat31
If set,
.B bash
--- doc/bashref.texi.orig 2014-03-02 13:33:17.000000000 -0500
+++ doc/bashref.texi 2014-03-02 13:33:44.000000000 -0500
@@ -4937,6 +4937,11 @@
command in the same history entry. This allows
easy re-editing of multi-line commands.
+@item colonbreakswords
+If set, and Readline is being used, Bash will treat @samp{:} as
+separating word being completed (@pxref{Commands For Completion}).
+This option is enabled by default.
+
@item compat31
If set, Bash
changes its behavior to that of version 3.1 with respect to quoted