summaryrefslogtreecommitdiffstats
path: root/autoload/jsonnet.vim
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2020-08-18 23:04:38 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2020-08-18 23:04:38 +0200
commit20a388cbc83cda89ee045c06c63f17fb9d4c9b39 (patch)
tree93c5d95e2aa982e5b208ce92dce76d02d5c16682 /autoload/jsonnet.vim
parent81e61a3c5d4a60916c7fdcee04562ff3f7e712eb (diff)
downloadvim-polyglot-20a388cbc83cda89ee045c06c63f17fb9d4c9b39.tar.gz
vim-polyglot-20a388cbc83cda89ee045c06c63f17fb9d4c9b39.zip
Add jsonnet support, closes #515
Diffstat (limited to 'autoload/jsonnet.vim')
-rw-r--r--autoload/jsonnet.vim129
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