Browse Source

put vim golang files directly in ~/.vim

raylu 12 years ago
parent
commit
dfec64c37c
5 changed files with 272 additions and 42 deletions
  1. 0 1
      vim/ftdetect/gofiletype.vim
  2. 23 0
      vim/ftdetect/gofiletype.vim
  3. 42 40
      vim/indent/go.vim
  4. 0 1
      vim/syntax/go.vim
  5. 207 0
      vim/syntax/go.vim

+ 0 - 1
vim/ftdetect/gofiletype.vim

@@ -1 +0,0 @@
-/home/raylu/go/misc/vim/ftdetect/gofiletype.vim

+ 23 - 0
vim/ftdetect/gofiletype.vim

@@ -0,0 +1,23 @@
+" 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()
+  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()
+  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()

+ 42 - 40
vim/indent/go.vim

@@ -1,62 +1,64 @@
-" Vim indent file
-" Language:	Go
-" Author:	Alecs King <alecsk@gmail.com>
+" Copyright 2011 The Go Authors. All rights reserved.
+" Use of this source code is governed by a BSD-style
+" license that can be found in the LICENSE file.
 "
-" inspired by indent/lua.vim
+" indent/go.vim: Vim indent file for Go.
 "
-" very simple:
-" just indent common cases to avoid manually typing tab or backspace
-"
-" for better style, please use gofmt after done editing.
-"
-" since it just simply uses regex matches,
-" there might be some mis-indented corner cases.
-" 
+" TODO:
+" - function invocations split across lines
+" - general line splits (line ends in an operator)
 
-" Only load this indent file when no other was loaded.
 if exists("b:did_indent")
-  finish
+    finish
 endif
 let b:did_indent = 1
 
-setlocal indentexpr=GetGoIndent()
-
-" To make Vim call GetLuaIndent() when it finds '\s*)', '\s*}', '\s*case', '\s*default'
-setlocal indentkeys+=0=),0=},0=case,0=default
-
+" 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=)
 
-" Only define the function once.
-if exists("*GetGoIndent")
+if exists("*GoIndent")
   finish
 endif
 
-function! GetGoIndent()
-  " Find a non-blank line above the current line.
-  let prevlnum = prevnonblank(v:lnum - 1)
-
-  " Hit the start of the file, use zero indent.
+function! GoIndent(lnum)
+  let prevlnum = prevnonblank(a:lnum-1)
   if prevlnum == 0
+    " top of file
     return 0
   endif
 
-  " Add a 'shiftwidth' after lines that start a block:
-  " 'case', 'default', '{', '('
-  let ind = indent(prevlnum)
-  let prevline = getline(prevlnum)
-  let midx = match(prevline, '^\s*\%(case\>\|default\>\)')
-  if midx == -1
-    let midx = match(prevline, '[({]\s*$')
+  " grab the previous and current line, stripping comments.
+  let prevl = substitute(getline(prevlnum), '//.*$', '', '')
+  let thisl = substitute(getline(a:lnum), '//.*$', '', '')
+  let previ = indent(prevlnum)
+
+  let ind = previ
+
+  if prevl =~ '[({]\s*$'
+    " previous line opened a block
+    let ind += &sw
   endif
-  if midx != -1
-    let ind = ind + &shiftwidth
+  if prevl =~# '^\s*\(case .*\|default\):$'
+    " previous line is part of a switch statement
+    let ind += &sw
+  endif
+  " TODO: handle if the previous line is a label.
+
+  if thisl =~ '^\s*[)}]'
+    " this line closed a block
+    let ind -= &sw
   endif
 
-  " Subtract a 'shiftwidth' on 'case', 'default', '}', ')'.
-  " This is the part that requires 'indentkeys'.
-  let midx = match(getline(v:lnum), '^\s*\%(case\>\|default\>\|[)}]\)')
-  if midx != -1
-    let ind = ind - &shiftwidth
+  " 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 thisl =~# '^\s*\(case .*\|default\):$'
+    let ind -= &sw
   endif
 
   return ind

+ 0 - 1
vim/syntax/go.vim

@@ -1 +0,0 @@
-/home/raylu/go/misc/vim/syntax/go.vim

+ 207 - 0
vim/syntax/go.vim

@@ -0,0 +1,207 @@
+" Copyright 2009 The Go Authors. All rights reserved.
+" Use of this source code is governed by a BSD-style
+" license that can be found in the LICENSE file.
+"
+" go.vim: Vim syntax file for Go.
+"
+" 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.
+"
+"   - go_highlight_array_whitespace_error
+"     Highlights white space after "[]".
+"   - go_highlight_chan_whitespace_error
+"     Highlights white space around the communications operator that don't follow
+"     the standard style.
+"   - go_highlight_extra_types
+"     Highlights commonly used library types (io.Reader, etc.).
+"   - go_highlight_space_tab_error
+"     Highlights instances of tabs following spaces.
+"   - 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("go_highlight_array_whitespace_error")
+  let go_highlight_array_whitespace_error = 1
+endif
+if !exists("go_highlight_chan_whitespace_error")
+  let go_highlight_chan_whitespace_error = 1
+endif
+if !exists("go_highlight_extra_types")
+  let go_highlight_extra_types = 1
+endif
+if !exists("go_highlight_space_tab_error")
+  let go_highlight_space_tab_error = 1
+endif
+if !exists("go_highlight_trailing_whitespace_error")
+  let 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"