-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This adds initial support for the `go.mod` file. It adds the followings: * Syntax highligthing. We highlight keywords, strings, operator and semver version. It works pretty well for now. * Auto fmt on save. Command `:GoModFmt` or `Plug(go-mod-fmt)` for custom mappings Before we fully support the semantics of go.mod, I think this initially will be helpful because I discovered that `go.mod` is read and edited a lot. So going forward, this will make it easier experimenting with Go modules. related: #1906
- Loading branch information
Showing
11 changed files
with
216 additions
and
1 deletion.
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
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 @@ | ||
/Users/fatih/go/src/github.com/fatih/goautofix/vim/fix.vim |
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,128 @@ | ||
function! go#mod#Format() abort | ||
let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') | ||
|
||
" Save cursor position and many other things. | ||
let l:curw = winsaveview() | ||
|
||
" Write current unsaved buffer to a temp file | ||
let l:tmpname = tempname() . '.go' | ||
call writefile(go#util#GetLines(), l:tmpname) | ||
if go#util#IsWin() | ||
let l:tmpname = tr(l:tmpname, '\', '/') | ||
endif | ||
|
||
let current_col = col('.') | ||
let l:args = ['go', 'mod', 'edit', '--fmt', l:tmpname] | ||
let [l:out, l:err] = go#util#Exec(l:args) | ||
let diff_offset = len(readfile(l:tmpname)) - line('$') | ||
|
||
if l:err == 0 | ||
call go#mod#update_file(l:tmpname, fname) | ||
else | ||
let errors = s:parse_errors(fname, l:out) | ||
call s:show_errors(errors) | ||
endif | ||
|
||
" We didn't use the temp file, so clean up | ||
call delete(l:tmpname) | ||
|
||
" Restore our cursor/windows positions. | ||
call winrestview(l:curw) | ||
|
||
" be smart and jump to the line the new statement was added/removed | ||
call cursor(line('.') + diff_offset, current_col) | ||
|
||
" Syntax highlighting breaks less often. | ||
syntax sync fromstart | ||
endfunction | ||
|
||
" update_file updates the target file with the given formatted source | ||
function! go#mod#update_file(source, target) | ||
" remove undo point caused via BufWritePre | ||
try | silent undojoin | catch | endtry | ||
|
||
let old_fileformat = &fileformat | ||
if exists("*getfperm") | ||
" save file permissions | ||
let original_fperm = getfperm(a:target) | ||
endif | ||
|
||
call rename(a:source, a:target) | ||
|
||
" restore file permissions | ||
if exists("*setfperm") && original_fperm != '' | ||
call setfperm(a:target , original_fperm) | ||
endif | ||
|
||
" reload buffer to reflect latest changes | ||
silent edit! | ||
|
||
let &fileformat = old_fileformat | ||
let &syntax = &syntax | ||
|
||
let l:listtype = go#list#Type("GoModFmt") | ||
|
||
" the title information was introduced with 7.4-2200 | ||
" https://github.com/vim/vim/commit/d823fa910cca43fec3c31c030ee908a14c272640 | ||
if has('patch-7.4.2200') | ||
" clean up previous list | ||
if l:listtype == "quickfix" | ||
let l:list_title = getqflist({'title': 1}) | ||
else | ||
let l:list_title = getloclist(0, {'title': 1}) | ||
endif | ||
else | ||
" can't check the title, so assume that the list was for go fmt. | ||
let l:list_title = {'title': 'Format'} | ||
endif | ||
|
||
if has_key(l:list_title, "title") && l:list_title['title'] == "Format" | ||
call go#list#Clean(l:listtype) | ||
endif | ||
endfunction | ||
|
||
" parse_errors parses the given errors and returns a list of parsed errors | ||
function! s:parse_errors(filename, content) abort | ||
let splitted = split(a:content, '\n') | ||
|
||
" list of errors to be put into location list | ||
let errors = [] | ||
for line in splitted | ||
let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)') | ||
if !empty(tokens) | ||
call add(errors,{ | ||
\"filename": a:filename, | ||
\"lnum": tokens[2], | ||
\"col": tokens[3], | ||
\"text": tokens[4], | ||
\ }) | ||
endif | ||
endfor | ||
|
||
return errors | ||
endfunction | ||
|
||
" show_errors opens a location list and shows the given errors. If the given | ||
" errors is empty, it closes the the location list | ||
function! s:show_errors(errors) abort | ||
let l:listtype = go#list#Type("GoModFmt") | ||
if !empty(a:errors) | ||
call go#list#Populate(l:listtype, a:errors, 'Format') | ||
echohl Error | echomsg "GoModFmt returned error" | echohl None | ||
endif | ||
|
||
" this closes the window if there are no errors or it opens | ||
" it if there is any | ||
call go#list#Window(l:listtype, len(a:errors)) | ||
endfunction | ||
|
||
function! go#mod#ToggleModfmtAutoSave() abort | ||
if go#config#ModfmtAutosave() | ||
call go#config#SetModfmtAutosave(0) | ||
call go#util#EchoProgress("auto mod fmt disabled") | ||
return | ||
end | ||
|
||
call go#config#SetModfmtAutosave(1) | ||
call go#util#EchoProgress("auto fmt enabled") | ||
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
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 @@ | ||
/Users/fatih/go/src/github.com/fatih/goautofix/vim/commands-fix.vim |
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
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,15 @@ | ||
" gomod.vim: Vim filetype plugin for Go assembler. | ||
|
||
if exists("b:did_ftplugin") | ||
finish | ||
endif | ||
let b:did_ftplugin = 1 | ||
|
||
let b:undo_ftplugin = "setl fo< com< cms<" | ||
|
||
setlocal formatoptions-=t | ||
|
||
setlocal comments=s1:/*,mb:*,ex:*/,:// | ||
setlocal commentstring=//\ %s | ||
|
||
" vim: sw=2 ts=2 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 @@ | ||
command! -nargs=0 -range GoModFmt call go#mod#Format() |
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 @@ | ||
nnoremap <silent> <Plug>(go-mod-fmt) :<C-u>call go#mod#Format()<CR> |
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
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,45 @@ | ||
" gomod.vim: Vim syntax file for go.mod file | ||
" | ||
" Quit when a (custom) syntax file was already loaded | ||
if exists("b:current_syntax") | ||
finish | ||
endif | ||
|
||
syntax case match | ||
|
||
" match keywords | ||
syntax keyword gomodModule module | ||
syntax keyword gomodRequire require | ||
syntax keyword gomodExclude exclude | ||
syntax keyword gomodReplace replace | ||
|
||
" require, exclude and replace can be also grouped into block | ||
syntax region gomodRequire start='require (' end=')' transparent contains=gomodRequire,gomodVersion | ||
syntax region gomodExclude start='exclude (' end=')' transparent contains=gomodExclude,gomodVersion | ||
syntax region gomodReplace start='replace (' end=')' transparent contains=gomodReplace,gomodVersion | ||
|
||
" set highlights | ||
highlight default link gomodModule Keyword | ||
highlight default link gomodRequire Keyword | ||
highlight default link gomodExclude Keyword | ||
highlight default link gomodReplace Keyword | ||
|
||
" comments are always in form of // ... | ||
syntax region gomodComment start="//" end="$" contains=@Spell | ||
highlight default link gomodComment Comment | ||
|
||
" make sure quoted import paths are higlighted | ||
syntax region gomodString start=+"+ skip=+\\\\\|\\"+ end=+"+ | ||
highlight default link gomodString String | ||
|
||
" replace operator is in the form of '=>' | ||
syntax match gomodReplaceOperator "\v\=\>" | ||
highlight default link gomodReplaceOperator Operator | ||
|
||
|
||
" highlight semver, note that this is very simple. But it works for now | ||
syntax match gomodVersion "v\d\.\d\.\d" | ||
syntax match gomodVersion "v\d\.\d\.\d-.*" | ||
highlight default link gomodVersion Identifier | ||
|
||
let b:current_syntax = "gomod" |