What do you guys use to format large EDN blobs, on a single line, in vim? Something like passing it through pprint
Concrete example: I have a big Ring request, logged by timbre, so it's all on one long line
Def it, then eval it
Some of the values are objects, so not readily deserializable 😞
I have a socket REPL with cljfmt dependency on port 5353 and filter lines through a hacky oneliner shell script
echo "(do (require 'cljfmt.core)(print (cljfmt.core/reformat-string \"$(sed 's/\\/\\\\\\\\/g;s/"/\\"/g')\" $opts)))" | nc -N localhost 5353 | awk 'BEGIN{RS="\n?(nil\n)?user=> (nil\n)?"} $0'
Actually as it is this probably woudln't help for individual EDN values, cljfmt doesn't break them up in lines, I use it for misformatted code
yeah, the vim clojure mode already knows how to indent correctly (using =
) the question is where to put the line breaks
you do have to tweak settings a bit to make it agree with cljfmt
Closest I got is :%s/, /<C-v><CR>/g<CR>==
... but that replaces commas in strings too 🤷
At least it's readable like this
Mine isn’t pretty either …
nnoremap <leader>e :call FormatEDN()<CR>1G=G<CR>
function! FormatEDN()
if search('" "')
execute '%s/" "/"\r"/g'
endif
" Break lists of maps onto separate lines.
if search('} {')
execute '%s/} {/}\r{/g'
endif
" Convert commas into newlines in maps.
if search(', :')
execute '%s/, :/\r:/g'
endif
endfunction
Better than what I got. Thanks, @defndaines!