]> git.donarmstrong.com Git - lilypond.git/blobdiff - vim/lilypond-indent.vim
lilypond-manuals.css: edit color scheme and some spacing
[lilypond.git] / vim / lilypond-indent.vim
index 1f6c681e3bf1c6e28f8db2da10551a047ab65401..224f5de4cdfd511946b9173767f7b36220868460 100644 (file)
@@ -1,8 +1,10 @@
 " LilyPond indent file
 " Language:     LilyPond
 " Maintainer:   Heikki Junes <hjunes@cc.hut.fi>
-" Last Change:  2004 Mar 01
-
+" Last Change:  2010 Jul 26
+"
+" Installed As:        vim/indent/lilypond.vim
+"
 " Only load this indent file when no other was loaded.
 if exists("b:did_indent")
   finish
@@ -10,7 +12,7 @@ endif
 let b:did_indent = 1
 
 setlocal indentexpr=GetLilyPondIndent()
-setlocal indentkeys+==},>>,!<TAB>
+setlocal indentkeys=o,O,},>>,!^F
 
 " Only define the function once.
 if exists("*GetLilyPondIndent")
@@ -24,18 +26,33 @@ function GetLilyPondIndent()
 
   "Find a non-blank line above the current line.
   let lnum = prevnonblank(v:lnum - 1)
-  "Check if a block was started: '{' or '<<' is the last non-blank character of the line.
+  "Check if a block was started: '{' or '<<' is the last non-blank character of the previous line.
   if getline(lnum) =~ '^.*\({\|<<\)\s*$'
     let ind = indent(lnum) + &sw
   else
     let ind = indent(lnum)
   endif
 
-  "Check if a block was ended: '}' or '>>' is the first non-blank character of the line.
+  "Check if a block was ended: '}' or '>>' is the first non-blank character of the current line.
   if getline(v:lnum) =~ '^\s*\(}\|>>\)'
     let ind = ind - &sw
   endif
 
+  " Check if the first character from the previous line is within
+  " a `lilyScheme' region, and if so, use lisp-style indentation
+  " for the current line.
+  "
+  " TODO:
+  "   - Only works in version 7.1.215 or later, though it should
+  "     silently fail in older versions.
+  "   - We should support `lilyScheme' regions that begin in the
+  "     middle of the line, too.
+  for id in synstack(lnum, 1)
+    if synIDattr(id, "name") == "lilyScheme"
+      let ind = lispindent(v:lnum)
+    endif
+  endfor
+
   return ind
 endfunction
 "