]> git.sur5r.net Git - i3/i3/commitdiff
Do not count '\' in comment as line continuation (#2181)
authorJohannes Lange <jolange@users.noreply.github.com>
Sat, 7 May 2016 22:20:08 +0000 (00:20 +0200)
committerMichael Stapelberg <stapelberg@users.noreply.github.com>
Sat, 7 May 2016 22:20:08 +0000 (00:20 +0200)
fixes #2176

docs/userguide
src/config_parser.c
testcases/t/247-config-line-continuation.t

index f46a0be783875d4d16a4ad207d3341c6d9d62783..d0ac2ddb7184f6ec1ee326a9eccf8a600ebffdca 100644 (file)
@@ -1115,11 +1115,15 @@ show_marks yes
 Config files support line continuation, meaning when you end a line in a
 backslash character (`\`), the line-break will be ignored by the parser. This
 feature can be used to create more readable configuration files.
+Commented lines are not continued.
 
 *Examples*:
 -------------------
 bindsym Mod1+f \
 fullscreen toggle
+
+# this line is not continued \
+bindsym Mod1+F fullscreen toggle
 -------------------
 
 == Configuring i3bar
index 5ee69e8d170388c830c6347aa7881dd7a8dcd217..b197eb223e981186982391d6d6607a1cff728857 100644 (file)
@@ -846,17 +846,26 @@ bool parse_file(const char *f, bool use_nagbar) {
         if (buffer[strlen(buffer) - 1] != '\n' && !feof(fstr)) {
             ELOG("Your line continuation is too long, it exceeds %zd bytes\n", sizeof(buffer));
         }
+
+        /* sscanf implicitly strips whitespace. */
+        const bool skip_line = (sscanf(buffer, "%511s %511[^\n]", key, value) < 1 || strlen(key) < 3);
+        const bool comment = (key[0] == '#');
+
         continuation = strstr(buffer, "\\\n");
         if (continuation) {
-            continue;
+            if (!comment) {
+                continue;
+            }
+            DLOG("line continuation in comment is ignored: \"%.*s\"\n", (int)strlen(buffer) - 1, buffer);
+            continuation = NULL;
         }
 
         strncpy(buf + strlen(buf), buffer, strlen(buffer) + 1);
 
-        /* sscanf implicitly strips whitespace. Also, we skip comments and empty lines. */
-        if (sscanf(buffer, "%511s %511[^\n]", key, value) < 1 ||
-            key[0] == '#' || strlen(key) < 3)
+        /* Skip comments and empty lines. */
+        if (skip_line || comment) {
             continue;
+        }
 
         if (strcasecmp(key, "set") == 0) {
             if (value[0] != '$') {
index 0396d8726bc2e55901a901d4299bb9733b6981ea..cb4290831fc34e51ccddae1847f6e67e53d1b560 100644 (file)
@@ -198,4 +198,20 @@ EOT
 is(launch_get_border($config), 'none', 'no border');
 
 
+#####################################################################
+# test ignoring of line continuation within a comment
+#####################################################################
+
+$config = <<'EOT';
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+set $vartest \"special title\"
+for_window [title="$vartest"] border pixel 1
+# this line is not continued, so the following is not contained in this comment\
+for_window [title="$vartest"] border none
+EOT
+
+is(launch_get_border($config), 'none', 'no border');
+
 done_testing;