summaryrefslogtreecommitdiffstats
path: root/indent/applescript.vim
diff options
context:
space:
mode:
Diffstat (limited to 'indent/applescript.vim')
-rw-r--r--indent/applescript.vim81
1 files changed, 81 insertions, 0 deletions
diff --git a/indent/applescript.vim b/indent/applescript.vim
new file mode 100644
index 00000000..67c51b35
--- /dev/null
+++ b/indent/applescript.vim
@@ -0,0 +1,81 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'applescript') == -1
+
+"Plugin Name: applescript indent file.
+"Author: mityu
+"Last Change: 02-May-2017.
+
+let s:cpo_save=&cpo
+set cpo&vim
+
+setlocal indentexpr=GetAppleScriptIndent()
+setlocal indentkeys+=0=end,0=else,=error
+
+func! GetAppleScriptIndent()
+ let l:ignorecase_save=&ignorecase
+ try
+ let &ignorecase=0
+ return s:returnAppleScriptIndent()
+ finally
+ let &ignorecase=l:ignorecase_save
+ endtry
+endfunc
+
+func! s:returnAppleScriptIndent()
+ let l:current_text=getline(v:lnum)
+
+ let l:prev_line=prevnonblank(v:lnum-1)
+
+ "At the start of the file, use 0 indent.
+ if l:prev_line==0
+ return 0
+ endif
+
+ let l:prev_line_save=l:prev_line
+ let l:prev_line=s:prev_non_connected_line(l:prev_line)
+
+ let l:indent=indent(l:prev_line)
+
+ if l:prev_line_save-l:prev_line==1
+ "連結開始
+ let l:indent+=shiftwidth()*2
+ elseif l:prev_line_save-l:prev_line>=2
+ "絶賛連結中
+ "その時は前の行のインデントをそのまま流用する
+ return indent(l:prev_line_save)
+ elseif l:prev_line_save==l:prev_line && s:doesOrderConnect(getline(l:prev_line-1))
+ "前の行が連結される行の最終行の場合
+ let l:prev_line=s:prev_non_connected_line(l:prev_line-1)
+ if l:prev_line==0 | let l:prev_line=1 | endif
+ let l:indent=indent(l:prev_line)
+ endif
+
+ let l:prev_text=getline(l:prev_line)
+ if l:prev_text=~'^\s*\(on\|\(tell\(.*\<to\>\)\@!\)\|repeat\|try\|if\|else\)'
+ let l:indent+=shiftwidth()
+ endif
+
+ if l:current_text=~'^\s*\(end\|else\|on\serror\)'
+ let l:indent-=shiftwidth()
+ endif
+
+ return l:indent
+endfunc
+
+func! s:prev_non_connected_line(line)
+ let l:prev_line=prevnonblank(a:line)
+ while l:prev_line>0 && s:doesOrderConnect(getline(l:prev_line))
+ let l:prev_line-=1
+ endwhile
+ return l:prev_line
+endfunc
+
+func! s:doesOrderConnect(text)
+ return a:text=~'¬$'
+endfunc
+
+let &cpo=s:cpo_save
+unlet s:cpo_save
+
+" vim: foldmethod=marker
+
+endif