-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
elij
committed
Jul 24, 2012
1 parent
048b281
commit 02ab15a
Showing
9 changed files
with
708 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
" 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. | ||
" | ||
" This file provides a utility function that performs auto-completion of | ||
" package names, for use by other commands. | ||
|
||
let s:goos = $GOOS | ||
let s:goarch = $GOARCH | ||
|
||
if len(s:goos) == 0 | ||
if exists('g:golang_goos') | ||
let s:goos = g:golang_goos | ||
elseif has('win32') || has('win64') | ||
let s:goos = 'windows' | ||
elseif has('macunix') | ||
let s:goos = 'darwin' | ||
else | ||
let s:goos = '*' | ||
endif | ||
endif | ||
|
||
if len(s:goarch) == 0 | ||
if exists('g:golang_goarch') | ||
let s:goarch = g:golang_goarch | ||
else | ||
let s:goarch = '*' | ||
endif | ||
endif | ||
|
||
function! go#complete#Package(ArgLead, CmdLine, CursorPos) | ||
let goroot = $GOROOT | ||
if len(goroot) == 0 | ||
" should not occur. | ||
return [] | ||
endif | ||
let ret = {} | ||
let root = expand(goroot.'/pkg/'.s:goos.'_'.s:goarch) | ||
for i in split(globpath(root, a:ArgLead.'*'), "\n") | ||
if isdirectory(i) | ||
let i .= '/' | ||
elseif i !~ '\.a$' | ||
continue | ||
endif | ||
let i = substitute(substitute(i[len(root)+1:], '[\\]', '/', 'g'), '\.a$', '', 'g') | ||
let ret[i] = i | ||
endfor | ||
return sort(keys(ret)) | ||
endfunction |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,24 @@ | ||
au BufRead,BufNewFile *.go set filetype=go sw=4 ts=4 noet | ||
" 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() | ||
" au BufRead,BufNewFile *.go set filetype=go sw=4 ts=4 noet |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
" 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. | ||
" | ||
" fmt.vim: Vim command to format Go files with gofmt. | ||
" | ||
" This filetype plugin add a new commands for go buffers: | ||
" | ||
" :Fmt | ||
" | ||
" Filter the current Go buffer through gofmt. | ||
" It tries to preserve cursor position and avoids | ||
" replacing the buffer with stderr output. | ||
" | ||
|
||
command! -buffer Fmt call s:GoFormat() | ||
|
||
function! s:GoFormat() | ||
let view = winsaveview() | ||
silent %!gofmt | ||
if v:shell_error | ||
let errors = [] | ||
for line in getline(1, line('$')) | ||
let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)') | ||
if !empty(tokens) | ||
call add(errors, {"filename": @%, | ||
\"lnum": tokens[2], | ||
\"col": tokens[3], | ||
\"text": tokens[4]}) | ||
endif | ||
endfor | ||
if empty(errors) | ||
% | " Couldn't detect gofmt error format, output errors | ||
endif | ||
undo | ||
if !empty(errors) | ||
call setloclist(0, errors, 'r') | ||
endif | ||
echohl Error | echomsg "Gofmt returned error" | echohl None | ||
endif | ||
call winrestview(view) | ||
endfunction | ||
|
||
" vim:ts=4:sw=4:et |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
" 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. | ||
" | ||
" godoc.vim: Vim command to see godoc. | ||
|
||
if exists("b:did_ftplugin") | ||
finish | ||
endif | ||
|
||
silent! nmap <buffer> <silent> K <Plug>(godoc-keyword) | ||
" vim:ts=4:sw=4:et |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,201 @@ | ||
" 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. | ||
" | ||
" import.vim: Vim commands to import/drop Go packages. | ||
" | ||
" This filetype plugin adds three new commands for go buffers: | ||
" | ||
" :Import {path} | ||
" | ||
" Import ensures that the provided package {path} is imported | ||
" in the current Go buffer, using proper style and ordering. | ||
" If {path} is already being imported, an error will be | ||
" displayed and the buffer will be untouched. | ||
" | ||
" :ImportAs {localname} {path} | ||
" | ||
" Same as Import, but uses a custom local name for the package. | ||
" | ||
" :Drop {path} | ||
" | ||
" Remove the import line for the provided package {path}, if | ||
" present in the current Go buffer. If {path} is not being | ||
" imported, an error will be displayed and the buffer will be | ||
" untouched. | ||
" | ||
" In addition to these commands, there are also two shortcuts mapped: | ||
" | ||
" \f - Runs :Import fmt | ||
" \F - Runs :Drop fmt | ||
" | ||
" The backslash is the default maplocalleader, so it is possible that | ||
" your vim is set to use a different character (:help maplocalleader). | ||
" | ||
if exists("b:did_ftplugin") | ||
finish | ||
endif | ||
|
||
command! -buffer -nargs=? -complete=customlist,go#complete#Package Drop call s:SwitchImport(0, '', <f-args>) | ||
command! -buffer -nargs=1 -complete=customlist,go#complete#Package Import call s:SwitchImport(1, '', <f-args>) | ||
command! -buffer -nargs=* -complete=customlist,go#complete#Package ImportAs call s:SwitchImport(1, <f-args>) | ||
map <buffer> <LocalLeader>f :Import fmt<CR> | ||
map <buffer> <LocalLeader>F :Drop fmt<CR> | ||
function! s:SwitchImport(enabled, localname, path) | ||
let view = winsaveview() | ||
let path = a:path | ||
|
||
" Quotes are not necessary, so remove them if provided. | ||
if path[0] == '"' | ||
let path = strpart(path, 1) | ||
endif | ||
if path[len(path)-1] == '"' | ||
let path = strpart(path, 0, len(path) - 1) | ||
endif | ||
if path == '' | ||
call s:Error('Import path not provided') | ||
return | ||
endif | ||
|
||
let qpath = '"' . path . '"' | ||
if a:localname != '' | ||
let qlocalpath = a:localname . ' ' . qpath | ||
else | ||
let qlocalpath = qpath | ||
endif | ||
let indentstr = 0 | ||
let packageline = -1 " Position of package name statement | ||
let appendline = -1 " Position to introduce new import | ||
let deleteline = -1 " Position of line with existing import | ||
let linesdelta = 0 " Lines added/removed | ||
|
||
" Find proper place to add/remove import. | ||
let line = 0 | ||
while line <= line('$') | ||
let linestr = getline(line) | ||
|
||
if linestr =~# '^package\s' | ||
let packageline = line | ||
let appendline = line | ||
|
||
elseif linestr =~# '^import\s\+(' | ||
let appendstr = qlocalpath | ||
let indentstr = 1 | ||
let appendline = line | ||
while line <= line("$") | ||
let line = line + 1 | ||
let linestr = getline(line) | ||
let m = matchlist(getline(line), '^\()\|\(\s\+\)\(\S*\s*\)"\(.\+\)"\)') | ||
if empty(m) | ||
continue | ||
endif | ||
if m[1] == ')' | ||
break | ||
endif | ||
if a:localname != '' && m[3] != '' | ||
let qlocalpath = printf('%-' . (len(m[3])-1) . 's %s', a:localname, qpath) | ||
endif | ||
let appendstr = m[2] . qlocalpath | ||
let indentstr = 0 | ||
if m[4] == path | ||
let appendline = -1 | ||
let deleteline = line | ||
break | ||
elseif m[4] < path | ||
let appendline = line | ||
endif | ||
endwhile | ||
break | ||
|
||
elseif linestr =~# '^import ' | ||
if appendline == packageline | ||
let appendstr = 'import ' . qlocalpath | ||
let appendline = line - 1 | ||
endif | ||
let m = matchlist(linestr, '^import\(\s\+\)\(\S*\s*\)"\(.\+\)"') | ||
if !empty(m) | ||
if m[3] == path | ||
let appendline = -1 | ||
let deleteline = line | ||
break | ||
endif | ||
if m[3] < path | ||
let appendline = line | ||
endif | ||
if a:localname != '' && m[2] != '' | ||
let qlocalpath = printf("%s %" . len(m[2])-1 . "s", a:localname, qpath) | ||
endif | ||
let appendstr = 'import' . m[1] . qlocalpath | ||
endif | ||
|
||
elseif linestr =~# '^\(var\|const\|type\|func\)\>' | ||
break | ||
|
||
endif | ||
let line = line + 1 | ||
endwhile | ||
|
||
" Append or remove the package import, as requested. | ||
if a:enabled | ||
if deleteline != -1 | ||
call s:Error(qpath . ' already being imported') | ||
elseif appendline == -1 | ||
call s:Error('No package line found') | ||
else | ||
if appendline == packageline | ||
call append(appendline + 0, '') | ||
call append(appendline + 1, 'import (') | ||
call append(appendline + 2, ')') | ||
let appendline += 2 | ||
let linesdelta += 3 | ||
let appendstr = qlocalpath | ||
let indentstr = 1 | ||
endif | ||
call append(appendline, appendstr) | ||
execute appendline + 1 | ||
if indentstr | ||
execute 'normal >>' | ||
endif | ||
let linesdelta += 1 | ||
endif | ||
else | ||
if deleteline == -1 | ||
call s:Error(qpath . ' not being imported') | ||
else | ||
execute deleteline . 'd' | ||
let linesdelta -= 1 | ||
|
||
if getline(deleteline-1) =~# '^import\s\+(' && getline(deleteline) =~# '^)' | ||
" Delete empty import block | ||
let deleteline -= 1 | ||
execute deleteline . "d" | ||
execute deleteline . "d" | ||
let linesdelta -= 2 | ||
endif | ||
|
||
if getline(deleteline) == '' && getline(deleteline - 1) == '' | ||
" Delete spacing for removed line too. | ||
execute deleteline . "d" | ||
let linesdelta -= 1 | ||
endif | ||
endif | ||
endif | ||
|
||
" Adjust view for any changes. | ||
let view.lnum += linesdelta | ||
let view.topline += linesdelta | ||
if view.topline < 0 | ||
let view.topline = 0 | ||
endif | ||
|
||
" Put buffer back where it was. | ||
call winrestview(view) | ||
|
||
endfunction | ||
|
||
function! s:Error(s) | ||
echohl Error | echo a:s | echohl None | ||
endfunction | ||
|
||
" vim:ts=4:sw=4:et |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.