80c2d7af3536

Moar.
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Wed, 16 Nov 2011 20:04:44 -0500
parents 2b0626af776b
children d96929307215
branches/tags (none)
files chapters/31.markdown chapters/46.markdown

Changes

--- a/chapters/31.markdown	Wed Nov 16 19:16:46 2011 -0500
+++ b/chapters/31.markdown	Wed Nov 16 20:04:44 2011 -0500
@@ -18,6 +18,12 @@
 
 This is the text we'll use to experiment with Vimscript's regex support.
 
+I'm going to assume that you know the basics of regular expressions.  If you
+don't you should definitely stop reading this book and start reading [Learn
+Regex the Hard Way][regex] by Zed Shaw.  Come back when you're done with that.
+
+[regex]: http://regex.learncodethehardway.org/
+
 Highlighting
 ------------
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chapters/46.markdown	Wed Nov 16 20:04:44 2011 -0500
@@ -0,0 +1,131 @@
+Advanced Syntax Highlighting
+============================
+
+So far we've defined some simple syntax highlighting for Potion files: keywords
+and functions.
+
+If you didn't do the exercises in the last chapter, you need to go back and do
+them.  I'm going to assume you did them.
+
+In fact, you should go back and do *any* exercises you skipped.  Even if you
+think you don't need them, you *need* to do them for this book to be effective.
+Please trust me on this.
+
+Highlighting Comments
+---------------------
+
+One obvious part of Potion that we need to highlight is comments.  The problem
+is that Potion comments start with `#` which is (almost always) not in
+`iskeyword`.
+
+If you don't know what `iskeyword` means, you didn't listen to me.  Go back and
+*do the damn exercises*.  I'm not just throwing useless busywork at you when
+I write the exercises for each chapter.  You *really* need to do them to
+understand the book.
+
+Because `#` isn't a keyword character we need to use a regular expression to
+match it (and the rest of the comment).  We'll do this with `syntax match`
+instead of `syntax keyword`.  Add the following lines to your syntax file:
+
+    syntax match potionComment "\v#.*$"
+    highlight link potionComment Comment
+
+I'm not going to tell you where to put them in the file any more.  You're
+a programmer: use your judgement.
+
+Close and reopen `factorial.pn`.  Add a comment somewhere in the file and you'll
+see that it's highlighted as a comment.
+
+The second line is simple: it tells Vim to highlight anything in the
+`potionComment` syntax group as a `Comment`.
+
+The first line is something new.  We use `syntax match` which tells Vim to match
+*regexes* instead of literal keywords.
+
+Notice that the regular expression we're using starts with `\v` which tells Vim
+to use "very magic" mode.  Reread the chapter on Basic Regular Expressions if
+you're not sure what that means.
+
+In this particular case the "very magic" mode isn't necessary.  But in the
+future we might change this regex and wonder why it's not working, so I'd
+recommend *always* using "very magic" regexes for consistency.
+
+As for the regex itself, it's fairly simple: comments start with a hash and
+include all characters from there to the end of the line.
+
+If you need a refresher course on regular expressions you should take a look at
+[Learn Regex the Hard Way][regex] by Zed Shaw.
+
+[regex]: http://regex.learncodethehardway.org/
+
+Highlighting Operators
+----------------------
+
+Another part of Potion we need regexes to highlight is operators.  Add the
+following to your syntax file:
+
+    syntax match potionOperator "\v\*\="
+    syntax match potionOperator "\v/\="
+    syntax match potionOperator "\v\+\="
+    syntax match potionOperator "\v-\="
+    syntax match potionOperator "\v\*"
+    syntax match potionOperator "\v/"
+    syntax match potionOperator "\v\+"
+    syntax match potionOperator "\v-"
+    syntax match potionOperator "\v\?"
+
+    highlight link potionOperator Operator
+
+Close and reopen `factorial.pn`.  Notice that the `*=` in the factorial function
+is now highlighted.
+
+The first thing you probably noticed about this hunk of code is that I put each
+regex on its own line instead of grouping them like I did with keywords.  This
+is because `syntax match` does *not* support multiple groups on a single line.
+
+You should also note that I used `\v` at the beginning of every regular
+expression, even when it wasn't strictly necessary.  I prefer to keep my regex
+syntax consistent when writing Vimscript, even if it means a few extra
+characters.
+
+You might be wondering why I didn't use a regex like `"\v-\=?"` to match both
+`-` *and* `-=` in one line.  You can absolutely do that if you want to.  It will
+work just fine.  I just tend to think of `-` and `-=` as separate operators, so
+I put them on separate lines.
+
+Defining those operators as separate matches simplifies the regexes at the cost
+of some extra verbosity.  I prefer doing it like that, but you may feel
+differently.  Use your judgement.
+
+I also never defined `=` as an operator.  We'll do that in a second, but
+I wanted to avoid it for now so I could teach you a lesson.
+
+Because I used separate regexes for `-` and `-=` I had to define `-` *after*
+`-=`!
+
+If I did it in the opposite order and used `-=` in a Potion file, Vim would
+match `-` (and highlight it, of course) and only `=` would remain for matching.
+This shows when you're building groups with `syntax match` each group "consumes"
+pieces of the file that can't be matched later.
+
+This is an oversimplification, but I don't want to get bogged down in the
+details just yet.  For now, your rule of thumb should be to match larger groups
+first and smaller groups later.
+
+Let's go ahead and add `=` as an operator, now that we've had our lesson:
+
+    syntax match potionOperator "\v\="
+
+Take a second and think about where you need to put this in the syntax file.
+Reread the last few paragraphs if you need a hint.
+
+Exercises
+---------
+
+Read `:help syn-match`.
+
+We didn't make `:` an operator in our example.  Read the Potion docs and make
+a conscious decision about whether to make `:` an operator.  If you decide to do
+so, add it to the syntax file.
+
+Do the same for `.` and `/`.