diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2020-08-18 23:04:38 +0200 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2020-08-18 23:04:38 +0200 |
commit | 20a388cbc83cda89ee045c06c63f17fb9d4c9b39 (patch) | |
tree | 93c5d95e2aa982e5b208ce92dce76d02d5c16682 /autoload/jsonnet.vim | |
parent | 81e61a3c5d4a60916c7fdcee04562ff3f7e712eb (diff) | |
download | vim-polyglot-20a388cbc83cda89ee045c06c63f17fb9d4c9b39.tar.gz vim-polyglot-20a388cbc83cda89ee045c06c63f17fb9d4c9b39.zip |
Add jsonnet support, closes #515
Diffstat (limited to 'autoload/jsonnet.vim')
-rw-r--r-- | autoload/jsonnet.vim | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/autoload/jsonnet.vim b/autoload/jsonnet.vim new file mode 100644 index 00000000..6607ac0d --- /dev/null +++ b/autoload/jsonnet.vim @@ -0,0 +1,129 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsonnet') == -1 + + + +" Options. + +if !exists("g:jsonnet_command") + let g:jsonnet_command = "jsonnet" +endif + +if !exists("g:jsonnet_fmt_command") + let g:jsonnet_fmt_command = "jsonnetfmt" +endif + +if !exists('g:jsonnet_fmt_options') + let g:jsonnet_fmt_options = '' +endif + +if !exists('g:jsonnet_fmt_fail_silently') + let g:jsonnet_fmt_fail_silently = 1 +endif + + +" System runs a shell command. It will reset the shell to /bin/sh for Unix-like +" systems if it is executable. +function! jsonnet#System(str, ...) + let l:shell = &shell + if executable('/bin/sh') + let &shell = '/bin/sh' + endif + + try + let l:output = call("system", [a:str] + a:000) + return l:output + finally + let &shell = l:shell + endtry +endfunction + + +" CheckBinPath checks whether the given binary exists or not and returns the +" path of the binary. It returns an empty string if it doesn't exists. +function! jsonnet#CheckBinPath(binName) + + if executable(a:binName) + if exists('*exepath') + let binPath = exepath(a:binName) + return binPath + else + return a:binName + endif + else + echo "vim-jsonnet: could not find '" . a:binName . "'." + return "" + endif + +endfunction + +" Format calls `jsonnetfmt ... ` on the file and replaces the file with the +" auto formatted version. Does some primitive error checking of the +" jsonnetfmt command too. +function! jsonnet#Format() + + " Save cursor position and many other things. + let l:curw = winsaveview() + + " Write current unsaved buffer to a temp file + let l:tmpname = tempname() + call writefile(getline(1, '$'), l:tmpname) + + " get the command first so we can test it + let l:binName = g:jsonnet_fmt_command + + " check if the user has installed command binary. + let l:binPath = jsonnet#CheckBinPath(l:binName) + if empty(l:binPath) + return + endif + + + " Populate the final command. + let l:command = l:binPath + " The inplace modification is default. Makes file management easier + let l:command = l:command . ' -i ' + let l:command = l:command . g:jsonnet_fmt_options + + " Execute the compiled jsonnetfmt command and save the return value + let l:out = jsonnet#System(l:command . " " . l:tmpname) + let l:errorCode = v:shell_error + + if l:errorCode == 0 + " The format command succeeded Move the formatted temp file over the + " current file and restore other settings + + " stop undo recording + try | silent undojoin | catch | endtry + + let l:originalFileFormat = &fileformat + if exists("*getfperm") + " save old file permissions + let l:originalFPerm = getfperm(expand('%')) + endif + " Overwrite current file with the formatted temp file + call rename(l:tmpname, expand('%')) + + if exists("*setfperm") && l:originalFPerm != '' + call setfperm(expand('%'), l:originalFPerm) + endif + " the file has been changed outside of vim, enable reedit + silent edit! + let &fileformat = l:originalFileFormat + let &syntax = &syntax + elseif g:jsonnet_fmt_fail_silently == 0 + " FixMe: We could leverage the errors coming from the `jsonnetfmt` and + " give immediate feedback to the user at every save time. + " Our inspiration, vim-go, opens a new list below the current edit + " window and shows the errors (the output of the fmt command). + " We are not sure whether this is desired in the vim-jsonnet community + " or not. Nevertheless, this else block is a suitable place to benefit + " from the `jsonnetfmt` errors. + endif + + " Restore our cursor/windows positions. + call winrestview(l:curw) +endfunction + + + +endif |