summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOscar Linderholm <osm@recv.se>2017-06-21 10:40:01 +0200
committerOscar Linderholm <osm@recv.se>2017-06-21 10:40:47 +0200
commit12d671a05645d67e811264d5be06d9758458452f (patch)
treedccef2b7f808d1aff932530d79c1a5aed2140fb1
parent9d3cfe1069b5cfaf0efb972e36695b781ecf93de (diff)
downloadirssi-12d671a05645d67e811264d5be06d9758458452f.zip
Escape nicks during nick completion when expand_escapes is enabled
Fixes #693
-rw-r--r--src/fe-common/core/completion.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/fe-common/core/completion.c b/src/fe-common/core/completion.c
index a97adc21..78b1b24b 100644
--- a/src/fe-common/core/completion.c
+++ b/src/fe-common/core/completion.c
@@ -137,8 +137,9 @@ char *word_complete(WINDOW_REC *window, const char *line, int *pos, int erase, i
int old_startpos, old_wordlen;
GString *result;
- char *word, *wordstart, *linestart, *ret;
- int continue_complete, want_space;
+ const char *cmdchars;
+ char *word, *wordstart, *linestart, *ret, *data;
+ int continue_complete, want_space, expand_escapes;
g_return_val_if_fail(line != NULL, NULL);
g_return_val_if_fail(pos != NULL, NULL);
@@ -241,14 +242,24 @@ char *word_complete(WINDOW_REC *window, const char *line, int *pos, int erase, i
if (complist == NULL)
return NULL;
+ /* get the cmd char */
+ cmdchars = settings_get_str("cmdchars");
+
+ /* get the expand_escapes setting */
+ expand_escapes = settings_get_bool("expand_escapes");
+
+ /* escape if the word doesn't begin with '/' and expand_escapes are turned on */
+ data = strchr(cmdchars, *line) == NULL && expand_escapes ?
+ escape_string(complist->data) : g_strdup(complist->data);
+
/* word completed */
- *pos = startpos+strlen(complist->data);
+ *pos = startpos + strlen(data);
/* replace the word in line - we need to return
a full new line */
result = g_string_new(line);
g_string_erase(result, startpos, wordlen);
- g_string_insert(result, startpos, complist->data);
+ g_string_insert(result, startpos, data);
if (want_space) {
if (!isseparator(result->str[*pos]))
@@ -256,13 +267,17 @@ char *word_complete(WINDOW_REC *window, const char *line, int *pos, int erase, i
(*pos)++;
}
- wordlen = strlen(complist->data);
+ wordlen = strlen(data);
last_line_pos = *pos;
g_free_not_null(last_line);
last_line = g_strdup(result->str);
ret = result->str;
g_string_free(result, FALSE);
+
+ /* free the data */
+ g_free(data);
+
return ret;
}