diff options
| author | mitermayer <mitermayer.reis@gmail.com> | 2018-05-28 20:53:30 -0700 |
|---|---|---|
| committer | mitermayer <mitermayer.reis@gmail.com> | 2018-06-03 22:58:24 -0700 |
| commit | ec6ede90f3b9948ed7063402189653f8d6721326 (patch) | |
| tree | 69d08cc06297b9144fd630032368013a450a8aea | |
| parent | 98845cdbbe243f4a62adbd73cbe7febec1f41efa (diff) | |
| download | vim-prettier-ec6ede90f3b9948ed7063402189653f8d6721326.tar.xz | |
Enabling partial formatting but still maintaining support for fragment
formatting
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | autoload/prettier.vim | 18 | ||||
| -rw-r--r-- | autoload/prettier/resolver/config.vim | 14 | ||||
| -rw-r--r-- | autoload/prettier/resolver/preset.vim | 2 | ||||
| -rw-r--r-- | autoload/prettier/utils/buffer.vim | 21 | ||||
| -rw-r--r-- | plugin/prettier.vim | 15 |
6 files changed, 66 insertions, 6 deletions
@@ -15,7 +15,7 @@ By default it will auto format **javascript**, **typescript**, **less**, **scss**, **css**, **json**, **graphql** and **markdown** files if they have/support the "@format" pragma annotation in the header of the file. - + ### INSTALL diff --git a/autoload/prettier.vim b/autoload/prettier.vim index fae1ef8..0e8ade3 100644 --- a/autoload/prettier.vim +++ b/autoload/prettier.vim @@ -69,14 +69,30 @@ function! prettier#Prettier(...) abort let l:async = a:0 > 0 ? a:1 : 0 let l:startSelection = a:0 > 1 ? a:2 : 1 let l:endSelection = a:0 > 2 ? a:3 : line('$') + let l:hasSelection = a:0 > 2 ? 1 : 0 + let l:partialFormat = a:0 > 3 && a:4 ? a:4 : 0 let l:config = getbufvar(bufnr('%'), 'prettier_ft_default_args', {}) + let l:partialFormatEnabled = l:hasSelection && l:partialFormat if l:execCmd != -1 - let l:cmd = l:execCmd . prettier#resolver#config#buildCliArgs(prettier#resolver#preset#build(l:config)) + " TODO + " => we should make sure we can resolve --range-start and --range-end when required + " => when the above is required we should also update l:startSelection to '1' and l:endSelection to line('$') + let l:cmd = l:execCmd . prettier#resolver#config#resolve( + \ prettier#resolver#preset#resolve(l:config), + \ l:partialFormatEnabled, + \ l:startSelection, + \ l:endSelection) " close quickfix if it is opened call prettier#utils#quickfix#close() + " we will be using portion formatting, so we need to send entire buffer to prettier + if l:partialFormatEnabled + let l:startSelection = 1 + let l:endSelection = line('$') + endif + " format buffer call prettier#job#runner#run(l:cmd, l:startSelection, l:endSelection, l:async) else diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index 91fc247..eae6725 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -1,6 +1,6 @@ " By default we will default to our internal " configuration settings for prettier -function! prettier#resolver#config#buildCliArgs(config) abort +function! prettier#resolver#config#resolve(config, hasSelection, start, end) abort " Allow params to be passed as json format " convert bellow usage of globals to a get function o the params defaulting to global " TODO: Use a list, filter() and join() to get a nicer list of args. @@ -8,6 +8,7 @@ function! prettier#resolver#config#buildCliArgs(config) abort \ s:Flag_tab_width(a:config) . ' ' . \ s:Flag_print_width(a:config) . ' ' . \ s:Flag_parser(a:config) . ' ' . + \ s:Flag_range_delimiter(a:config, a:hasSelection, a:start, a:end) . ' ' . \ ' --semi=' . \ get(a:config, 'semi', g:prettier#config#semi) . \ ' --single-quote=' . @@ -34,6 +35,17 @@ function! prettier#resolver#config#buildCliArgs(config) abort return l:cmd endfunction +" Returns either '--range-start X --range-end Y' or an empty string. +function! s:Flag_range_delimiter(config, partialFormatEnabled, start, end) abort + if (!a:partialFormatEnabled) + return '' + endif + + let l:range = prettier#utils#buffer#getCharRange(a:start, a:end) + + return '--range-start=' . l:range[0] . ' --range-end=' . l:range[1] +endfunction + " Returns '--tab-width=NN' function! s:Flag_tab_width(config) abort let l:value = get(a:config, 'tabWidth', g:prettier#config#tab_width) diff --git a/autoload/prettier/resolver/preset.vim b/autoload/prettier/resolver/preset.vim index a0891d2..03f98ee 100644 --- a/autoload/prettier/resolver/preset.vim +++ b/autoload/prettier/resolver/preset.vim @@ -1,5 +1,5 @@ " Build config using predefined preset -function! prettier#resolver#preset#build(fileTypeConfigOverwrites) abort +function! prettier#resolver#preset#resolve(fileTypeConfigOverwrites) abort if ( g:prettier#preset#config ==# 'fb' ) return extend(prettier#presets#fb#config(), a:fileTypeConfigOverwrites) endif diff --git a/autoload/prettier/utils/buffer.vim b/autoload/prettier/utils/buffer.vim index 1e11ddb..0b3c619 100644 --- a/autoload/prettier/utils/buffer.vim +++ b/autoload/prettier/utils/buffer.vim @@ -33,3 +33,24 @@ endfunction function! prettier#utils#buffer#createBufferFromUpdatedLines(lines, start, end) abort return getbufline(bufnr('%'), 1, a:start - 1) + a:lines + getbufline(bufnr('%'), a:end + 1, '$') endfunction + +" Adapted from https://github.com/farazdagi/vim-go-ide +function! s:getCharPosition(line, col) + if &encoding !=# 'utf-8' + " On utf-8 enconding we can't just use bytes so we need to make sure we can count the + " characters, we do that by adding the text into a temporary buffer and counting the chars + let l:buf = a:line == 1 ? '' : (join(getline(1, a:line - 1), "\n") . "\n") + let l:buf .= a:col == 1 ? '' : getline('.')[:a:col - 2] + return len(iconv(l:buf, &encoding, 'utf-8')) + endif + " On non utf-8 the line byte should match the character + return line2byte(a:line) + (a:col - 2) +endfun + +" Returns [start, end] byte range when on visual mode +function! prettier#utils#buffer#getCharRange(startSelection, endSelection) abort + let l:range = [] + call add(l:range, s:getCharPosition(a:startSelection, col("'<"))) + call add(l:range, s:getCharPosition(a:endSelection, col("'>"))) + return l:range +endfunction diff --git a/plugin/prettier.vim b/plugin/prettier.vim index 2bb5a39..4a3db64 100644 --- a/plugin/prettier.vim +++ b/plugin/prettier.vim @@ -32,6 +32,9 @@ let g:prettier#quickfix_enabled = get(g:, 'prettier#quickfix_enabled', 1) " Don't leave the quicklist focused on error. let g:prettier#quickfix_auto_focus = get(g:, 'prettier#quickfix_auto_focus', 1) +" Send to prettier entire buffer and use --range-start and --range-end as delimter +let g:prettier#partial_format = get(g:, 'prettier#partial_format', 0) + " default|fb " Use prettier defaults let g:prettier#preset#config = get(g:,'prettier#preset#config', 'default') @@ -91,10 +94,10 @@ let g:prettier#config#arrow_parens = get(g:,'prettier#config#arrow_parens', 'avo let g:prettier#config#trailing_comma = get(g:,'prettier#config#trailing_comma', 'none') " synchronous by default -command! -nargs=? -range=% Prettier call prettier#Prettier(g:prettier#exec_cmd_async, <line1>, <line2>) +command! -nargs=? -range=% Prettier call prettier#Prettier(g:prettier#exec_cmd_async, <line1>, <line2>, g:prettier#partial_format) " prettier async -command! -nargs=? -range=% PrettierAsync call prettier#Prettier(1, <line1>, <line2>) +command! -nargs=? -range=% PrettierAsync call prettier#Prettier(1, <line1>, <line2>, g:prettier#partial_format) " prints vim-prettier version command! -nargs=? -range=% PrettierVersion echom '0.2.6' @@ -108,12 +111,20 @@ command! -nargs=? -range=% PrettierCliVersion call prettier#PrettierCli('--versi " prints prettier resolved cli path command! -nargs=? -range=% PrettierCliPath call prettier#PrettierCliPath() +" sends selected text to prettier cli for formatting +command! -nargs=? -range=% PrettierFragment call prettier#Prettier(g:prettier#exec_cmd_async, <line1>, <line2>, 0) + +" sends entire buffer to prettier cli but format just selection +command! -nargs=? -range=% PrettierPartial call prettier#Prettier(g:prettier#exec_cmd_async, <line1>, <line2>, 1) + " map command if !hasmapto('<Plug>(Prettier)') && maparg('<Leader>p', 'n') ==# '' nmap <unique> <Leader>p <Plug>(Prettier) endif nnoremap <silent> <Plug>(Prettier) :Prettier<CR> nnoremap <silent> <Plug>(PrettierAsync) :PrettierAsync<CR> +nnoremap <silent> <Plug>(PrettierFragment) :PrettierFragment<CR> +nnoremap <silent> <Plug>(PrettierPartial) :PrettierPartial<CR> nnoremap <silent> <Plug>(PrettierVersion) :PrettierVersion<CR> nnoremap <silent> <Plug>(PrettierCli) :PrettierCli<CR> nnoremap <silent> <Plug>(PrettierCliVersion) :PrettierCliVersion<CR> |
