diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0a54f69 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2012-2016, Zahary Karadjov and Contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/README b/README deleted file mode 100644 index 22605ce..0000000 --- a/README +++ /dev/null @@ -1,6 +0,0 @@ -This is a mirror of http://www.vim.org/scripts/script.php?script_id=2632 - -Syntax file for Nimrod. - -This file is basically a modified python.vim (http://www.vim.org/scripts/script.php?script_id=790) ... you might recognize it. -I have no idea if it works because I haven't actually tried to code in Nimrod and have next to nothing to test it with :P diff --git a/README.md b/README.md new file mode 100644 index 0000000..a63fc8b --- /dev/null +++ b/README.md @@ -0,0 +1,144 @@ +# Nim language support for Vim + +This provides [Nim](http://nim-lang.org) language support for Vim: + +* Syntax highlighting +* Auto-indent +* Build/jump to errors within Vim +* Project navigation and Jump to Definition (cgats or compiler-assisted + idetools). + +The source of this script comes mainly from +http://www.vim.org/scripts/script.php?script_id=2632, which comes from a +modified python.vim (http://www.vim.org/scripts/script.php?script_id=790). + +# Installation + +Installing `nim.vim` is easy but first you need to have a plugin manager such +as pathogen, vundle or vim-plug installed. +If you already have one working then skip to the [final step](README.markdown#final-step). +It is also recommended that you use the [syntastic](https://github.com/scrooloose/syntastic) plugin for best results. + +## Pathogen + +### Step 1: Install pathogen.vim + +First I'll show you how to install tpope's +[pathogen.vim](https://github.com/tpope/vim-pathogen) so that it's easy to +install `nim.vim`. Do this in your Terminal so that you get the +`pathogen.vim` file and the directories it needs: + + mkdir -p ~/.vim/autoload ~/.vim/bundle && \ + curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim + +Next you *need to add this* to your `~/.vimrc`: + + call pathogen#infect() + +### Step 2: Install nim.vim as a pathogen bundle + +You now have pathogen installed and can put `nim.vim` into `~/.vim/bundle` +like this: + + cd ~/.vim/bundle + git clone https://github.com/zah/nim.vim.git + +You may also want to install synastic by calling + + git clone https://github.com/scrooloose/syntastic.git + +## Vundle + +Vundle is a more automatic way to install vim plugins that works by cloning +the git reposotory. + +### Step 1: Install Vundle + +Add the vundle script to your vim: + + git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle + +Modify your ~/.vimrc to get vundle running, lightly adapted from [Vundle's readme](https://github.com/gmarik/Vundle.vim/blob/master/README.md) + + set nocompatible " be iMproved, required + filetype off " required + + " set the runtime path to include Vundle and initialize + set rtp+=~/.vim/bundle/vundle/ + call vundle#rc() + " alternatively, pass a path where Vundle should install bundles + "let path = '~/some/path/here' + "call vundle#rc(path) + + " let Vundle manage Vundle, required + Bundle 'gmarik/vundle' + + filetype plugin indent on " required + +### Step 2: Install nim.vim + +On the line after `Bundle 'gmarik/vundle'`, add `Bundle 'zah/nim.vim'`. You may also want +to add `Bundle 'scrooloose/syntastic'`. Save `~/.vimrc` and restart vim. Execute `:BundleInstall` +and wait for nim.vim to be installed. + +## vim-plug + +[vim-plug](https://github.com/junegunn/vim-plug) is a minimalist Vim plugin manager. + +### Step 1: Install vim-plug + +Install vim-plug so that it loads automatically at launch: + + $ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ + https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + +### Step 2: Add `nim.vim` to your list of plugins + +Modify your `~/.vimrc` to add the `nim.vim` plugin to the list of plugins: + + " ... + call plug#begin('~/.vim/plugged') + " ... + Plug 'zah/nim.vim' + call plug#end() + +Execute `:PlugInstall` and wait for `nim.vim` to be installed. + +## Final Step +Next you *need to add this* to your `~/.vimrc`: + + fun! JumpToDef() + if exists("*GotoDefinition_" . &filetype) + call GotoDefinition_{&filetype}() + else + exe "norm! \" + endif + endf + + " Jump to tag + nn :call JumpToDef() + ino :call JumpToDef()i + +The `JumpToDef` function hooks the `nim.vim` plugin to invoke the nim +compiler with the appropriate idetools command. Pressing meta+g will then jump +to the definition of the word your cursor is on. This uses the nim compiler +instead of ctags, so it works on any nim file which is compilable without +requiring you to maintain a database file. + +# Other recomended Vim plugins + +* https://github.com/scrooloose/syntastic (copied bits from its readme) +* https://github.com/Shougo/neocomplcache + +# If something goes wrong + +Since you are using vim, on source code which might have syntax problems, +invoking an external tool which may have its own share of bugs, sometimes stuff +just doesn't work as expected. In these situations if you want to debug the +issue you can type ``:e log://nim`` and a buffer will open with the log of +the plugin's invocations and nim's idetool answers. + +This can give you a hint of where the problem is and allow you to easily +reproduce on the commandline the idetool parameters the vim plugin is +generating so you can prepare a test case for either this plugin or the nim +compiler. diff --git a/autoload/nim.vim b/autoload/nim.vim new file mode 100644 index 0000000..4d6f29c --- /dev/null +++ b/autoload/nim.vim @@ -0,0 +1,240 @@ +let g:nim_log = [] +let s:plugin_path = escape(expand(':p:h'), '\') + +if !exists('g:nim_caas_enabled') + let g:nim_caas_enabled = 0 +endif + +if !executable('nim') + echoerr "the Nim compiler must be in your system's PATH" +endif + +if has('pythonx') + exe 'pyxfile ' . fnameescape(s:plugin_path) . '/nim_vim.py' +endif + +fun! nim#init() abort + let cmd = printf('nim --dump.format:json --verbosity:0 dump %s', s:CurrentNimFile()) + let raw_dumpdata = system(cmd) + if !v:shell_error && expand('%:e') ==# 'nim' + let false = 0 " Needed for eval of json + let true = 1 " Needed for eval of json + let dumpdata = json_decode(raw_dumpdata) + + let b:nim_project_root = dumpdata['project_path'] + let b:nim_defined_symbols = dumpdata['defined_symbols'] + let b:nim_caas_enabled = g:nim_caas_enabled || index(dumpdata['defined_symbols'], 'forcecaas') != -1 + + for path in dumpdata['lib_paths'] + if finddir(path) ==# path + let &l:path = path . ',' . &l:path + endif + endfor + else + let b:nim_caas_enabled = 0 + endif +endf + +fun! s:UpdateNimLog() abort + setlocal buftype=nofile + setlocal bufhidden=hide + setlocal noswapfile + + for entry in g:nim_log + call append(line('$'), split(entry, "\n")) + endfor + + let g:nim_log = [] + + match Search /^nim\ .*/ +endf + +augroup NimVim + au! + au BufEnter log://nim call s:UpdateNimLog() + if has('pythonx') + " au QuitPre * :pyx nimTerminateAll() + au VimLeavePre * :pyx nimTerminateAll() + endif +augroup END + +command! NimLog :e log://nim + +command! NimTerminateService + \ :exe printf("pyx nimTerminateService('%s')", b:nim_project_root) + +command! NimRestartService + \ :exe printf("pyx nimRestartService('%s')", b:nim_project_root) + +fun! s:CurrentNimFile() abort + let save_cur = getpos('.') + call cursor(0, 0, 0) + + let PATTERN = '\v^\#\s*included from \zs.*\ze' + let l = search(PATTERN, 'n') + + if l != 0 + let f = matchstr(getline(l), PATTERN) + let l:to_check = expand('%:h') . '/' . f + else + let l:to_check = expand('%') + endif + + call setpos('.', save_cur) + return l:to_check +endf + +let g:nim_symbol_types = { + \ 'skParam': 'v', + \ 'skVar': 'v', + \ 'skLet': 'v', + \ 'skTemp': 'v', + \ 'skForVar': 'v', + \ 'skConst': 'v', + \ 'skResult': 'v', + \ 'skGenericParam': 't', + \ 'skType': 't', + \ 'skField': 'm', + \ 'skProc': 'f', + \ 'skMethod': 'f', + \ 'skIterator': 'f', + \ 'skConverter': 'f', + \ 'skMacro': 'f', + \ 'skTemplate': 'f', + \ 'skEnumField': 'v', + \ } + +fun! NimExec(op) abort + let isDirty = getbufvar(bufnr('%'), '&modified') + if isDirty + let tmp = tempname() . bufname('%') . '_dirty.nim' + silent! exe ':w ' . tmp + + let cmd = printf('idetools %s --trackDirty:"%s,%s,%d,%d" "%s"', + \ a:op, tmp, expand('%:p'), line('.'), col('.')-1, s:CurrentNimFile()) + else + let cmd = printf('idetools %s --track:"%s,%d,%d" "%s"', + \ a:op, expand('%:p'), line('.'), col('.')-1, s:CurrentNimFile()) + endif + + if b:nim_caas_enabled + exe printf("pyx nimExecCmd('%s', '%s', False)", b:nim_project_root, cmd) + let output = get(l:, 'py_res', '') + else + let output = system('nim ' . cmd) + endif + + call add(g:nim_log, 'nim ' . cmd . "\n" . output) + return output +endf + +fun! NimExecAsync(op, Handler) abort + let result = NimExec(a:op) + call a:Handler(result) +endf + +fun! NimComplete(findstart, base) abort + if b:nim_caas_enabled ==# 0 + return -1 + endif + + if a:findstart + if synIDattr(synIDtrans(synID(line('.'),col('.'),1)), 'name') ==# 'Comment' + return -1 + endif + let line = getline('.') + let start = col('.') - 1 + while start > 0 && line[start - 1] =~? '\w' + let start -= 1 + endwhile + return start + else + let result = [] + let sugOut = NimExec('--suggest') + for line in split(sugOut, '\n') + let lineData = split(line, '\t') + if len(lineData) > 0 && lineData[0] ==# 'sug' + let word = split(lineData[2], '\.')[-1] + if a:base ==? '' || word =~# '^' . a:base + let kind = get(g:nim_symbol_types, lineData[1], '') + let c = { 'word': word, 'kind': kind, 'menu': lineData[3], 'dup': 1 } + call add(result, c) + endif + endif + endfor + return result + endif +endf + +if !exists('g:neocomplcache_omni_patterns') + let g:neocomplcache_omni_patterns = {} +endif +let g:neocomplcache_omni_patterns['nim'] = '[^. *\t]\.\w*' + +if !exists('g:neocomplete#sources#omni#input_patterns') + let g:neocomplete#sources#omni#input_patterns = {} +endif +let g:neocomplete#sources#omni#input_patterns['nim'] = '[^. *\t]\.\w*' + +let g:nim_completion_callbacks = {} + +fun! NimAsyncCmdComplete(cmd, output) abort + call add(g:nim_log, a:output) + echom g:nim_completion_callbacks + if has_key(g:nim_completion_callbacks, a:cmd) + let Callback = get(g:nim_completion_callbacks, a:cmd) + call Callback(a:output) + " remove(g:nim_completion_callbacks, a:cmd) + else + echom 'ERROR, Unknown Command: ' . a:cmd + endif + return 1 +endf + +fun! GotoDefinition_nim_ready(def_output) abort + if v:shell_error + echo 'nim was unable to locate the definition. exit code: ' . v:shell_error + " echoerr a:def_output + return 0 + endif + + let rawDef = matchstr(a:def_output, 'def\t\([^\n]*\)') + if rawDef == '' + echo 'the current cursor position does not match any definitions' + return 0 + endif + + let defBits = split(rawDef, '\t') + let file = defBits[4] + let line = defBits[5] + let column = defBits[6] + exe printf('e +%d %s', line, file) + call cursor(line, column + 1) + return 1 +endf + +fun! GotoDefinition_nim() abort + call NimExecAsync('--def', function('GotoDefinition_nim_ready')) +endf + +fun! FindReferences_nim() abort + "setloclist() +endf + +" Syntastic syntax checking +fun! SyntaxCheckers_nim_nim_GetLocList() abort + let makeprg = 'nim check --hints:off --listfullpaths ' . s:CurrentNimFile() + let errorformat = &errorformat + + return SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat }) +endf + +function! SyntaxCheckers_nim_nim_IsAvailable() abort + return executable('nim') +endfunction + +if exists('g:SyntasticRegistry') + call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'nim', + \ 'name': 'nim'}) +endif diff --git a/autoload/nim_vim.py b/autoload/nim_vim.py new file mode 100644 index 0000000..9a806c4 --- /dev/null +++ b/autoload/nim_vim.py @@ -0,0 +1,99 @@ +from sys import version_info +import threading, subprocess, signal, os, platform, getpass + +if version_info[0] == 3: + import queue as Queue +else: + import Queue + +try: + import vim +except ImportError: + class Vim: + def command(self, x): + print("Executing vim command: " + x) + + vim = Vim() + +class NimThread(threading.Thread): + def __init__(self, project_path): + super(NimThread, self).__init__() + self.tasks = Queue.Queue() + self.responses = Queue.Queue() + self.nim = subprocess.Popen( + ["nim", "serve", "--server.type:stdin", project_path], + cwd = os.path.dirname(project_path), + stdin = subprocess.PIPE, + stdout = subprocess.PIPE, + stderr = subprocess.STDOUT, + universal_newlines = True, + bufsize = 1) + + def postNimCmd(self, msg, async_ = True): + self.tasks.put((msg, async_)) + if not async_: + return self.responses.get() + + def run(self): + while True: + (msg, async_) = self.tasks.get() + + if msg == "quit": + self.nim.terminate() + break + + self.nim.stdin.write(msg + "\n") + result = "" + + while True: + line = self.nim.stdout.readline() + result += line + if line == "\n": + if not async_: + self.responses.put(result) + else: + self.asyncOpComplete(msg, result) + break + + +def nimVimEscape(expr): + return expr.replace("\\", "\\\\").replace('"', "\\\"").replace("\n", "\\n") + +class NimVimThread(NimThread): + def asyncOpComplete(self, msg, result): + cmd = "/usr/local/bin/mvim --remote-expr 'NimAsyncCmdComplete(1, \"" + nimVimEscape(result) + "\")'" + os.system (cmd) + +NimProjects = {} + +def nimStartService(project): + target = NimVimThread(project) + NimProjects[project] = target + target.start() + return target + +def nimTerminateService(project): + if NimProjects.has_key(project): + NimProjects[project].postNimCmd("quit") + del NimProjects[project] + +def nimRestartService(project): + nimTerminateService(project) + nimStartService(project) + +def nimExecCmd(project, cmd, async_ = True): + target = None + if NimProjects.has_key(project): + target = NimProjects[project] + else: + target = nimStartService(project) + + result = target.postNimCmd(cmd, async_) + + if not async_: + vim.command('let l:py_res = "' + nimVimEscape(result) + '"') + +def nimTerminateAll(): + for thread in NimProjects.values(): + thread.postNimCmd("quit") + diff --git a/autoload/simulator.py b/autoload/simulator.py new file mode 100644 index 0000000..10b244d --- /dev/null +++ b/autoload/simulator.py @@ -0,0 +1,18 @@ +#!/bin/env python + +from nimrod_vim import execNimCmd + +proj = "/foo" + +while True: + line = raw_input("enter command: ") + async = False + + if line == "quit": + async = True + + print execNimCmd(proj, line, async) + + if line == "quit": + break + diff --git a/compiler/nim.vim b/compiler/nim.vim new file mode 100644 index 0000000..78bf48f --- /dev/null +++ b/compiler/nim.vim @@ -0,0 +1,25 @@ +if exists('current_compiler') + finish +endif + +let current_compiler = 'nim' + +if exists(':CompilerSet') != 2 " older Vim always used :setlocal + command -nargs=* CompilerSet setlocal +endif + +let s:cpo_save = &cpo +set cpo-=C + +CompilerSet makeprg=nim\ c\ --verbosity:0\ --listfullpaths\ $*\ %:p + +CompilerSet errorformat= + \%-GHint:\ %m, + \%E%f(%l\\,\ %c)\ Error:\ %m, + \%W%f(%l\\,\ %c)\ Hint:\ %m + +let &cpo = s:cpo_save +unlet s:cpo_save + +let g:syntastic_nim_checkers = ['nim'] + diff --git a/ftdetect/nim.vim b/ftdetect/nim.vim new file mode 100644 index 0000000..1c6eb20 --- /dev/null +++ b/ftdetect/nim.vim @@ -0,0 +1,4 @@ +augroup nim_vim + au BufNewFile,BufRead *.nim,*.nims,*.nimble set filetype=nim +augroup END + diff --git a/ftplugin/nim.vim b/ftplugin/nim.vim new file mode 100644 index 0000000..c77357d --- /dev/null +++ b/ftplugin/nim.vim @@ -0,0 +1,29 @@ +if exists('b:nim_loaded') + finish +endif + +let b:nim_loaded = 1 + +let s:cpo_save = &cpo +set cpo&vim + +call nim#init() + +setlocal formatoptions-=t formatoptions+=croql +setlocal comments=:##,:# +setlocal commentstring=#\ %s +setlocal omnifunc=NimComplete +setlocal suffixesadd=.nim +setlocal expandtab "Make sure that only spaces are used +setlocal foldmethod=indent +setlocal foldlevel=99 " Don't fold newly opened buffers by default + +setl tabstop=2 +setl softtabstop=2 +setl shiftwidth=2 + +compiler nim + +let &cpo = s:cpo_save +unlet s:cpo_save + diff --git a/indent/nim.vim b/indent/nim.vim new file mode 100644 index 0000000..c71367d --- /dev/null +++ b/indent/nim.vim @@ -0,0 +1,142 @@ +" Only load this indent file when no other was loaded. +if exists('b:did_indent') + finish +endif +let b:did_indent = 1 + +" Some preliminary settings +setlocal nolisp " Make sure lisp indenting doesn't supersede us +setlocal autoindent " indentexpr isn't much help otherwise + +setlocal indentexpr=GetNimIndent(v:lnum) +setlocal indentkeys=!^F,o,O,<:>,0),0],0},=elif + +" Only define the function once. +if exists('*GetNimIndent') + finish +endif + +function! s:FindStartLine(fromln, pattern) + let lnum = a:fromln + let safechoice = indent(lnum) + while getline(lnum) !~ a:pattern + if indent(lnum) == 0 || lnum == 1 + return safechoice + endif + let lnum = lnum - 1 + endwhile + return indent(lnum) +endfunction + +function! GetNimIndent(lnum) + " Search backwards for the previous non-empty line. + let plnum = prevnonblank(a:lnum - 1) + + if plnum == 0 + " This is the first non-empty line, use zero indent. + return 0 + endif + + " If the start of the line is in a string don't change the indent. + if has('syntax_items') && synIDattr(synID(a:lnum, 1, 1), 'name') =~# 'String$' + return -1 + endif + + let pline = getline(plnum) + let cline = getline(a:lnum) + let pline_len = strlen(pline) + let plindent = indent(plnum) + let clindent = indent(a:lnum) + + " Remove any trailing comment from previous line. + " Use syntax highlighting attributes when possible. + if has('syntax_items') + " If the last character in the line is a comment, do a binary search for + " the start of the comment. synID() is slow, a linear search would take + " too long on a long line. + if synIDattr(synID(plnum, pline_len, 1), 'name') =~# 'Comment$' + let min = 1 + let max = pline_len + while min < max + let col = (min + max) / 2 + if synIDattr(synID(plnum, col, 1), 'name') =~# 'Comment$' + let max = col + else + let min = col + 1 + endif + endwhile + let pline = strpart(pline, 0, min - 1) + endif + else + let col = 0 + while col < pline_len + if pline[col] == '#' + let pline = strpart(pline, 0, col) + break + endif + let col = col + 1 + endwhile + endif + + if cline =~# '^\s*\(if\|when\|for\|while\|case\|of\|try\)\>' + " This is a benign line, do nothing + return -1 + endif + + " If the current line begins with a keyword that lines up with "try" + if cline =~# '^\s*\(except\|finally\)\>' + let lnum = a:lnum - 1 + while lnum >= 1 + if getline(lnum) =~# '^\s*\(try\|except\)\>' + let ind = indent(lnum) + if ind >= clindent + return -1 " indent is already less than this + endif + return ind " line up with previous try or except + endif + let lnum = lnum - 1 + endwhile + return -1 " no matching "try"! + endif + + " If the current line begins with a header keyword, dedent + if cline =~# '^\s*\(elif\|else\)\>' + return s:FindStartLine(a:lnum, '^\s*\(if\|when\|elif\|of\)') + endif + + if pline =~# ':\s*$' + "return s:FindStartLine(plnum, '(^\s*\(if\|when\|else\|elif\|case\|of\|try\|except\|finally\)\>)\|\') + &sw + return s:FindStartLine(plnum, '^\s*\(if\|when\|else\|elif\|for\|while\|case\|of\|try\|except\|finally\)\>') + &sw + endif + + if pline =~# '=\s*$' + return s:FindStartLine(plnum, '^\s*\(proc\|template\|macro\|iterator\)\>') + &sw + endif + + " if we got here, this should be the begging of a multi-line if expression for example + if pline =~# '^\s*\(if\|when\|proc\|iterator\|macro\|template\|for\|while\)[^:]*$' + return plindent + &sw + endif + + if pline =~# '\(type\|import\|const\|var\|let\)\s*$' + \ || pline =~# '=\s*\(object\|enum\|tuple\|concept\)' + return plindent + &sw + endif + + " If the previous line was a stop-execution statement... + if pline =~# '^\s*\(break\|continue\|raise\|return\)\>' + " See if the user has already dedented + if indent(a:lnum) > plindent - &sw + " If not, recommend one dedent + return plindent - &sw + endif + " Otherwise, trust the user + return -1 + endif + + return -1 + +endfunction + +" vim:sw=2 + diff --git a/syntax/nim.vim b/syntax/nim.vim new file mode 100644 index 0000000..7534a67 --- /dev/null +++ b/syntax/nim.vim @@ -0,0 +1,205 @@ +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if v:version < 600 + syntax clear +elseif exists('b:current_syntax') + finish +endif + +" Keep user-supplied options +if !exists('nim_highlight_numbers') + let nim_highlight_numbers = 1 +endif +if !exists('nim_highlight_builtins') + let nim_highlight_builtins = 1 +endif +if !exists('nim_highlight_exceptions') + let nim_highlight_exceptions = 1 +endif +if !exists('nim_highlight_space_errors') + let nim_highlight_space_errors = 1 +endif +if !exists('nim_highlight_special_vars') + let nim_highlight_special_vars = 1 +endif + +if exists('nim_highlight_all') + let nim_highlight_numbers = 1 + let nim_highlight_builtins = 1 + let nim_highlight_exceptions = 1 + let nim_highlight_space_errors = 1 + let nim_highlight_special_vars = 1 +endif + +syn region nimBrackets contained extend keepend matchgroup=Bold start=+\(\\\)\@/' + exe 'syn match nimNumber /\v<0[ocC]\o%(_?\o)*%('.s:int_suf.'|'.s:float_suf.')?>/' + exe 'syn match nimNumber /\v<0[xX]\x%(_?\x)*%('.s:int_suf.'|'.s:float_suf.')?>/' + exe 'syn match nimNumber /\v<'.s:dec_num.'%('.s:int_suf.'|'.s:exp.'?'.s:float_suf.'?)>/' + exe 'syn match nimNumber /\v<'.s:dec_num.'\.'.s:dec_num.s:exp.'?'.s:float_suf.'?>/' + unlet s:dec_num s:int_suf s:float_suf s:exp +endif + +if nim_highlight_builtins == 1 + " builtin functions, types and objects, not really part of the syntax + syn keyword nimBuiltin int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 + syn keyword nimBuiltin bool void chr char string cstring pointer range array openarray openArray seq varargs varArgs + syn keyword nimBuiltin set Byte Natural Positive Conversion + syn keyword nimBuiltin BiggestInt BiggestFloat cchar cschar cshort cint csize cuchar cushort + syn keyword nimBuiltin clong clonglong cfloat cdouble clongdouble cuint culong culonglong cchar + syn keyword nimBuiltin CompileDate CompileTime nimversion nimVersion nimmajor nimMajor + syn keyword nimBuiltin nimminor nimMinor nimpatch nimPatch cpuendian cpuEndian hostos hostOS hostcpu hostCPU inf + syn keyword nimBuiltin neginf nan QuitSuccess QuitFailure dbglinehook dbgLineHook stdin + syn keyword nimBuiltin stdout stderr defined new high low sizeof succ pred + syn keyword nimBuiltin inc dec newseq newSeq len incl excl card ord chr ze ze64 + syn keyword nimBuiltin tou8 toU8 tou16 toU16 tou32 toU32 abs min max add repr + syn match nimBuiltin "\" + syn keyword nimBuiltin tofloat toFloat tobiggestfloat toBiggestFloat toint toInt tobiggestint toBiggestInt + syn keyword nimBuiltin addquitproc addQuitProc + syn keyword nimBuiltin copy setlen setLen newstring newString zeromem zeroMem copymem copyMem movemem moveMem + syn keyword nimBuiltin equalmem equalMem alloc alloc0 realloc dealloc assert + syn keyword nimBuiltin typedesc typed untyped stmt expr + syn keyword nimBuiltin echo swap getrefcount getRefcount getcurrentexception getCurrentException Msg + syn keyword nimBuiltin getoccupiedmem getOccupiedMem getfreemem getFreeMem gettotalmem getTotalMem isnil isNil seqtoptr seqToPtr + syn keyword nimBuiltin find pop GC_disable GC_enable GC_fullCollect + syn keyword nimBuiltin GC_setStrategy GC_enableMarkAndSweep GC_Strategy + syn keyword nimBuiltin GC_disableMarkAnd Sweep GC_getStatistics GC_ref + syn keyword nimBuiltin GC_ref GC_ref GC_unref GC_unref GC_unref quit + syn keyword nimBuiltin OpenFile OpenFile CloseFile EndOfFile readChar + syn keyword nimBuiltin FlushFile readfile readFile readline readLine write writeln writeLn writeline writeLine + syn keyword nimBuiltin getfilesize getFileSize ReadBytes ReadChars readbuffer readBuffer writebytes writeBytes + syn keyword nimBuiltin writechars writeChars writebuffer writeBuffer setfilepos setFilePos getfilepos getFilePos + syn keyword nimBuiltin filehandle fileHandle countdown countup items lines + syn keyword nimBuiltin FileMode File RootObj FileHandle ByteAddress Endianness +endif + +if nim_highlight_exceptions == 1 + " builtin exceptions and warnings + syn keyword nimException E_Base EAsynch ESynch ESystem EIO EOS + syn keyword nimException ERessourceExhausted EArithmetic EDivByZero + syn keyword nimException EOverflow EAccessViolation EAssertionFailed + syn keyword nimException EControlC EInvalidValue EOutOfMemory EInvalidIndex + syn keyword nimException EInvalidField EOutOfRange EStackOverflow + syn keyword nimException ENoExceptionToReraise EInvalidObjectAssignment + syn keyword nimException EInvalidObject EInvalidLibrary EInvalidKey + syn keyword nimException EInvalidObjectConversion EFloatingPoint + syn keyword nimException EFloatInvalidOp EFloatDivByZero EFloatOverflow + syn keyword nimException EFloatInexact EDeadThread EResourceExhausted + syn keyword nimException EFloatUnderflow +endif + +if nim_highlight_space_errors == 1 + " trailing whitespace + syn match nimSpaceError display excludenl "\S\s\+$"ms=s+1 + " any tabs are illegal in nim + syn match nimSpaceError display "\t" +endif + +if nim_highlight_special_vars + syn keyword nimSpecialVar result +endif + +syn sync match nimSync grouphere NONE "):$" +syn sync maxlines=200 +syn sync minlines=2000 + +if v:version >= 508 || !exists('did_nim_syn_inits') + if v:version <= 508 + let did_nim_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + " The default methods for highlighting. Can be overridden later + HiLink nimBrackets Operator + HiLink nimKeyword Keyword + HiLink nimFunction Function + HiLink nimConditional Conditional + HiLink nimRepeat Repeat + HiLink nimString String + HiLink nimRawString String + HiLink nimBoolean Boolean + HiLink nimEscape Special + HiLink nimOperator Operator + HiLink nimPreCondit PreCondit + HiLink nimComment Comment + HiLink nimTodo Todo + HiLink nimDecorator Define + HiLink nimSpecialVar Identifier + + if nim_highlight_numbers == 1 + HiLink nimNumber Number + endif + + if nim_highlight_builtins == 1 + HiLink nimBuiltin Number + endif + + if nim_highlight_exceptions == 1 + HiLink nimException Exception + endif + + if nim_highlight_space_errors == 1 + HiLink nimSpaceError Error + endif + + delcommand HiLink +endif + +let b:current_syntax = 'nim' + diff --git a/syntax/nimrod.vim b/syntax/nimrod.vim deleted file mode 100644 index 9f4a9d3..0000000 --- a/syntax/nimrod.vim +++ /dev/null @@ -1,187 +0,0 @@ -" Vim syntax file -" Language: Nimrod -" Maintainer: Kearn Holliday (thekearnman at gmail dot com) -" Updated: 2009-05-15 -" -" Options to control nimrod syntax highlighting: -" -" For highlighted numbers: -" - let nimrod_highlight_numbers = 1 -" -" For highlighted builtin functions: -" - let nimrod_highlight_builtins = 1 -" -" For highlighted standard exceptions: -" - let nimrod_highlight_exceptions = 1 -" -" Highlight erroneous whitespace: -" - let nimrod_highlight_space_errors = 1 -" -" If you want all possible nimrod highlighting (the same as setting the -" preceding options): -" -" let nimrod_highlight_all = 1 -" - -" For version 5.x: Clear all syntax items -" For version 6.x: Quit when a syntax file was already loaded -if version < 600 - syntax clear -elseif exists("b:current_syntax") - finish -endif - -syn region nimrodBrackets contained extend keepend matchgroup=Bold start=+\(\\\)\@" - syn match nimrodNumber "\<\d\+[LljJ]\=\>" - syn match nimrodNumber "\.\d\+\([eE][+-]\=\d\+\)\=[jJ]\=\>" - syn match nimrodNumber "\<\d\+\.\([eE][+-]\=\d\+\)\=[jJ]\=\>" - syn match nimrodNumber "\<\d\+\.\d\+\([eE][+-]\=\d\+\)\=[jJ]\=\>" -endif - -if exists("nimrod_highlight_builtins") - " builtin functions, types and objects, not really part of the syntax - syn keyword nimrodBuiltin int int8 int16 int32 int64 float float32 float64 bool - syn keyword nimrodBuiltin char string cstring pointer range array openarray seq - syn keyword nimrodBuiltin set Byte Natural Positive TObject PObject Conversion TResult TAddress - syn keyword nimrodBuiltin BiggestInt BiggestFloat cchar cschar cshort cint - syn keyword nimrodBuiltin clong clonglong cfloat cdouble clongdouble - syn keyword nimrodBuiltin cstringArray TEndian PFloat32 PFloat64 PInt64 PInt32 - syn keyword nimrodBuiltin TGC_Strategy TFile TFileMode TFileHandle isMainModule - syn keyword nimrodBuiltin CompileDate CompileTime NimrodVersion NimrodMajor - syn keyword nimrodBuiltin NimrodMinor NimrodPatch cpuEndian hostOS hostCPU inf - syn keyword nimrodBuiltin neginf nan QuitSuccess QuitFailure dbgLineHook stdin - syn keyword nimrodBuiltin stdout stderr defined new high low sizeof succ pred - syn keyword nimrodBuiltin inc dec newSeq len incl excl card ord chr ze ze64 - syn keyword nimrodBuiltin toU8 toU16 toU32 abs min max add repr - syn match nimrodBuiltin "\" - syn keyword nimrodBuiltin toFloat toBiggestFloat toInt toBiggestInt addQuitProc - syn keyword nimrodBuiltin copy setLen newString zeroMem copyMem moveMem - syn keyword nimrodBuiltin equalMem alloc alloc0 realloc dealloc setLen assert - syn keyword nimrodBuiltin swap getRefcount getCurrentException Msg - syn keyword nimrodBuiltin getOccupiedMem getFreeMem getTotalMem isNil seqToPtr - syn keyword nimrodBuiltin find pop GC_disable GC_enable GC_fullCollect - syn keyword nimrodBuiltin GC_setStrategy GC_enableMarkAnd Sweep - syn keyword nimrodBuiltin GC_disableMarkAnd Sweep GC_getStatistics GC_ref - syn keyword nimrodBuiltin GC_ref GC_ref GC_unref GC_unref GC_unref quit - syn keyword nimrodBuiltin OpenFile OpenFile CloseFile EndOfFile readChar - syn keyword nimrodBuiltin FlushFile readFile write readLine writeln writeln - syn keyword nimrodBuiltin getFileSize ReadBytes ReadChars readBuffer writeBytes - syn keyword nimrodBuiltin writeChars writeBuffer setFilePos getFilePos - syn keyword nimrodBuiltin fileHandle countdown countup items lines -endif - -if exists("nimrod_highlight_exceptions") - " builtin exceptions and warnings - syn keyword nimrodException E_Base EAsynch ESynch ESystem EIO EOS - syn keyword nimrodException ERessourceExhausted EArithmetic EDivByZero - syn keyword nimrodException EOverflow EAccessViolation EAssertionFailed - syn keyword nimrodException EControlC EInvalidValue EOutOfMemory EInvalidIndex - syn keyword nimrodException EInvalidField EOutOfRange EStackOverflow - syn keyword nimrodException ENoExceptionToReraise EInvalidObjectAssignment - syn keyword nimrodException EInvalidObject -endif - -if exists("nimrod_highlight_space_errors") - " trailing whitespace - syn match nimrodSpaceError display excludenl "\S\s\+$"ms=s+1 - " mixed tabs and spaces - syn match nimrodSpaceError display " \+\t" - syn match nimrodSpaceError display "\t\+ " -endif - -syn sync match nimrodSync grouphere NONE "):$" -syn sync maxlines=200 -syn sync minlines=2000 - -if version >= 508 || !exists("did_nimrod_syn_inits") - if version <= 508 - let did_nimrod_syn_inits = 1 - command -nargs=+ HiLink hi link - else - command -nargs=+ HiLink hi def link - endif - - " The default methods for highlighting. Can be overridden later - HiLink nimrodBrackets Operator - HiLink nimrodStatement Statement - HiLink nimrodFunction Function - HiLink nimrodConditional Conditional - HiLink nimrodRepeat Repeat - HiLink nimrodString String - HiLink nimrodRawString String - HiLink nimrodEscape Special - HiLink nimrodOperator Operator - HiLink nimrodPreCondit PreCondit - HiLink nimrodComment Comment - HiLink nimrodTodo Todo - HiLink nimrodDecorator Define - if exists("nimrod_highlight_numbers") - HiLink nimrodNumber Number - endif - if exists("nimrod_highlight_builtins") - HiLink nimrodBuiltin Number - endif - if exists("nimrod_highlight_exceptions") - HiLink nimrodException Exception - endif - if exists("nimrod_highlight_space_errors") - HiLink nimrodSpaceError Error - endif - - delcommand HiLink -endif - -let b:current_syntax = "nimrod" - -