I've attached a patch to add a "go" filetype to vim, with syntax highlighting
and filetype configuration. I also updated the vim-ft-vroom repo URL to point
to the renamed repo while I'm at it ("vim-ft.vroom"->"vim-ft-vroom").
These files originally came from the golang repository and are currently
maintained at https://github.com/google/vim-ft-go. The files are under a BSD
license there, but I've obtained approval from Google to include them in vim
under the Vim license.
David
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.
diff -r 7af530381fec runtime/compiler/go.vim
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/compiler/go.vim Mon Aug 18 09:49:30 2014 -0700
@@ -0,0 +1,29 @@
+" Vim compiler file
+" Compiler: Go
+" Maintainer: David Barnett (https://github.com/google/vim-ft-go)
+" Last Change: 2014 Aug 16
+
+if exists('current_compiler')
+ finish
+endif
+let current_compiler = 'go'
+
+if exists(':CompilerSet') != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+CompilerSet makeprg=go\ build
+CompilerSet errorformat=
+ \%-G#\ %.%#,
+ \%A%f:%l:%c:\ %m,
+ \%A%f:%l:\ %m,
+ \%C%*\\s%m,
+ \%-G%.%#
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: sw=2 sts=2 et
diff -r 7af530381fec runtime/ftdetect/gofiletype.vim
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/ftdetect/gofiletype.vim Mon Aug 18 09:49:30 2014 -0700
@@ -0,0 +1,25 @@
+" We take care to preserve the user's fileencodings and fileformats,
+" because those settings are global (not buffer local), yet we want
+" to override them for loading Go files, which are defined to be UTF-8.
+let s:current_fileformats = ''
+let s:current_fileencodings = ''
+
+" define fileencodings to open as utf-8 encoding even if it's ascii.
+function! s:gofiletype_pre() abort
+ let s:current_fileformats = &g:fileformats
+ let s:current_fileencodings = &g:fileencodings
+ set fileencodings=utf-8 fileformats=unix
+ setlocal filetype=go
+endfunction
+
+" restore fileencodings as others
+function! s:gofiletype_post() abort
+ let &g:fileformats = s:current_fileformats
+ let &g:fileencodings = s:current_fileencodings
+endfunction
+
+au BufNewFile *.go setlocal filetype=go fileencoding=utf-8 fileformat=unix
+au BufRead *.go call s:gofiletype_pre()
+au BufReadPost *.go call s:gofiletype_post()
+
+" vim: sw=2 sts=2 et
diff -r 7af530381fec runtime/ftplugin/go.vim
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/ftplugin/go.vim Mon Aug 18 09:49:30 2014 -0700
@@ -0,0 +1,18 @@
+" Vim filetype plugin file
+" Language: Go
+" Maintainer: David Barnett (https://github.com/google/vim-ft-go)
+" Last Change: 2014 Aug 16
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal formatoptions-=t
+
+setlocal comments=s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl fo< com< cms<'
+
+" vim: sw=2 sts=2 et
diff -r 7af530381fec runtime/ftplugin/vroom.vim
--- a/runtime/ftplugin/vroom.vim Sun Aug 17 17:24:07 2014 +0200
+++ b/runtime/ftplugin/vroom.vim Mon Aug 18 09:49:30 2014 -0700
@@ -1,6 +1,6 @@
" Vim filetype plugin file
" Language: Vroom (vim testing and executable documentation)
-" Maintainer: David Barnett (https://github.com/google/vim-ft.vroom)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-vroom)
" Last Change: 2014 Jul 23
if exists('b:did_ftplugin')
diff -r 7af530381fec runtime/indent/go.vim
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/indent/go.vim Mon Aug 18 09:49:30 2014 -0700
@@ -0,0 +1,78 @@
+" Vim indent file
+" Language: Go
+" Maintainer: David Barnett (https://github.com/google/vim-ft-go)
+" Last Change: 2014 Aug 16
+"
+" TODO:
+" - function invocations split across lines
+" - general line splits (line ends in an operator)
+
+if exists('b:did_indent')
+ finish
+endif
+let b:did_indent = 1
+
+" C indentation is too far off useful, mainly due to Go's := operator.
+" Let's just define our own.
+setlocal nolisp
+setlocal autoindent
+setlocal indentexpr=GoIndent(v:lnum)
+setlocal indentkeys+=<:>,0=},0=)
+
+if exists('*GoIndent')
+ finish
+endif
+
+" The shiftwidth() function is relatively new.
+" Don't require it to exist.
+if exists('*shiftwidth')
+ function s:sw() abort
+ return shiftwidth()
+ endfunction
+else
+ function s:sw() abort
+ return &shiftwidth
+ endfunction
+endif
+
+function! GoIndent(lnum)
+ let l:prevlnum = prevnonblank(a:lnum-1)
+ if l:prevlnum == 0
+ " top of file
+ return 0
+ endif
+
+ " grab the previous and current line, stripping comments.
+ let l:prevl = substitute(getline(l:prevlnum), '//.*$', '', '')
+ let l:thisl = substitute(getline(a:lnum), '//.*$', '', '')
+ let l:previ = indent(l:prevlnum)
+
+ let l:ind = l:previ
+
+ if l:prevl =~ '[({]\s*$'
+ " previous line opened a block
+ let l:ind += s:sw()
+ endif
+ if l:prevl =~# '^\s*\(case .*\|default\):$'
+ " previous line is part of a switch statement
+ let l:ind += s:sw()
+ endif
+ " TODO: handle if the previous line is a label.
+
+ if l:thisl =~ '^\s*[)}]'
+ " this line closed a block
+ let l:ind -= s:sw()
+ endif
+
+ " Colons are tricky.
+ " We want to outdent if it's part of a switch ("case foo:" or "default:").
+ " We ignore trying to deal with jump labels because (a) they're rare, and
+ " (b) they're hard to disambiguate from a composite literal key.
+ if l:thisl =~# '^\s*\(case .*\|default\):$'
+ let l:ind -= s:sw()
+ endif
+
+ return l:ind
+endfunction
+
+" vim: sw=2 sts=2 et
diff -r 7af530381fec runtime/indent/vroom.vim
--- a/runtime/indent/vroom.vim Sun Aug 17 17:24:07 2014 +0200
+++ b/runtime/indent/vroom.vim Mon Aug 18 09:49:30 2014 -0700
@@ -1,6 +1,6 @@
" Vim indent file
" Language: Vroom (vim testing and executable documentation)
-" Maintainer: David Barnett (https://github.com/google/vim-ft.vroom)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-vroom)
" Last Change: 2014 Jul 23
if exists('b:did_indent')
diff -r 7af530381fec runtime/syntax/go.vim
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/syntax/go.vim Mon Aug 18 09:49:30 2014 -0700
@@ -0,0 +1,208 @@
+" Vim syntax file
+" Language: Go
+" Maintainer: David Barnett (https://github.com/google/vim-ft-go)
+" Last Change: 2014 Aug 16
+
+" Options:
+" There are some options for customizing the highlighting; the recommended
+" settings are the default values, but you can write:
+" let OPTION_NAME = 0
+" in your ~/.vimrc file to disable particular options. You can also write:
+" let OPTION_NAME = 1
+" to enable particular options. At present, all options default to on.
+"
+" - g:go_highlight_array_whitespace_error
+" Highlights white space after "[]".
+" - g:go_highlight_chan_whitespace_error
+" Highlights white space around the communications operator that don't
+" follow the standard style.
+" - g:go_highlight_extra_types
+" Highlights commonly used library types (io.Reader, etc.).
+" - g:go_highlight_space_tab_error
+" Highlights instances of tabs following spaces.
+" - g:go_highlight_trailing_whitespace_error
+" Highlights trailing white space.
+
+" Quit when a (custom) syntax file was already loaded
+if exists('b:current_syntax')
+ finish
+endif
+
+if !exists('g:go_highlight_array_whitespace_error')
+ let g:go_highlight_array_whitespace_error = 1
+endif
+if !exists('g:go_highlight_chan_whitespace_error')
+ let g:go_highlight_chan_whitespace_error = 1
+endif
+if !exists('g:go_highlight_extra_types')
+ let g:go_highlight_extra_types = 1
+endif
+if !exists('g:go_highlight_space_tab_error')
+ let g:go_highlight_space_tab_error = 1
+endif
+if !exists('g:go_highlight_trailing_whitespace_error')
+ let g:go_highlight_trailing_whitespace_error = 1
+endif
+
+syn case match
+
+syn keyword goDirective package import
+syn keyword goDeclaration var const type
+syn keyword goDeclType struct interface
+
+hi def link goDirective Statement
+hi def link goDeclaration Keyword
+hi def link goDeclType Keyword
+
+" Keywords within functions
+syn keyword goStatement defer go goto return break continue fallthrough
+syn keyword goConditional if else switch select
+syn keyword goLabel case default
+syn keyword goRepeat for range
+
+hi def link goStatement Statement
+hi def link goConditional Conditional
+hi def link goLabel Label
+hi def link goRepeat Repeat
+
+" Predefined types
+syn keyword goType chan map bool string error
+syn keyword goSignedInts int int8 int16 int32 int64 rune
+syn keyword goUnsignedInts byte uint uint8 uint16 uint32 uint64 uintptr
+syn keyword goFloats float32 float64
+syn keyword goComplexes complex64 complex128
+
+hi def link goType Type
+hi def link goSignedInts Type
+hi def link goUnsignedInts Type
+hi def link goFloats Type
+hi def link goComplexes Type
+
+" Treat func specially: it's a declaration at the start of a line, but a type
+" elsewhere. Order matters here.
+syn match goType /\<func\>/
+syn match goDeclaration /^func\>/
+
+" Predefined functions and values
+syn keyword goBuiltins append cap close complex copy delete imag len
+syn keyword goBuiltins make new panic print println real recover
+syn keyword goConstants iota true false nil
+
+hi def link goBuiltins Keyword
+hi def link goConstants Keyword
+
+" Comments; their contents
+syn keyword goTodo contained TODO FIXME XXX BUG
+syn cluster goCommentGroup contains=goTodo
+syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell
+syn region goComment start="//" end="$" contains=@goCommentGroup,@Spell
+
+hi def link goComment Comment
+hi def link goTodo Todo
+
+" Go escapes
+syn match goEscapeOctal display contained "\\[0-7]\{3}"
+syn match goEscapeC display contained +\\[abfnrtv\\'"]+
+syn match goEscapeX display contained "\\x\x\{2}"
+syn match goEscapeU display contained "\\u\x\{4}"
+syn match goEscapeBigU display contained "\\U\x\{8}"
+syn match goEscapeError display contained +\\[^0-7xuUabfnrtv\\'"]+
+
+hi def link goEscapeOctal goSpecialString
+hi def link goEscapeC goSpecialString
+hi def link goEscapeX goSpecialString
+hi def link goEscapeU goSpecialString
+hi def link goEscapeBigU goSpecialString
+hi def link goSpecialString Special
+hi def link goEscapeError Error
+
+" Strings and their contents
+syn cluster goStringGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU,goEscapeError
+syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup
+syn region goRawString start=+`+ end=+`+
+
+hi def link goString String
+hi def link goRawString String
+
+" Characters; their contents
+syn cluster goCharacterGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU
+syn region goCharacter start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@goCharacterGroup
+
+hi def link goCharacter Character
+
+" Regions
+syn region goBlock start="{" end="}" transparent fold
+syn region goParen start='(' end=')' transparent
+
+" Integers
+syn match goDecimalInt "\<\d\+\([Ee]\d\+\)\?\>"
+syn match goHexadecimalInt "\<0x\x\+\>"
+syn match goOctalInt "\<0\o\+\>"
+syn match goOctalError "\<0\o*[89]\d*\>"
+
+hi def link goDecimalInt Integer
+hi def link goHexadecimalInt Integer
+hi def link goOctalInt Integer
+hi def link Integer Number
+
+" Floating point
+syn match goFloat "\<\d\+\.\d*\([Ee][-+]\d\+\)\?\>"
+syn match goFloat "\<\.\d\+\([Ee][-+]\d\+\)\?\>"
+syn match goFloat "\<\d\+[Ee][-+]\d\+\>"
+
+hi def link goFloat Float
+
+" Imaginary literals
+syn match goImaginary "\<\d\+i\>"
+syn match goImaginary "\<\d\+\.\d*\([Ee][-+]\d\+\)\?i\>"
+syn match goImaginary "\<\.\d\+\([Ee][-+]\d\+\)\?i\>"
+syn match goImaginary "\<\d\+[Ee][-+]\d\+i\>"
+
+hi def link goImaginary Number
+
+" Spaces after "[]"
+if go_highlight_array_whitespace_error != 0
+ syn match goSpaceError display "\(\[\]\)\@<=\s\+"
+endif
+
+" Spacing errors around the 'chan' keyword
+if go_highlight_chan_whitespace_error != 0
+ " receive-only annotation on chan type
+ syn match goSpaceError display "\(<-\)\@<=\s\+\(chan\>\)\@="
+ " send-only annotation on chan type
+ syn match goSpaceError display "\(\<chan\)\@<=\s\+\(<-\)\@="
+ " value-ignoring receives in a few contexts
+ syn match goSpaceError display "\(\(^\|[={(,;]\)\s*<-\)\@<=\s\+"
+endif
+
+" Extra types commonly seen
+if go_highlight_extra_types != 0
+ syn match goExtraType /\<bytes\.\(Buffer\)\>/
+ syn match goExtraType /\<io\.\(Reader\|Writer\|ReadWriter\|ReadWriteCloser\)\>/
+ syn match goExtraType /\<reflect\.\(Kind\|Type\|Value\)\>/
+ syn match goExtraType /\<unsafe\.Pointer\>/
+endif
+
+" Space-tab error
+if go_highlight_space_tab_error != 0
+ syn match goSpaceError display " \+\t"me=e-1
+endif
+
+" Trailing white space error
+if go_highlight_trailing_whitespace_error != 0
+ syn match goSpaceError display excludenl "\s\+$"
+endif
+
+hi def link goExtraType Type
+hi def link goSpaceError Error
+
+" Search backwards for a global declaration to start processing the syntax.
+"syn sync match goSync grouphere NONE /^\(const\|var\|type\|func\)\>/
+
+" There's a bug in the implementation of grouphere. For now, use the
+" following as a more expensive/less precise workaround.
+syn sync minlines=500
+
+let b:current_syntax = 'go'
+
+" vim: sw=2 sts=2 et
diff -r 7af530381fec runtime/syntax/godoc.vim
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/syntax/godoc.vim Mon Aug 18 09:49:30 2014 -0700
@@ -0,0 +1,21 @@
+" Vim syntax file
+" Language: Godoc (generated documentation for go)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-go)
+" Last Change: 2014 Aug 16
+
+if exists('b:current_syntax')
+ finish
+endif
+
+syn case match
+syn match godocTitle "^\([A-Z][A-Z ]*\)$"
+
+command -nargs=+ HiLink hi def link <args>
+
+HiLink godocTitle Title
+
+delcommand HiLink
+
+let b:current_syntax = 'godoc'
+
+" vim: sw=2 sts=2 et
diff -r 7af530381fec runtime/syntax/vroom.vim
--- a/runtime/syntax/vroom.vim Sun Aug 17 17:24:07 2014 +0200
+++ b/runtime/syntax/vroom.vim Mon Aug 18 09:49:30 2014 -0700
@@ -1,6 +1,6 @@
" Vim syntax file
" Language: Vroom (vim testing and executable documentation)
-" Maintainer: David Barnett (https://github.com/google/vim-ft.vroom)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-vroom)
" Last Change: 2014 Jul 23
" For version 5.x: Clear all syntax items.