diff options
Diffstat (limited to 'autoload')
| -rw-r--r-- | autoload/cargo.vim | 89 | ||||
| -rw-r--r-- | autoload/crystal_lang.vim | 67 | ||||
| -rw-r--r-- | autoload/elixir/indent.vim | 17 | ||||
| -rw-r--r-- | autoload/vifm/globals.vim | 31 | ||||
| -rw-r--r-- | autoload/vital/crystal.vim | 332 | ||||
| -rw-r--r-- | autoload/xml/html5.vim | 4 | 
6 files changed, 490 insertions, 50 deletions
| diff --git a/autoload/cargo.vim b/autoload/cargo.vim new file mode 100644 index 00000000..e92da22b --- /dev/null +++ b/autoload/cargo.vim @@ -0,0 +1,89 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1 +   +function! cargo#cmd(args) +    silent! clear +    if !a:args +        execute "!" . "cargo ". a:args +    else +        echom "Missing arguments" +    endif +endfunction + +function! cargo#build(args) +    silent! clear +    if !a:args +        execute "!" . "cargo build " . a:args +    else +        execute "!" . "cargo build" +    endif +    silent! clear +    execute "!" . "cargo build" +endfunction + +function! cargo#clean(args) +    silent! clear +    if !a:args +        execute "!" . "cargo clean " . a:args +    else +        execute "!" . "cargo clean" +    endif +    silent! clear +    execute "!" . "cargo clean" +endfunction + +function! cargo#doc(args) +    silent! clear +    if !a:args +        execute "!" . "cargo doc " . a:args +    else +        execute "!" . "cargo doc" +    endif +endfunction + +function! cargo#new(args) +    silent! clear +    if !a:args +        execute "!cargo new " . a:args +        :cd `=a:args` +    else +        echom "Missing arguments" +    endif +endfunction + +function! cargo#init(args) +    silent! clear +    if !a:args +        execute "!" . "cargo init " . a:args +    else +        execute "!" . "cargo init" +    endif +endfunction + +function! cargo#run(args) +    silent! clear +    if !a:args +        execute "!" . "cargo run " . a:args +    else +        execute "!" . "cargo run" +    endif +endfunction + +function! cargo#test(args) +    silent! clear +    if !a:args +        execute "!" . "cargo test " . a:args +    else +        execute "!" . "cargo test" +    endif +endfunction + +function! cargo#bench(args) +    silent! clear +    if !a:args +        execute "!" . "cargo bench " . a:args +    else +        execute "!" . "cargo bench" +    endif +endfunction + +endif diff --git a/autoload/crystal_lang.vim b/autoload/crystal_lang.vim index 94cc9db3..aaf626cf 100644 --- a/autoload/crystal_lang.vim +++ b/autoload/crystal_lang.vim @@ -280,59 +280,34 @@ function! crystal_lang#format_string(code, ...) abort      return output  endfunction -function! s:get_saved_states() abort -    let result = {} -    let fname = bufname('%') -    let current_winnr = winnr() -    for i in range(1, winnr('$')) -        let bufnr = winbufnr(i) -        if bufnr == -1 -            continue -        endif -        if bufname(bufnr) ==# fname -            execute i 'wincmd w' -            let result[i] = { -                \     'pos': getpos('.'), -                \     'screen': winsaveview() -                \ } -        endif -    endfor -    execute current_winnr 'wincmd w' -    return result -endfunction - -function! crystal_lang#format(option_str) abort +" crystal_lang#format(option_str [, on_save]) +function! crystal_lang#format(option_str, ...) abort      if !executable(g:crystal_compiler_command)          " Finish command silently          return      endif -    let formatted = crystal_lang#format_string(join(getline(1, '$'), "\n"), a:option_str) -    let formatted = substitute(formatted, '\n$', '', '') +    let on_save = a:0 > 0 ? a:1 : 0 -    let sel_save = &l:selection -    let ve_save = &virtualedit -    let &l:selection = 'inclusive' -    let &virtualedit = '' -    let [save_g_reg, save_g_regtype] = [getreg('g'), getregtype('g')] -    let windows_save = s:get_saved_states() +    let before = join(getline(1, '$'), "\n") +    let formatted = crystal_lang#format_string(before, a:option_str) +    if !on_save +        let after = substitute(formatted, '\n$', '', '') +        if before ==# after +            return +        endif +    endif -    try -        call setreg('g', formatted, 'v') -        silent normal! gg0vG$"gp -    finally -        call setreg('g', save_g_reg, save_g_regtype) -        let &l:selection = sel_save -        let &virtualedit = ve_save -        let winnr = winnr() -        for winnr in keys(windows_save) -            let w = windows_save[winnr] -            execute winnr 'wincmd w' -            call setpos('.', w.pos) -            call winrestview(w.screen) -        endfor -        execute winnr 'wincmd w' -    endtry +    let view_save = winsaveview() +    let pos_save = getpos('.') +    let lines = split(formatted, '\n') +    silent! undojoin +    if line('$') > len(lines) +        execute len(lines) . ',$delete' '_' +    endif +    call setline(1, lines) +    call winrestview(view_save) +    call setpos('.', pos_save)  endfunction  let &cpo = s:save_cpo diff --git a/autoload/elixir/indent.vim b/autoload/elixir/indent.vim index 4a8b5435..aca5a2fd 100644 --- a/autoload/elixir/indent.vim +++ b/autoload/elixir/indent.vim @@ -18,11 +18,15 @@ function! elixir#indent#indent(lnum)    call s:debug("==> Indenting line " . lnum)    call s:debug("text = '" . text . "'") +  let [_, curs_lnum, curs_col, _] = getpos('.') +  call cursor(lnum, 0) +    let handlers = [          \'top_of_file',          \'starts_with_end',          \'starts_with_mid_or_end_block_keyword',          \'following_trailing_do', +        \'following_trailing_rocket',          \'following_trailing_binary_operator',          \'starts_with_pipe',          \'starts_with_close_bracket', @@ -37,11 +41,13 @@ function! elixir#indent#indent(lnum)      let indent = function('elixir#indent#handle_'.handler)(lnum, text, prev_nb_lnum, prev_nb_text)      if indent != -1        call s:debug('line '.lnum.': elixir#indent#handle_'.handler.' returned '.indent) +      call cursor(curs_lnum, curs_col)        return indent      endif    endfor    call s:debug("defaulting") +  call cursor(curs_lnum, curs_col)    return 0  endfunction @@ -166,7 +172,7 @@ function! s:get_base_indent(lnum, text)    elseif s:ends_with(a:text, data_structure_close, a:lnum)      let data_structure_open = '\%(\[\|{\|(\)'      let close_match_idx = match(a:text, data_structure_close . '\s*$') -    let _move = cursor(a:lnum, close_match_idx + 1) +    call cursor(a:lnum, close_match_idx + 1)      let [open_match_lnum, open_match_col] = searchpairpos(data_structure_open, '', data_structure_close, 'bnW')      let open_match_text = getline(open_match_lnum)      return s:get_base_indent(open_match_lnum, open_match_text) @@ -175,7 +181,6 @@ function! s:get_base_indent(lnum, text)    endif  endfunction -" TODO: @jbodah 2017-03-31: remove  function! elixir#indent#handle_following_trailing_do(lnum, text, prev_nb_lnum, prev_nb_text)    if s:ends_with(a:prev_nb_text, s:keyword('do'), a:prev_nb_lnum)      if s:starts_with(a:text, s:keyword('end'), a:lnum) @@ -188,6 +193,14 @@ function! elixir#indent#handle_following_trailing_do(lnum, text, prev_nb_lnum, p    endif  endfunction +function! elixir#indent#handle_following_trailing_rocket(lnum, text, prev_nb_lnum, prev_nb_text) +  if s:ends_with(a:prev_nb_text, '->', a:prev_nb_lnum) +    return indent(a:prev_nb_lnum) + s:sw() +  else +    return -1 +  endif +endfunction +  function! elixir#indent#handle_following_trailing_binary_operator(lnum, text, prev_nb_lnum, prev_nb_text)    let binary_operator = '\%(=\|<>\|>>>\|<=\|||\|+\|\~\~\~\|-\|&&\|<<<\|/\|\^\^\^\|\*\)' diff --git a/autoload/vifm/globals.vim b/autoload/vifm/globals.vim new file mode 100644 index 00000000..f6f62022 --- /dev/null +++ b/autoload/vifm/globals.vim @@ -0,0 +1,31 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vifm') == -1 +   +" common functions for vifm plugin related to globals +" Maintainer:  xaizek <xaizek@posteo.net> +" Last Change: January 02, 2018 + +" Initializes global variables to defaults unless they are already set +function! vifm#globals#Init() +    if !exists('g:vifm_exec') +        let g:vifm_exec = 'vifm' +    endif + +    if !exists('g:vifm_exec_args') +        let g:vifm_exec_args = '' +    endif + +    if !exists('g:vifm_term') +        if has('win32') +            if filereadable('C:\Windows\system32\cmd.exe') +                let g:vifm_term = 'C:\Windows\system32\cmd.exe /C' +            else +                " If don't find use the integrate shell it work too +                let g:vifm_term = '' +            endif +        else +            let g:vifm_term = 'xterm -e' +        endif +    endif +endfunction + +endif diff --git a/autoload/vital/crystal.vim b/autoload/vital/crystal.vim new file mode 100644 index 00000000..2dca145b --- /dev/null +++ b/autoload/vital/crystal.vim @@ -0,0 +1,332 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1 +   +let s:plugin_name = expand('<sfile>:t:r') +let s:vital_base_dir = expand('<sfile>:h') +let s:project_root = expand('<sfile>:h:h:h') +let s:is_vital_vim = s:plugin_name is# 'vital' + +let s:loaded = {} +let s:cache_sid = {} + +" function() wrapper +if v:version > 703 || v:version == 703 && has('patch1170') +  function! s:_function(fstr) abort +    return function(a:fstr) +  endfunction +else +  function! s:_SID() abort +    return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$') +  endfunction +  let s:_s = '<SNR>' . s:_SID() . '_' +  function! s:_function(fstr) abort +    return function(substitute(a:fstr, 's:', s:_s, 'g')) +  endfunction +endif + +function! vital#{s:plugin_name}#new() abort +  return s:new(s:plugin_name) +endfunction + +function! vital#{s:plugin_name}#import(...) abort +  if !exists('s:V') +    let s:V = s:new(s:plugin_name) +  endif +  return call(s:V.import, a:000, s:V) +endfunction + +let s:Vital = {} + +function! s:new(plugin_name) abort +  let base = deepcopy(s:Vital) +  let base._plugin_name = a:plugin_name +  return base +endfunction + +function! s:vital_files() abort +  if !exists('s:vital_files') +    let s:vital_files = map( +    \   s:is_vital_vim ? s:_global_vital_files() : s:_self_vital_files(), +    \   'fnamemodify(v:val, ":p:gs?[\\\\/]?/?")') +  endif +  return copy(s:vital_files) +endfunction +let s:Vital.vital_files = s:_function('s:vital_files') + +function! s:import(name, ...) abort dict +  let target = {} +  let functions = [] +  for a in a:000 +    if type(a) == type({}) +      let target = a +    elseif type(a) == type([]) +      let functions = a +    endif +    unlet a +  endfor +  let module = self._import(a:name) +  if empty(functions) +    call extend(target, module, 'keep') +  else +    for f in functions +      if has_key(module, f) && !has_key(target, f) +        let target[f] = module[f] +      endif +    endfor +  endif +  return target +endfunction +let s:Vital.import = s:_function('s:import') + +function! s:load(...) abort dict +  for arg in a:000 +    let [name; as] = type(arg) == type([]) ? arg[: 1] : [arg, arg] +    let target = split(join(as, ''), '\W\+') +    let dict = self +    let dict_type = type({}) +    while !empty(target) +      let ns = remove(target, 0) +      if !has_key(dict, ns) +        let dict[ns] = {} +      endif +      if type(dict[ns]) == dict_type +        let dict = dict[ns] +      else +        unlet dict +        break +      endif +    endwhile +    if exists('dict') +      call extend(dict, self._import(name)) +    endif +    unlet arg +  endfor +  return self +endfunction +let s:Vital.load = s:_function('s:load') + +function! s:unload() abort dict +  let s:loaded = {} +  let s:cache_sid = {} +  unlet! s:vital_files +endfunction +let s:Vital.unload = s:_function('s:unload') + +function! s:exists(name) abort dict +  if a:name !~# '\v^\u\w*%(\.\u\w*)*$' +    throw 'vital: Invalid module name: ' . a:name +  endif +  return s:_module_path(a:name) isnot# '' +endfunction +let s:Vital.exists = s:_function('s:exists') + +function! s:search(pattern) abort dict +  let paths = s:_extract_files(a:pattern, self.vital_files()) +  let modules = sort(map(paths, 's:_file2module(v:val)')) +  return s:_uniq(modules) +endfunction +let s:Vital.search = s:_function('s:search') + +function! s:plugin_name() abort dict +  return self._plugin_name +endfunction +let s:Vital.plugin_name = s:_function('s:plugin_name') + +function! s:_self_vital_files() abort +  let builtin = printf('%s/__%s__/', s:vital_base_dir, s:plugin_name) +  let installed = printf('%s/_%s/', s:vital_base_dir, s:plugin_name) +  let base = builtin . ',' . installed +  return split(globpath(base, '**/*.vim', 1), "\n") +endfunction + +function! s:_global_vital_files() abort +  let pattern = 'autoload/vital/__*__/**/*.vim' +  return split(globpath(&runtimepath, pattern, 1), "\n") +endfunction + +function! s:_extract_files(pattern, files) abort +  let tr = {'.': '/', '*': '[^/]*', '**': '.*'} +  let target = substitute(a:pattern, '\.\|\*\*\?', '\=tr[submatch(0)]', 'g') +  let regexp = printf('autoload/vital/[^/]\+/%s.vim$', target) +  return filter(a:files, 'v:val =~# regexp') +endfunction + +function! s:_file2module(file) abort +  let filename = fnamemodify(a:file, ':p:gs?[\\/]?/?') +  let tail = matchstr(filename, 'autoload/vital/_\w\+/\zs.*\ze\.vim$') +  return join(split(tail, '[\\/]\+'), '.') +endfunction + +" @param {string} name e.g. Data.List +function! s:_import(name) abort dict +  if has_key(s:loaded, a:name) +    return copy(s:loaded[a:name]) +  endif +  let module = self._get_module(a:name) +  if has_key(module, '_vital_created') +    call module._vital_created(module) +  endif +  let export_module = filter(copy(module), 'v:key =~# "^\\a"') +  " Cache module before calling module.vital_loaded() to avoid cyclic +  " dependences but remove the cache if module._vital_loaded() fails. +  " let s:loaded[a:name] = export_module +  let s:loaded[a:name] = export_module +  if has_key(module, '_vital_loaded') +    try +      call module._vital_loaded(vital#{s:plugin_name}#new()) +    catch +      unlet s:loaded[a:name] +      throw 'vital: fail to call ._vital_loaded(): ' . v:exception +    endtry +  endif +  return copy(s:loaded[a:name]) +endfunction +let s:Vital._import = s:_function('s:_import') + +" s:_get_module() returns module object wihch has all script local functions. +function! s:_get_module(name) abort dict +  let funcname = s:_import_func_name(self.plugin_name(), a:name) +  try +    return call(funcname, []) +  catch /^Vim\%((\a\+)\)\?:E117/ +    return s:_get_builtin_module(a:name) +  endtry +endfunction + +function! s:_get_builtin_module(name) abort + return s:sid2sfuncs(s:_module_sid(a:name)) +endfunction + +if s:is_vital_vim +  " For vital.vim, we can use s:_get_builtin_module directly +  let s:Vital._get_module = s:_function('s:_get_builtin_module') +else +  let s:Vital._get_module = s:_function('s:_get_module') +endif + +function! s:_import_func_name(plugin_name, module_name) abort +  return printf('vital#_%s#%s#import', a:plugin_name, s:_dot_to_sharp(a:module_name)) +endfunction + +function! s:_module_sid(name) abort +  let path = s:_module_path(a:name) +  if !filereadable(path) +    throw 'vital: module not found: ' . a:name +  endif +  let vital_dir = s:is_vital_vim ? '__\w\+__' : printf('_\{1,2}%s\%%(__\)\?', s:plugin_name) +  let base = join([vital_dir, ''], '[/\\]\+') +  let p = base . substitute('' . a:name, '\.', '[/\\\\]\\+', 'g') +  let sid = s:_sid(path, p) +  if !sid +    call s:_source(path) +    let sid = s:_sid(path, p) +    if !sid +      throw printf('vital: cannot get <SID> from path: %s', path) +    endif +  endif +  return sid +endfunction + +function! s:_module_path(name) abort +  return get(s:_extract_files(a:name, s:vital_files()), 0, '') +endfunction + +function! s:_module_sid_base_dir() abort +  return s:is_vital_vim ? &rtp : s:project_root +endfunction + +function! s:_dot_to_sharp(name) abort +  return substitute(a:name, '\.', '#', 'g') +endfunction + +function! s:_source(path) abort +  execute 'source' fnameescape(a:path) +endfunction + +" @vimlint(EVL102, 1, l:_) +" @vimlint(EVL102, 1, l:__) +function! s:_sid(path, filter_pattern) abort +  let unified_path = s:_unify_path(a:path) +  if has_key(s:cache_sid, unified_path) +    return s:cache_sid[unified_path] +  endif +  for line in filter(split(s:_execute(':scriptnames'), "\n"), 'v:val =~# a:filter_pattern') +    let [_, sid, path; __] = matchlist(line, '^\s*\(\d\+\):\s\+\(.\+\)\s*$') +    if s:_unify_path(path) is# unified_path +      let s:cache_sid[unified_path] = sid +      return s:cache_sid[unified_path] +    endif +  endfor +  return 0 +endfunction + +" We want to use a execute() builtin function instead of s:_execute(), +" however there is a bug in execute(). +" execute() returns empty string when it is called in +" completion function of user defined ex command. +" https://github.com/vim-jp/issues/issues/1129 +function! s:_execute(cmd) abort +  let [save_verbose, save_verbosefile] = [&verbose, &verbosefile] +  set verbose=0 verbosefile= +  redir => res +    silent! execute a:cmd +  redir END +  let [&verbose, &verbosefile] = [save_verbose, save_verbosefile] +  return res +endfunction + +if filereadable(expand('<sfile>:r') . '.VIM') " is case-insensitive or not +  let s:_unify_path_cache = {} +  " resolve() is slow, so we cache results. +  " Note: On windows, vim can't expand path names from 8.3 formats. +  " So if getting full path via <sfile> and $HOME was set as 8.3 format, +  " vital load duplicated scripts. Below's :~ avoid this issue. +  function! s:_unify_path(path) abort +    if has_key(s:_unify_path_cache, a:path) +      return s:_unify_path_cache[a:path] +    endif +    let value = tolower(fnamemodify(resolve(fnamemodify( +    \                   a:path, ':p')), ':~:gs?[\\/]?/?')) +    let s:_unify_path_cache[a:path] = value +    return value +  endfunction +else +  function! s:_unify_path(path) abort +    return resolve(fnamemodify(a:path, ':p:gs?[\\/]?/?')) +  endfunction +endif + +" copied and modified from Vim.ScriptLocal +let s:SNR = join(map(range(len("\<SNR>")), '"[\\x" . printf("%0x", char2nr("\<SNR>"[v:val])) . "]"'), '') +function! s:sid2sfuncs(sid) abort +  let fs = split(s:_execute(printf(':function /^%s%s_', s:SNR, a:sid)), "\n") +  let r = {} +  let pattern = printf('\m^function\s<SNR>%d_\zs\w\{-}\ze(', a:sid) +  for fname in map(fs, 'matchstr(v:val, pattern)') +    let r[fname] = function(s:_sfuncname(a:sid, fname)) +  endfor +  return r +endfunction + +"" Return funcname of script local functions with SID +function! s:_sfuncname(sid, funcname) abort +  return printf('<SNR>%s_%s', a:sid, a:funcname) +endfunction + +if exists('*uniq') +  function! s:_uniq(list) abort +    return uniq(a:list) +  endfunction +else +  function! s:_uniq(list) abort +    let i = len(a:list) - 1 +    while 0 < i +      if a:list[i] ==# a:list[i - 1] +        call remove(a:list, i) +      endif +      let i -= 1 +    endwhile +    return a:list +  endfunction +endif + +endif diff --git a/autoload/xml/html5.vim b/autoload/xml/html5.vim index 20353bd5..404dd567 100644 --- a/autoload/xml/html5.vim +++ b/autoload/xml/html5.vim @@ -62,7 +62,7 @@ let charset = [      \ 'windows-1256', 'windows-1257', 'windows-1258', 'TIS-620', ]  " }}} -let autofill_tokens = ['on', 'off', 'name', 'honorific-prefix', 'given-name', 'additional-name', 'family-name', 'honorific-suffix', 'nickname', 'username', 'new-password', 'current-password', 'organization-title', 'organization', 'street-address', 'address-line1', 'address-line2', 'address-line3', 'address-level4', 'address-level3', 'address-level2', 'address-level1', 'country', 'country-name', 'postal-code', 'cc-name', 'cc-given-name', 'cc-additional-name', 'cc-family-name', 'cc-number', 'cc-exp', 'cc-exp-month', 'cc-exp-year', 'cc-csc', 'cc-type', 'transaction-currency', 'transaction-amount', 'language', 'bday', 'bday-day', 'bday-month', 'bday-year', 'sex', 'url', 'photo'] +let autofill_tokens = ['on', 'off', 'name', 'honorific-prefix', 'given-name', 'additional-name', 'family-name', 'honorific-suffix', 'nickname', 'organization-title', 'username', 'new-password', 'current-password', 'organization', 'street-address', 'address-line1', 'address-line2', 'address-line3', 'address-level4', 'address-level3', 'address-level2', 'address-level1', 'country', 'country-name', 'postal-code', 'cc-name', 'cc-given-name', 'cc-additional-name', 'cc-family-name', 'cc-number', 'cc-exp', 'cc-exp-month', 'cc-exp-year', 'cc-csc', 'cc-type', 'transaction-currency', 'transaction-amount', 'language', 'bday', 'bday-day', 'bday-month', 'bday-year', 'sex', 'url', 'photo', 'tel', 'tel-country-code', 'tel-national', 'tel-area-code', 'tel-local', 'tel-local-prefix', 'tel-local-suffix', 'tel-extension', 'email', 'impp']  " Attributes_and_Settings: {{{  let core_attributes = {'accesskey': [], 'class': [], 'contenteditable': ['true', 'false', ''], 'contextmenu': [], 'dir': ['ltr', 'rtl'], 'draggable': ['true', 'false'], 'hidden': ['hidden', ''], 'id': [], 'is': [], 'lang': lang_tag, 'spellcheck': ['true', 'false', ''], 'style': [], 'tabindex': [], 'title': []} @@ -616,7 +616,7 @@ let g:xmldata_html5 = {  \ ],  \ 'link': [      \ [], -    \ extend(copy(global_attributes), {'href': [], 'rel': linkreltypes, 'hreflang': lang_tag, 'media': [], 'type': [], 'sizes': ['any'], 'referrerpolicy': ['no-referrer', 'no-referrer-when-downgrade', 'origin', 'origin-when-cross-origin', 'unsafe-url'], 'crossorigin': crossorigin, 'preload': ['preload', ''], 'prefetch': ['prefetch', '']}) +    \ extend(copy(global_attributes), {'href': [], 'rel': linkreltypes, 'hreflang': lang_tag, 'media': [], 'type': [], 'sizes': ['any'], 'referrerpolicy': ['no-referrer', 'no-referrer-when-downgrade', 'origin', 'origin-when-cross-origin', 'unsafe-url'], 'crossorigin': crossorigin, 'preload': ['preload', ''], 'prefetch': ['prefetch', ''], 'as': ['report', 'document', 'document', 'object', 'embed', 'audio', 'font', 'image', 'audioworklet', 'paintworklet', 'script', 'serviceworker', 'sharedworker', 'worker', 'style', 'track', 'video', 'image', 'manifest', 'xslt', 'fetch', '']})  \ ],  \ 'main': [      \ flow_elements + ['style'], | 
