From a19a5db8f0d9c14b9b207b9a051e392b532654e3 Mon Sep 17 00:00:00 2001 From: Wang Shidong Date: Thu, 5 Sep 2019 14:10:49 +0800 Subject: [PATCH] Improve file head support (#3034) --- autoload/SpaceVim/api/vim.vim | 23 +++++++++++ autoload/SpaceVim/layers/edit.vim | 59 +++++++++++++++------------- autoload/SpaceVim/layers/lang/sh.vim | 17 +++++--- test/api/vim.vader | 5 +++ 4 files changed, 71 insertions(+), 33 deletions(-) create mode 100644 test/api/vim.vader diff --git a/autoload/SpaceVim/api/vim.vim b/autoload/SpaceVim/api/vim.vim index beb6ed25c..0b897625e 100644 --- a/autoload/SpaceVim/api/vim.vim +++ b/autoload/SpaceVim/api/vim.vim @@ -46,6 +46,29 @@ function! s:self.jumps() abort return result endfunction +function! s:self.parse_string(line) abort + let expr = '`[^`]*`' + let i = 0 + let line = [] + while i < strlen(a:line) || i != -1 + let [rst, m, n] = matchstrpos(a:line, expr, i) + if m == -1 + call add(line, a:line[i:-1]) + break + else + call add(line, a:line[i:m-1]) + try + let rst = eval(rst[1:-2]) + catch + let rst = '' + endtry + call add(line, rst) + endif + let i = n + endwhile + return join(line, '') +endfunction + function! SpaceVim#api#vim#get() abort return deepcopy(s:self) endfunction diff --git a/autoload/SpaceVim/layers/edit.vim b/autoload/SpaceVim/layers/edit.vim index 4107e7ea1..5c3604bb8 100644 --- a/autoload/SpaceVim/layers/edit.vim +++ b/autoload/SpaceVim/layers/edit.vim @@ -11,6 +11,7 @@ scriptencoding utf-8 let s:PASSWORD = SpaceVim#api#import('password') let s:NUMBER = SpaceVim#api#import('data#number') let s:LIST = SpaceVim#api#import('data#list') +let s:VIM = SpaceVim#api#import('vim') function! SpaceVim#layers#edit#plugins() abort let plugins = [ @@ -422,35 +423,35 @@ function! s:delete_extra_space() abort endfunction function! s:set_justification_to(align) abort - let l:startlinenr = line("'{") - let l:endlinenr = line("'}") - if getline(l:startlinenr) ==# '' - let l:startlinenr += 1 + let l:startlinenr = line("'{") + let l:endlinenr = line("'}") + if getline(l:startlinenr) ==# '' + let l:startlinenr += 1 + endif + if getline(l:endlinenr) ==# '' + let l:endlinenr -= 1 + endif + let l:lineList = map(getline(l:startlinenr, l:endlinenr), 'trim(v:val)') + let l:maxlength = 0 + for l:line in l:lineList + let l:length = strdisplaywidth(l:line) + if l:length > l:maxlength + let l:maxlength = l:length endif - if getline(l:endlinenr) ==# '' - let l:endlinenr -= 1 - endif - let l:lineList = map(getline(l:startlinenr, l:endlinenr), 'trim(v:val)') - let l:maxlength = 0 - for l:line in l:lineList - let l:length = strdisplaywidth(l:line) - if l:length > l:maxlength - let l:maxlength = l:length - endif - endfor + endfor - if a:align ==# 'left' - execute l:startlinenr . ',' . l:endlinenr . ":left\" - elseif a:align ==# 'center' - execute l:startlinenr . ',' . l:endlinenr . ':center ' . l:maxlength . "\" - elseif a:align ==# 'right' - execute l:startlinenr . ',' . l:endlinenr . ':right ' . l:maxlength . "\" - endif + if a:align ==# 'left' + execute l:startlinenr . ',' . l:endlinenr . ":left\" + elseif a:align ==# 'center' + execute l:startlinenr . ',' . l:endlinenr . ':center ' . l:maxlength . "\" + elseif a:align ==# 'right' + execute l:startlinenr . ',' . l:endlinenr . ':right ' . l:maxlength . "\" + endif - unlet l:startlinenr - unlet l:endlinenr - unlet l:lineList - unlet l:maxlength + unlet l:startlinenr + unlet l:endlinenr + unlet l:lineList + unlet l:maxlength endfunction let s:local_lorem_ipsum = [ @@ -614,11 +615,15 @@ let s:ft_head_tp = {} function! s:add_buffer_head() abort if has_key(s:ft_head_tp, &ft) && getline(1) == '' && line('$') == 1 let head = s:ft_head_tp[&ft] - call setline(1, head) + call setline(1, map(head, 's:parse(v:val)')) call cursor(len(head), 0) endif endfunction +function! s:parse(line) abort + return s:VIM.parse_string(a:line) +endfunction + function! SpaceVim#layers#edit#add_ft_head_tamplate(ft, tamp) abort call extend(s:ft_head_tp, {a:ft : a:tamp}) endfunction diff --git a/autoload/SpaceVim/layers/lang/sh.vim b/autoload/SpaceVim/layers/lang/sh.vim index e9f2ab835..b40f2d64a 100644 --- a/autoload/SpaceVim/layers/lang/sh.vim +++ b/autoload/SpaceVim/layers/lang/sh.vim @@ -23,12 +23,7 @@ function! SpaceVim#layers#lang#sh#config() abort let g:zsh_fold_enable = 1 " }}} - call SpaceVim#layers#edit#add_ft_head_tamplate('sh', - \ ['#!/usr/bin/env bash', - \ '', - \ '' - \ ] - \ ) + call SpaceVim#layers#edit#add_ft_head_tamplate('sh', s:bash_file_head) call SpaceVim#layers#edit#add_ft_head_tamplate('zsh', [ \ '#!/usr/bin/env zsh', \ '', @@ -64,3 +59,13 @@ function! s:go_to_def() abort call SpaceVim#lsp#go_to_def() endif endfunction + + +let s:bash_file_head = ['#!/usr/bin/env bash', + \ '', + \ '' + \ ] + +function! SpaceVim#layers#lang#sh#set_variable(var) abort + let s:bash_file_head = get(a:var, 'bash-file-head', s:bash_file_head) +endfunction diff --git a/test/api/vim.vader b/test/api/vim.vader new file mode 100644 index 000000000..363577221 --- /dev/null +++ b/test/api/vim.vader @@ -0,0 +1,5 @@ +Execute ( SpaceVim api: vim ): + let &encoding = 'utf-8' + let vimapi = SpaceVim#api#import('vim') + AssertEqual vimapi.parse_string('sss `strftime("%Y-%m-%d")` sss'), 'sss ' . strftime("%Y-%m-%d") . ' sss' + unlet vimapi