[PATCH 4 of 4] Contrib: vim syntax, remove unecessary ngxBlock

Maxim Dounin mdounin at mdounin.ru
Fri Mar 3 17:24:28 UTC 2017


On Fri, Mar 03, 2017 at 11:37:36PM +0800, OOO wrote:

> I made a sample and take screenshot[1].
> This one (remove current ngxBlock) is a blocker for some other changes.
> [1]:https://www.flickr.com/photos/othree/32843758310/

Ah, ok, I see.  The problem only happens if there is an 

> And about the *ngxBlock* you talked about in the last paragraph.
> I think you are talking about curly bracket block:
>     http {
>       include    conf/mime.types;
>       index    index.html index.htm index.php;
>     }
> I think it's not necessary for nginx conf file syntax highlight definition.
> I can do more specific syntax highlight like ngxServerBlock for
> `server { ... }` or another for `http { ... }`.
> And made some constrain, ex: only allow *http* in *server*. Not allow
> *http* at root level.
> But it add lots of complexity. And I don't see the benefit worthy it.
> Also breaks highlight in partial conf file (which will be included by
> other conf file).

Not allowing "server" at root level will break highlighting in 
include files, agree.  But it should be still possible to check if 
there are missing / unbalanced curly brackets, and warn a user if 
tries to write "server { ..." instead of "server { ... }".  And it 
should be still possible to enforce http{} should be only at top level, 
and there should be no server{} insider another server{}.

Moreover, I think it is the only way to properly parse 
configuration for highliting.  Without matching blocks you want be 
able to properly highligh configuration directives.  For example, 
consider the following configuration:

    map $foo $bar {
        index foo;

    index bar;

In this example, only "map" and "index bar" should be highlighted 
as configuration directives.  Highliting "index foo" would be an 
error, because it is not a configuration directive, but a source 
and resulting values of the map.

The same applies to matching directives.  Not seeing a directive 
ending will lead to

   server_name some-name-but-no-semicolon
   listen 80;

being misinterpreted as two configuration directives, making it 
harder for people to find the bug.  And this is actually a typical 
problem nginx users often face, as per questions on the mailing 
list.  And it would be really good for syntax highlighting to help 
them to find the bug instead of misleading them even further.

> I will fix the rewrite commit.
> But I have another question.
> Maybe you have an idea about it.
>     rewrite "/foo bar/" /bazz/ last;
> For now, if I fix the bug. The "/foo bar/" part will be highlight as string.
> But the /bazz/ part will be normal (no highlight).
> I think they should both be highlight as string.
> Do you have any idea?

Current behaviour is to hightlight strings everywhere 
unconditionally, and I don't think it's a problem.  Your changes 
won't introduce any regression here.

Moreover, this is something anyway will happen even if you 
specifically define matching for a particular parameter.  For 
example, consider the following configuration snippet:

    "rewrite" "/foo bar/" "/bazz/" "last";

It is identical to the snippet above from nginx point of view, but 
all the arguments and the directive name will be highlited as 
strings.  I don't really think this is something would be easy to 

BTW, just noticed while testing the above example. ngxString now 
doesn't match at the start of a line, so the following snippet 
won't be correctly highlighted:


I think the fix would be to explicitly check for whitespaces or 
newline before ngxString, like this:

diff --git a/contrib/vim/syntax/nginx.vim b/contrib/vim/syntax/nginx.vim
--- a/contrib/vim/syntax/nginx.vim
+++ b/contrib/vim/syntax/nginx.vim
@@ -13,7 +13,7 @@ syn match ngxVariable '\$\(\w\+\|{\w\+}\
 syn match ngxVariableBlock '\$\(\w\+\|{\w\+}\)' contained
 syn match ngxVariableString '\$\(\w\+\|{\w\+}\)' contained
 syn region ngxBlock start=+^+ end=+{+ skip=+\${+ contains=ngxComment,ngxDirectiveBlock,ngxVariableBlock,ngxString oneline
-syn region ngxString start=+[^:a-zA-Z>!\\@]\z(["']\)+lc=1 end=+\z1+ skip=+\\\\\|\\\z1+ contains=ngxVariableString
+syn region ngxString start=+\(^\|[ \t]\)\zs\z(["']\)+ end=+\z1+ skip=+\\\\\|\\\z1+ contains=ngxVariableString
 syn match ngxComment ' *#.*$'
 syn keyword ngxBoolean on

Please let me know if you have any objections to the above patch 
and/or just include it into your patch series.

Maxim Dounin

More information about the nginx-devel mailing list