aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormitermayer <mitermayer.reis@gmail.com>2018-05-28 20:53:30 -0700
committermitermayer <mitermayer.reis@gmail.com>2018-06-03 22:58:24 -0700
commitec6ede90f3b9948ed7063402189653f8d6721326 (patch)
tree69d08cc06297b9144fd630032368013a450a8aea
parent98845cdbbe243f4a62adbd73cbe7febec1f41efa (diff)
downloadvim-prettier-ec6ede90f3b9948ed7063402189653f8d6721326.tar.xz
Enabling partial formatting but still maintaining support for fragment
formatting
-rw-r--r--README.md2
-rw-r--r--autoload/prettier.vim18
-rw-r--r--autoload/prettier/resolver/config.vim14
-rw-r--r--autoload/prettier/resolver/preset.vim2
-rw-r--r--autoload/prettier/utils/buffer.vim21
-rw-r--r--plugin/prettier.vim15
6 files changed, 66 insertions, 6 deletions
diff --git a/README.md b/README.md
index 442a821..d0ec620 100644
--- a/README.md
+++ b/README.md
@@ -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.
-![vim-prettier](/media/vim-prettier.gif?raw=true "vim-prettier")
+![vim-prettier](/media/vim-prettier.gif?raw=true 'vim-prettier')
### 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>