mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-04-13 13:19:12 +08:00
parent
5d74df0487
commit
7c9058447b
12
bundle/dein.vim/.github/FUNDING.yml
vendored
Normal file
12
bundle/dein.vim/.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: Shougo # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
@ -1,13 +0,0 @@
|
||||
dist: xenial
|
||||
|
||||
language: python
|
||||
|
||||
python:
|
||||
- 3.7
|
||||
|
||||
install:
|
||||
- eval "$(curl -Ss https://raw.githubusercontent.com/neovim/bot-ci/master/scripts/travis-setup.sh) nightly-x64"
|
||||
- make install
|
||||
|
||||
script:
|
||||
- make --keep-going test
|
@ -4,21 +4,21 @@ export THEMIS_ARGS := -e -s --headless
|
||||
export THEMIS_HOME := ./vim-themis
|
||||
|
||||
|
||||
install: vim-themis
|
||||
install:
|
||||
pip install --upgrade -r test/requirements.txt
|
||||
|
||||
install-user: vim-themis
|
||||
install-user:
|
||||
pip install --user --upgrade -r test/requirements.txt
|
||||
|
||||
lint:
|
||||
vint --version
|
||||
vint autoload
|
||||
|
||||
test:
|
||||
test: vim-themis
|
||||
themis --version
|
||||
themis test/
|
||||
|
||||
vim-themis:
|
||||
git clone https://github.com/thinca/vim-themis vim-themis
|
||||
|
||||
.PHONY: install lint test
|
||||
.PHONY: install install-user lint test
|
||||
|
@ -1,6 +1,6 @@
|
||||
# dein.vim
|
||||
|
||||
[](https://gitter.im/Shougo/dein.vim?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://travis-ci.org/Shougo/dein.vim)
|
||||
[](https://gitter.im/Shougo/dein.vim?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||
Please read [help](doc/dein.txt) for details.
|
||||
|
||||
@ -19,11 +19,12 @@ Dein.vim is a dark powered Vim/Neovim plugin manager.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Vim 8.0 or above or NeoVim.
|
||||
- "xcopy" command in $PATH (Windows)
|
||||
- Vim 8.2 or above or NeoVim(0.5.0+).
|
||||
- "xcopy" command in $PATH or Python3 interface (Windows)
|
||||
- "git" command in $PATH (if you want to install github or vim.org plugins)
|
||||
|
||||
Note: If you use Vim 7.4, please use dein.vim ver.1.5 instead.
|
||||
Note: If you use below Vim 8.2 or neovim 0.5, please use dein.vim ver.2.2
|
||||
instead.
|
||||
|
||||
If you need vim-plug like install UI, you can use dein-ui.vim.
|
||||
https://github.com/wsdjeg/dein-ui.vim
|
||||
@ -59,32 +60,7 @@ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||||
./installer.ps1 ~/.cache/dein
|
||||
```
|
||||
|
||||
2. Edit your .vimrc like this.
|
||||
|
||||
```vim
|
||||
if &compatible
|
||||
set nocompatible
|
||||
endif
|
||||
" Add the dein installation directory into runtimepath
|
||||
set runtimepath+=~/.cache/dein/repos/github.com/Shougo/dein.vim
|
||||
|
||||
if dein#load_state('~/.cache/dein')
|
||||
call dein#begin('~/.cache/dein')
|
||||
|
||||
call dein#add('~/.cache/dein/repos/github.com/Shougo/dein.vim')
|
||||
call dein#add('Shougo/deoplete.nvim')
|
||||
if !has('nvim')
|
||||
call dein#add('roxma/nvim-yarp')
|
||||
call dein#add('roxma/vim-hug-neovim-rpc')
|
||||
endif
|
||||
|
||||
call dein#end()
|
||||
call dein#save_state()
|
||||
endif
|
||||
|
||||
filetype plugin indent on
|
||||
syntax enable
|
||||
```
|
||||
2. Edit your .vimrc like in "Examples" section.
|
||||
|
||||
3. Open vim and install dein
|
||||
|
||||
@ -92,6 +68,44 @@ syntax enable
|
||||
:call dein#install()
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
```vim
|
||||
if &compatible
|
||||
set nocompatible " Be iMproved
|
||||
endif
|
||||
|
||||
" Required:
|
||||
" Add the dein installation directory into runtimepath
|
||||
set runtimepath+={path to dein.vim directory}
|
||||
|
||||
" Required:
|
||||
call dein#begin({path to plugin base path directory})
|
||||
|
||||
" Let dein manage dein
|
||||
call dein#add({path to dein.vim directory})
|
||||
if !has('nvim')
|
||||
call dein#add('roxma/nvim-yarp')
|
||||
call dein#add('roxma/vim-hug-neovim-rpc')
|
||||
endif
|
||||
|
||||
" Add or remove your plugins here like this:
|
||||
"call dein#add('Shougo/neosnippet.vim')
|
||||
"call dein#add('Shougo/neosnippet-snippets')
|
||||
|
||||
" Required:
|
||||
call dein#end()
|
||||
|
||||
" Required:
|
||||
filetype plugin indent on
|
||||
syntax enable
|
||||
|
||||
" If you want to install not installed plugins on startup.
|
||||
"if dein#check_install()
|
||||
" call dein#install()
|
||||
"endif
|
||||
```
|
||||
|
||||
|
||||
## Features
|
||||
|
||||
|
@ -4,104 +4,15 @@
|
||||
" License: MIT license
|
||||
"=============================================================================
|
||||
|
||||
function! dein#_init() abort
|
||||
let g:dein#name = ''
|
||||
let g:dein#plugin = {}
|
||||
let g:dein#_cache_version = 150
|
||||
let g:dein#_plugins = {}
|
||||
let g:dein#_base_path = ''
|
||||
let g:dein#_cache_path = ''
|
||||
let g:dein#_runtime_path = ''
|
||||
let g:dein#_hook_add = ''
|
||||
let g:dein#_ftplugin = {}
|
||||
let g:dein#_called_lua = {}
|
||||
let g:dein#_off1 = ''
|
||||
let g:dein#_off2 = ''
|
||||
let g:dein#_vimrcs = []
|
||||
let g:dein#_block_level = 0
|
||||
let g:dein#_event_plugins = {}
|
||||
let g:dein#_is_sudo = $SUDO_USER !=# '' && $USER !=# $SUDO_USER
|
||||
\ && $HOME !=# expand('~'.$USER)
|
||||
\ && $HOME ==# expand('~'.$SUDO_USER)
|
||||
let g:dein#_progname = fnamemodify(v:progname, ':r')
|
||||
let g:dein#_init_runtimepath = &runtimepath
|
||||
let g:dein#_loaded_rplugins = v:false
|
||||
|
||||
if get(g:, 'dein#lazy_rplugins', v:false)
|
||||
" Disable remote plugin loading
|
||||
let g:loaded_remote_plugins = 1
|
||||
endif
|
||||
|
||||
augroup dein
|
||||
autocmd!
|
||||
autocmd FuncUndefined *
|
||||
\ if stridx(expand('<afile>'), 'remote#') != 0 |
|
||||
\ call dein#autoload#_on_func(expand('<afile>')) |
|
||||
\ endif
|
||||
autocmd BufRead *? call dein#autoload#_on_default_event('BufRead')
|
||||
autocmd BufNew,BufNewFile *? call dein#autoload#_on_default_event('BufNew')
|
||||
autocmd VimEnter *? call dein#autoload#_on_default_event('VimEnter')
|
||||
autocmd FileType *? call dein#autoload#_on_default_event('FileType')
|
||||
autocmd BufWritePost *.vim,*.toml,vimrc,.vimrc
|
||||
\ call dein#util#_check_vimrcs()
|
||||
augroup END
|
||||
augroup dein-events | augroup END
|
||||
|
||||
if !exists('##CmdUndefined') | return | endif
|
||||
autocmd dein CmdUndefined *
|
||||
\ call dein#autoload#_on_pre_cmd(expand('<afile>'))
|
||||
if has('nvim-0.5')
|
||||
lua <<END
|
||||
table.insert(package.loaders, 1, (function()
|
||||
return function(mod_name)
|
||||
vim.fn['dein#autoload#_on_lua'](mod_name)
|
||||
return nil
|
||||
end
|
||||
end)())
|
||||
END
|
||||
endif
|
||||
endfunction
|
||||
function! dein#load_cache_raw(vimrcs) abort
|
||||
let g:dein#_vimrcs = a:vimrcs
|
||||
let cache = get(g:, 'dein#cache_directory', g:dein#_base_path)
|
||||
\ .'/cache_' . g:dein#_progname
|
||||
let time = getftime(cache)
|
||||
if !empty(filter(map(copy(g:dein#_vimrcs),
|
||||
\ 'getftime(expand(v:val))'), 'time < v:val'))
|
||||
return [{}, {}]
|
||||
endif
|
||||
let list = readfile(cache)
|
||||
if len(list) != 3 || string(g:dein#_vimrcs) !=# list[0]
|
||||
return [{}, {}]
|
||||
endif
|
||||
return [json_decode(list[1]), json_decode(list[2])]
|
||||
return dein#min#_load_cache_raw(a:vimrcs)
|
||||
endfunction
|
||||
function! dein#load_state(path, ...) abort
|
||||
if !exists('#dein')
|
||||
call dein#_init()
|
||||
endif
|
||||
let sourced = a:0 > 0 ? a:1 : has('vim_starting') &&
|
||||
\ (!exists('&loadplugins') || &loadplugins)
|
||||
if (g:dein#_is_sudo || !sourced) | return 1 | endif
|
||||
let g:dein#_base_path = expand(a:path)
|
||||
|
||||
let state = get(g:, 'dein#cache_directory', g:dein#_base_path)
|
||||
\ . '/state_' . g:dein#_progname . '.vim'
|
||||
if !filereadable(state) | return 1 | endif
|
||||
try
|
||||
execute 'source' fnameescape(state)
|
||||
catch
|
||||
if v:exception !=# 'Cache loading error'
|
||||
call dein#util#_error('Loading state error: ' . v:exception)
|
||||
endif
|
||||
call dein#clear_state()
|
||||
return 1
|
||||
endtry
|
||||
return call('dein#min#load_state', [a:path] + a:000)
|
||||
endfunction
|
||||
|
||||
function! dein#tap(name) abort
|
||||
if !has_key(g:dein#_plugins, a:name)
|
||||
\ || !isdirectory(g:dein#_plugins[a:name].path) | return 0 | endif
|
||||
if !dein#is_available(a:name) | return 0 | endif
|
||||
let g:dein#name = a:name
|
||||
let g:dein#plugin = g:dein#_plugins[a:name]
|
||||
return 1
|
||||
@ -111,6 +22,15 @@ function! dein#is_sourced(name) abort
|
||||
\ && isdirectory(g:dein#_plugins[a:name].path)
|
||||
\ && g:dein#_plugins[a:name].sourced
|
||||
endfunction
|
||||
function! dein#is_available(names) abort
|
||||
for name in type(a:names) ==# v:t_list ? a:names : [a:names]
|
||||
if !has_key(g:dein#_plugins, name) | return 0 | endif
|
||||
let plugin = g:dein#_plugins[name]
|
||||
if !isdirectory(plugin.path)
|
||||
\ || (has_key(plugin, 'if') && !eval(plugin.if)) | return 0 | endif
|
||||
endfor
|
||||
return 1
|
||||
endfunction
|
||||
function! dein#begin(path, ...) abort
|
||||
return dein#util#_begin(a:path, (empty(a:000) ? [] : a:1))
|
||||
endfunction
|
||||
@ -209,7 +129,7 @@ endfunction
|
||||
function! dein#config(arg, ...) abort
|
||||
return type(a:arg) != v:t_list ?
|
||||
\ dein#util#_config(a:arg, get(a:000, 0, {})) :
|
||||
\ map(copy(a:arg), 'dein#util#_config(v:val, a:1)')
|
||||
\ map(copy(a:arg), { _, val -> dein#util#_config(val, a:1) })
|
||||
endfunction
|
||||
function! dein#set_hook(plugins, hook_name, hook) abort
|
||||
return dein#util#_set_hook(a:plugins, a:hook_name, a:hook)
|
||||
@ -218,5 +138,10 @@ function! dein#save_state() abort
|
||||
return dein#util#_save_state(has('vim_starting'))
|
||||
endfunction
|
||||
function! dein#clear_state() abort
|
||||
return dein#util#_clear_state()
|
||||
call dein#util#_clear_state()
|
||||
|
||||
if !get(g:, 'dein#auto_recache', v:false) && !empty(g:dein#_ftplugin)
|
||||
call dein#util#_notify(
|
||||
\ 'call dein#recache_runtimepath() is needed for ftplugin feature')
|
||||
endif
|
||||
endfunction
|
||||
|
801
bundle/dein.vim/autoload/dein/DateTime.vim
Normal file
801
bundle/dein.vim/autoload/dein/DateTime.vim
Normal file
@ -0,0 +1,801 @@
|
||||
" date and time library.
|
||||
|
||||
function! s:_init() abort
|
||||
let s:NUM_SECONDS = 60
|
||||
let s:NUM_MINUTES = 60
|
||||
let s:NUM_HOURS = 24
|
||||
let s:NUM_DAYS_OF_WEEK = 7
|
||||
let s:NUM_MONTHS = 12
|
||||
let s:SECONDS_OF_HOUR = s:NUM_SECONDS * s:NUM_MINUTES
|
||||
let s:SECONDS_OF_DAY = s:SECONDS_OF_HOUR * s:NUM_HOURS
|
||||
let s:ERA_TIME = s:_g2jd(1, 1, 1)
|
||||
let s:EPOC_TIME = s:_g2jd(1970, 1, 1)
|
||||
|
||||
let s:MONTHS = map(range(1, 12),
|
||||
\ 's:from_date(1970, v:val, 1, 0, 0, 0, 0).unix_time()')
|
||||
let s:WEEKS = map(range(4, 10),
|
||||
\ 's:from_date(1970, 1, v:val, 0, 0, 0, 0).unix_time()')
|
||||
let s:AM_PM_TIMES = map([0, 12],
|
||||
\ 's:from_date(1970, 1, 1, v:val, 0, 0, 0).unix_time()')
|
||||
|
||||
" default values
|
||||
call extend(s:DateTime, {
|
||||
\ '_year': 0,
|
||||
\ '_month': 1,
|
||||
\ '_day': 1,
|
||||
\ '_hour': 0,
|
||||
\ '_minute': 0,
|
||||
\ '_second': 0,
|
||||
\ '_timezone': s:timezone(),
|
||||
\ })
|
||||
call extend(s:TimeDelta, {
|
||||
\ '_days': 0,
|
||||
\ '_seconds': 0,
|
||||
\ })
|
||||
let s:tz_default_offset = s:timezone().offset()
|
||||
endfunction
|
||||
|
||||
" Creates a DateTime object with current time from system.
|
||||
function! s:now(...) abort
|
||||
let now = s:from_unix_time(localtime())
|
||||
if a:0
|
||||
let now = now.to(s:timezone(a:1))
|
||||
endif
|
||||
return now
|
||||
endfunction
|
||||
|
||||
" Creates a DateTime object from given unix time.
|
||||
function! s:from_unix_time(unix_time, ...) abort
|
||||
let tz = call('s:timezone', a:000)
|
||||
return call('s:from_date',
|
||||
\ map(split(strftime('%Y %m %d %H %M %S', a:unix_time)),
|
||||
\ 'str2nr(v:val, 10)')).to(tz)
|
||||
endfunction
|
||||
|
||||
" Creates a DateTime object from given date and time.
|
||||
" @param year = 1970
|
||||
" @param month = 1
|
||||
" @param day = 1
|
||||
" @param hour = 0
|
||||
" @param minute = 0
|
||||
" @param second = 0
|
||||
" @param timezone = ''
|
||||
function! s:from_date(...) abort
|
||||
let o = copy(s:DateTime)
|
||||
let [o._year, o._month, o._day, o._hour, o._minute, o._second, tz] =
|
||||
\ a:000 + [1970, 1, 1, 0, 0, 0, ''][a:0 :]
|
||||
let o._timezone = s:timezone(tz)
|
||||
return o._normalize()
|
||||
endfunction
|
||||
|
||||
" Creates a DateTime object from format.
|
||||
function! dein#DateTime#from_format(string, format, ...) abort
|
||||
let o = copy(s:DateTime)
|
||||
let locale = a:0 ? a:1 : ''
|
||||
let remain = a:string
|
||||
let skip_pattern = ''
|
||||
for f in s:_split_format(a:format)
|
||||
if type(f) == v:t_string
|
||||
let pat = '^' . skip_pattern . '\V' . escape(f, '\')
|
||||
let matched_len = len(matchstr(remain, pat))
|
||||
if matched_len == 0
|
||||
throw join([
|
||||
\ 'vital: DateTime: Parse error:',
|
||||
\ 'input: ' . a:string,
|
||||
\ 'format: ' . a:format,
|
||||
\ ], "\n")
|
||||
endif
|
||||
let remain = remain[matched_len :]
|
||||
else " if type(f) == v:t_list
|
||||
let info = f[0]
|
||||
if info[0] ==# '#skip'
|
||||
let skip_pattern = info[1]
|
||||
else
|
||||
let remain = s:_read_format(o, f, remain, skip_pattern, locale)
|
||||
let skip_pattern = ''
|
||||
endif
|
||||
endif
|
||||
unlet f
|
||||
endfor
|
||||
return o._normalize()
|
||||
endfunction
|
||||
" @vimlint(EVL102, 1, l:locale)
|
||||
function! s:_read_format(datetime, descriptor, remain, skip_pattern, locale) abort
|
||||
" "o", "key", "value" and "locale" are used by parse_conv
|
||||
let o = a:datetime
|
||||
let locale = a:locale " for parse_conv
|
||||
let [info, flag, width] = a:descriptor
|
||||
let key = '_' . info[0]
|
||||
if !has_key(o, key)
|
||||
let key = '_'
|
||||
endif
|
||||
let Captor = info[1]
|
||||
if type(Captor) == v:t_func
|
||||
let pattern = call(Captor, [a:locale], {})
|
||||
if type(pattern) == v:t_list
|
||||
let candidates = pattern
|
||||
unlet pattern
|
||||
let pattern = '\%(' . join(candidates, '\|') . '\)'
|
||||
endif
|
||||
elseif type(Captor) == v:t_list
|
||||
if width ==# ''
|
||||
let width = Captor[1]
|
||||
endif
|
||||
let pattern = '\d\{1,' . width . '}'
|
||||
if flag ==# '_'
|
||||
let pattern = '\s*' . pattern
|
||||
endif
|
||||
else " if type(Captor) == v:t_string
|
||||
let pattern = Captor
|
||||
endif
|
||||
|
||||
let value = matchstr(a:remain, '^' . a:skip_pattern . pattern)
|
||||
let matched_len = len(value)
|
||||
|
||||
if exists('candidates')
|
||||
let value = index(candidates, value)
|
||||
elseif type(Captor) == v:t_list
|
||||
let value = str2nr(value, 10)
|
||||
endif
|
||||
|
||||
if 4 <= len(info)
|
||||
let l:['value'] = eval(info[3])
|
||||
endif
|
||||
if key !=# '_'
|
||||
let o[key] = value
|
||||
endif
|
||||
return a:remain[matched_len :]
|
||||
endfunction
|
||||
" @vimlint(EVL102, 0, l:locale)
|
||||
|
||||
" Creates a DateTime object from Julian day.
|
||||
function! s:from_julian_day(jd, ...) abort
|
||||
let tz = call('s:timezone', a:000)
|
||||
let second = 0
|
||||
if type(a:jd) == v:t_float
|
||||
let jd = float2nr(floor(a:jd))
|
||||
let second = float2nr(s:SECONDS_OF_DAY * (a:jd - jd))
|
||||
else
|
||||
let jd = a:jd
|
||||
endif
|
||||
let [year, month, day] = s:_jd2g(jd)
|
||||
return s:from_date(year, month, day, 12, 0, second, '+0000').to(tz)
|
||||
endfunction
|
||||
|
||||
" Creates a new TimeZone object.
|
||||
function! s:timezone(...) abort
|
||||
let info = a:0 ? a:1 : ''
|
||||
if s:_is_class(info, 'TimeZone')
|
||||
return info
|
||||
endif
|
||||
if info is# ''
|
||||
unlet info
|
||||
let info = s:_default_tz()
|
||||
endif
|
||||
let tz = copy(s:TimeZone)
|
||||
if type(info) == v:t_number
|
||||
let tz._offset = info * s:NUM_MINUTES * s:NUM_SECONDS
|
||||
elseif type(info) == v:t_string
|
||||
let list = matchlist(info, '\v^([+-])?(\d{1,2}):?(\d{1,2})?$')
|
||||
if !empty(list)
|
||||
let tz._offset = str2nr(list[1] . s:NUM_SECONDS) *
|
||||
\ (str2nr(list[2]) * s:NUM_MINUTES + str2nr(list[3]))
|
||||
else
|
||||
" TODO: TimeZone names
|
||||
throw 'vital: DateTime: Unknown timezone: ' . string(info)
|
||||
endif
|
||||
else
|
||||
throw 'vital: DateTime: Invalid timezone: ' . string(info)
|
||||
endif
|
||||
return tz
|
||||
endfunction
|
||||
|
||||
" Creates a new TimeDelta object.
|
||||
function! s:delta(...) abort
|
||||
let info = a:0 ? a:1 : ''
|
||||
if s:_is_class(info, 'TimeDelta')
|
||||
return info
|
||||
endif
|
||||
let d = copy(s:TimeDelta)
|
||||
if a:0 == 2 && type(a:1) == v:t_number && type(a:2) == v:t_number
|
||||
let d._days = a:1
|
||||
let d._seconds = a:2
|
||||
else
|
||||
let a = copy(a:000)
|
||||
while 2 <= len(a) && type(a[0]) == v:t_number && type(a[1]) == v:t_string
|
||||
let [value, unit] = remove(a, 0, 1)
|
||||
if unit =~? '^sec\%(onds\?\)\?$'
|
||||
let d._seconds += value
|
||||
elseif unit =~? '^min\%(utes\?\)\?$'
|
||||
let d._seconds += value * s:NUM_SECONDS
|
||||
elseif unit =~? '^hours\?$'
|
||||
let d._seconds += value * s:SECONDS_OF_HOUR
|
||||
elseif unit =~? '^days\?$'
|
||||
let d._days += value
|
||||
elseif unit =~? '^weeks\?$'
|
||||
let d._days += value * s:NUM_DAYS_OF_WEEK
|
||||
else
|
||||
throw 'vital: DateTime: Invalid unit for delta(): ' . string(unit)
|
||||
endif
|
||||
endwhile
|
||||
if !empty(a)
|
||||
throw 'vital: DateTime: Invalid arguments for delta(): ' . string(a)
|
||||
endif
|
||||
endif
|
||||
return d._normalize()
|
||||
endfunction
|
||||
|
||||
function! s:compare(d1, d2) abort
|
||||
return a:d1.compare(a:d2)
|
||||
endfunction
|
||||
|
||||
" Returns month names according to the current or specified locale.
|
||||
" @param fullname = false
|
||||
" @param locale = ''
|
||||
function! s:month_names(...) abort
|
||||
return s:_names(s:MONTHS, a:0 && a:1 ? '%B' : '%b', get(a:000, 1, ''))
|
||||
endfunction
|
||||
|
||||
" Returns weekday names according to the current or specified locale.
|
||||
" @param fullname = false
|
||||
" @param locale = ''
|
||||
function! s:weekday_names(...) abort
|
||||
return s:_names(s:WEEKS, a:0 && a:1 ? '%A' : '%a', get(a:000, 1, ''))
|
||||
endfunction
|
||||
|
||||
" Returns am/pm names according to the current or specified locale.
|
||||
" @param lowercase = false
|
||||
" @param locale = ''
|
||||
function! s:am_pm_names(...) abort
|
||||
let [lowercase, locale] = a:000 + [0, ''][a:0 :]
|
||||
let names = s:_am_pm_names(lowercase, locale)
|
||||
if lowercase
|
||||
" Some environments do not support %P.
|
||||
" In this case, use tolower() of %p instead of.
|
||||
let failed = names[0] ==# '' || names[0] ==# 'P'
|
||||
if failed
|
||||
let names = s:_am_pm_names(0, locale)
|
||||
call map(names, 'tolower(v:val)')
|
||||
endif
|
||||
endif
|
||||
return names
|
||||
endfunction
|
||||
|
||||
function! s:_am_pm_names(lowercase, locale) abort
|
||||
return s:_names(s:AM_PM_TIMES, a:lowercase ? '%P' : '%p', a:locale)
|
||||
endfunction
|
||||
|
||||
" Returns 1 if the year is a leap year.
|
||||
function! s:is_leap_year(year) abort
|
||||
return a:year % 4 == 0 && a:year % 100 != 0 || a:year % 400 == 0
|
||||
endfunction
|
||||
|
||||
|
||||
" ----------------------------------------------------------------------------
|
||||
let s:Class = {}
|
||||
function! s:Class._clone() abort
|
||||
return filter(copy(self), 'v:key !~# "^__"')
|
||||
endfunction
|
||||
function! s:_new_class(class) abort
|
||||
return extend({'class': a:class}, s:Class)
|
||||
endfunction
|
||||
function! s:_is_class(obj, class) abort
|
||||
return type(a:obj) == v:t_dict && get(a:obj, 'class', '') ==# a:class
|
||||
endfunction
|
||||
|
||||
" ----------------------------------------------------------------------------
|
||||
let s:DateTime = s:_new_class('DateTime')
|
||||
function! s:DateTime.year() abort
|
||||
return self._year
|
||||
endfunction
|
||||
function! s:DateTime.month() abort
|
||||
return self._month
|
||||
endfunction
|
||||
function! s:DateTime.day() abort
|
||||
return self._day
|
||||
endfunction
|
||||
function! s:DateTime.hour() abort
|
||||
return self._hour
|
||||
endfunction
|
||||
function! s:DateTime.minute() abort
|
||||
return self._minute
|
||||
endfunction
|
||||
function! s:DateTime.second() abort
|
||||
return self._second
|
||||
endfunction
|
||||
function! s:DateTime.timezone(...) abort
|
||||
if a:0
|
||||
let dt = self._clone()
|
||||
let dt._timezone = call('s:timezone', a:000)
|
||||
return dt
|
||||
endif
|
||||
return self._timezone
|
||||
endfunction
|
||||
function! s:DateTime.day_of_week() abort
|
||||
if !has_key(self, '__day_of_week')
|
||||
let self.__day_of_week = self.timezone(0).days_from_era() % 7
|
||||
endif
|
||||
return self.__day_of_week
|
||||
endfunction
|
||||
function! s:DateTime.day_of_year() abort
|
||||
if !has_key(self, '__day_of_year')
|
||||
let self.__day_of_year = self.timezone(0).julian_day() -
|
||||
\ s:_g2jd(self._year, 1, 1) + 1
|
||||
endif
|
||||
return self.__day_of_year
|
||||
endfunction
|
||||
function! s:DateTime.days_from_era() abort
|
||||
if !has_key(self, '__day_from_era')
|
||||
let self.__day_from_era = self.julian_day() - s:ERA_TIME + 1
|
||||
endif
|
||||
return self.__day_from_era
|
||||
endfunction
|
||||
function! s:DateTime.julian_day(...) abort
|
||||
let utc = self.to(0)
|
||||
let jd = s:_g2jd(utc._year, utc._month, utc._day)
|
||||
if a:0 && a:1
|
||||
if has('float')
|
||||
let jd += (utc.seconds_of_day() + 0.0) / s:SECONDS_OF_DAY - 0.5
|
||||
elseif utc._hour < 12
|
||||
let jd -= 1
|
||||
endif
|
||||
endif
|
||||
return jd
|
||||
endfunction
|
||||
function! s:DateTime.seconds_of_day() abort
|
||||
return (self._hour * s:NUM_MINUTES + self._minute)
|
||||
\ * s:NUM_SECONDS + self._second
|
||||
endfunction
|
||||
function! s:DateTime.quarter() abort
|
||||
return (self._month - 1) / 3 + 1
|
||||
endfunction
|
||||
function! s:DateTime.unix_time() abort
|
||||
if !has_key(self, '__unix_time')
|
||||
if self._year < 1969 ||
|
||||
\ (!has('num64') && (2038 < self._year))
|
||||
let self.__unix_time = -1
|
||||
else
|
||||
let utc = self.to(0)
|
||||
let self.__unix_time = (utc.julian_day() - s:EPOC_TIME) *
|
||||
\ s:SECONDS_OF_DAY + utc.seconds_of_day()
|
||||
if self.__unix_time < 0
|
||||
let self.__unix_time = -1
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
return self.__unix_time
|
||||
endfunction
|
||||
function! s:DateTime.is_leap_year() abort
|
||||
return s:is_leap_year(self._year)
|
||||
endfunction
|
||||
function! s:DateTime.is(dt) abort
|
||||
return self.compare(a:dt) == 0
|
||||
endfunction
|
||||
function! s:DateTime.compare(dt) abort
|
||||
return self.delta(a:dt).sign()
|
||||
endfunction
|
||||
function! s:DateTime.delta(dt) abort
|
||||
let left = self.to(0)
|
||||
let right = a:dt.to(0)
|
||||
return s:delta(left.days_from_era() - right.days_from_era(),
|
||||
\ (left.seconds_of_day() + left.timezone().offset()) -
|
||||
\ (right.seconds_of_day() + right.timezone().offset()))
|
||||
endfunction
|
||||
function! s:DateTime.to(...) abort
|
||||
let dt = self._clone()
|
||||
if a:0 == 1 && !s:_is_class(a:1, 'TimeDelta')
|
||||
let tz = s:timezone(a:1)
|
||||
let dt._second += tz.offset() - dt.timezone().offset()
|
||||
let dt._timezone = tz
|
||||
return dt._normalize()
|
||||
endif
|
||||
let delta = call('s:delta', a:000)
|
||||
let dt._day += delta._days
|
||||
let dt._second += delta._seconds
|
||||
return dt._normalize()
|
||||
endfunction
|
||||
" @vimlint(EVL102, 1, l:locale)
|
||||
function! s:DateTime.format(format, ...) abort
|
||||
let locale = a:0 ? a:1 : ''
|
||||
let result = ''
|
||||
for f in s:_split_format(a:format)
|
||||
if type(f) == v:t_string
|
||||
let result .= f
|
||||
elseif type(f) == v:t_list
|
||||
let [info, flag, width] = f
|
||||
let padding = ''
|
||||
if type(info[1]) == v:t_list
|
||||
let [padding, w] = info[1]
|
||||
if width ==# ''
|
||||
let width = w
|
||||
endif
|
||||
endif
|
||||
if has_key(self, info[0])
|
||||
let value = self[info[0]]()
|
||||
if 2 < len(info)
|
||||
let l:['value'] = eval(info[2])
|
||||
endif
|
||||
elseif 2 < len(info)
|
||||
let value = info[2]
|
||||
else
|
||||
let value = ''
|
||||
endif
|
||||
if flag ==# '^'
|
||||
let value = toupper(value)
|
||||
elseif flag ==# '-'
|
||||
let padding = ''
|
||||
elseif flag ==# '_'
|
||||
let padding = ' '
|
||||
elseif flag ==# '0'
|
||||
let padding = '0'
|
||||
endif
|
||||
let result .= printf('%' . padding . width . 's', value)
|
||||
unlet value
|
||||
endif
|
||||
unlet f
|
||||
endfor
|
||||
return result
|
||||
endfunction
|
||||
" @vimlint(EVL102, 0, l:locale)
|
||||
function! s:DateTime.strftime(format, ...) abort
|
||||
let tz = self.timezone()
|
||||
let ts = self.unix_time() + tz.offset() - s:tz_default_offset
|
||||
let locale = get(a:000, 0, '')
|
||||
let format = a:format =~? '%z'
|
||||
\ ? substitute(a:format, '%z', tz.offset_string(), 'g')
|
||||
\ : a:format
|
||||
if empty(locale)
|
||||
return strftime(format, ts)
|
||||
else
|
||||
let expr = printf('strftime(%s, %d)', string(format), ts)
|
||||
return s:_with_locale(expr, locale)
|
||||
endif
|
||||
endfunction
|
||||
function! s:DateTime.to_string() abort
|
||||
return self.format('%c')
|
||||
endfunction
|
||||
function! s:DateTime._normalize() abort
|
||||
let next = 0
|
||||
for unit in ['second', 'minute', 'hour']
|
||||
let key = '_' . unit
|
||||
let self[key] += next
|
||||
let [next, self[key]] =
|
||||
\ s:_divmod(self[key], s:['NUM_' . toupper(unit . 's')])
|
||||
endfor
|
||||
let self._day += next
|
||||
let [self._year, self._month, self._day] =
|
||||
\ s:_jd2g(s:_g2jd(self._year, self._month, self._day))
|
||||
return self
|
||||
endfunction
|
||||
|
||||
let s:DateTime['+'] = s:DateTime.to
|
||||
let s:DateTime['-'] = s:DateTime.delta
|
||||
let s:DateTime['=='] = s:DateTime.is
|
||||
|
||||
|
||||
" ----------------------------------------------------------------------------
|
||||
let s:TimeZone = s:_new_class('TimeZone')
|
||||
function! s:TimeZone.offset() abort
|
||||
return self._offset
|
||||
endfunction
|
||||
function! s:TimeZone.minutes() abort
|
||||
return self._offset / s:NUM_SECONDS
|
||||
endfunction
|
||||
function! s:TimeZone.hours() abort
|
||||
return self._offset / s:SECONDS_OF_HOUR
|
||||
endfunction
|
||||
function! s:TimeZone.sign() abort
|
||||
return self._offset < 0 ? -1 : 0 < self._offset ? 1 : 0
|
||||
endfunction
|
||||
function! s:TimeZone.offset_string() abort
|
||||
return substitute(self.w3c(), ':', '', '')
|
||||
endfunction
|
||||
function! s:TimeZone.w3c() abort
|
||||
let sign = self._offset < 0 ? '-' : '+'
|
||||
let minutes = abs(self._offset) / s:NUM_SECONDS
|
||||
return printf('%s%02d:%02d', sign,
|
||||
\ minutes / s:NUM_MINUTES, minutes % s:NUM_MINUTES)
|
||||
endfunction
|
||||
|
||||
" ----------------------------------------------------------------------------
|
||||
let s:TimeDelta = s:_new_class('TimeDelta')
|
||||
function! s:TimeDelta.seconds() abort
|
||||
return self._seconds % s:NUM_SECONDS
|
||||
endfunction
|
||||
function! s:TimeDelta.minutes() abort
|
||||
return self._seconds / s:NUM_SECONDS % s:NUM_MINUTES
|
||||
endfunction
|
||||
function! s:TimeDelta.hours() abort
|
||||
return self._seconds / s:SECONDS_OF_HOUR
|
||||
endfunction
|
||||
function! s:TimeDelta.days() abort
|
||||
return self._days
|
||||
endfunction
|
||||
function! s:TimeDelta.weeks() abort
|
||||
return self._days / s:NUM_DAYS_OF_WEEK
|
||||
endfunction
|
||||
function! s:TimeDelta.months() abort
|
||||
return self._days / 30
|
||||
endfunction
|
||||
function! s:TimeDelta.years() abort
|
||||
return self._days / 365
|
||||
endfunction
|
||||
function! s:TimeDelta.total_seconds() abort
|
||||
return self._days * s:SECONDS_OF_DAY + self._seconds
|
||||
endfunction
|
||||
function! s:TimeDelta.is(td) abort
|
||||
return self.subtract(a:td).sign() == 0
|
||||
endfunction
|
||||
function! s:TimeDelta.sign() abort
|
||||
if self._days < 0 || self._seconds < 0
|
||||
return -1
|
||||
elseif 0 < self._days || 0 < self._seconds
|
||||
return 1
|
||||
endif
|
||||
return 0
|
||||
endfunction
|
||||
function! s:TimeDelta.negate() abort
|
||||
let td = self._clone()
|
||||
let td._days = -self._days
|
||||
let td._seconds = -self._seconds
|
||||
return td._normalize()
|
||||
endfunction
|
||||
function! s:TimeDelta.duration() abort
|
||||
return self.sign() < 0 ? self.negate() : self
|
||||
endfunction
|
||||
function! s:TimeDelta.add(...) abort
|
||||
let n = self._clone()
|
||||
let other = call('s:delta', a:000)
|
||||
let n._days += other._days
|
||||
let n._seconds += other._seconds
|
||||
return n._normalize()
|
||||
endfunction
|
||||
function! s:TimeDelta.subtract(...) abort
|
||||
let other = call('s:delta', a:000)
|
||||
return self.add(other.negate())
|
||||
endfunction
|
||||
function! s:TimeDelta.about() abort
|
||||
if self.sign() == 0
|
||||
return 'now'
|
||||
endif
|
||||
let dir = self.sign() < 0 ? 'ago' : 'later'
|
||||
let d = self.duration()
|
||||
if d._days == 0
|
||||
if d._seconds < s:NUM_SECONDS
|
||||
let val = d.seconds()
|
||||
let unit = val == 1 ? 'second' : 'seconds'
|
||||
elseif d._seconds < s:SECONDS_OF_HOUR
|
||||
let val = d.minutes()
|
||||
let unit = val == 1 ? 'minute' : 'minutes'
|
||||
else
|
||||
let val = d.hours()
|
||||
let unit = val == 1 ? 'hour' : 'hours'
|
||||
endif
|
||||
else
|
||||
if d._days < s:NUM_DAYS_OF_WEEK
|
||||
let val = d.days()
|
||||
let unit = val == 1 ? 'day' : 'days'
|
||||
elseif d._days < 30
|
||||
let val = d.weeks()
|
||||
let unit = val == 1 ? 'week' : 'weeks'
|
||||
elseif d._days < 365
|
||||
let val = d.months()
|
||||
let unit = val == 1 ? 'month' : 'months'
|
||||
else
|
||||
let val = d.years()
|
||||
let unit = val == 1 ? 'year' : 'years'
|
||||
endif
|
||||
endif
|
||||
return printf('%d %s %s', val, unit, dir)
|
||||
endfunction
|
||||
function! s:TimeDelta.to_string() abort
|
||||
let str = self.sign() < 0 ? '-' : ''
|
||||
let d = self.duration()
|
||||
if d._days != 0
|
||||
let str .= d._days . (d._days == 1 ? 'day' : 'days') . ', '
|
||||
endif
|
||||
let str .= printf('%02d:%02d:%02d', d.hours(), d.minutes(), d.seconds())
|
||||
return str
|
||||
endfunction
|
||||
function! s:TimeDelta._normalize() abort
|
||||
let over_days = self._seconds / s:SECONDS_OF_DAY
|
||||
let self._days += over_days
|
||||
let self._seconds = self._seconds % s:SECONDS_OF_DAY
|
||||
|
||||
if self._days < 0 && 0 < self._seconds
|
||||
let self._days += 1
|
||||
let self._seconds -= s:SECONDS_OF_DAY
|
||||
elseif 0 < self._days && self._seconds < 0
|
||||
let self._days -= 1
|
||||
let self._seconds += s:SECONDS_OF_DAY
|
||||
endif
|
||||
return self
|
||||
endfunction
|
||||
|
||||
" ----------------------------------------------------------------------------
|
||||
|
||||
" Converts Gregorian Calendar to Julian day
|
||||
function! s:_g2jd(year, month, day) abort
|
||||
let [next, month] = s:_divmod(a:month - 1, s:NUM_MONTHS)
|
||||
let year = a:year + next + 4800 - (month <= 1)
|
||||
let month += month <= 1 ? 10 : -2
|
||||
return a:day + (153 * month + 2) / 5 + s:_div(1461 * year, 4) - 32045
|
||||
\ - s:_div(year, 100) + s:_div(year, 400)
|
||||
endfunction
|
||||
|
||||
" Converts Julian day to Gregorian Calendar
|
||||
function! s:_jd2g(jd) abort
|
||||
let t = a:jd + 68569
|
||||
let n = s:_div(4 * t, 146097)
|
||||
let t -= s:_div(146097 * n + 3, 4) - 1
|
||||
let i = (4000 * t) / 1461001
|
||||
let t += -(1461 * i) / 4 + 30
|
||||
let j = (80 * t) / 2447
|
||||
let x = j / 11
|
||||
let day = t - (2447 * j) / 80
|
||||
let month = j + 2 - (12 * x)
|
||||
let year = 100 * (n - 49) + i + x
|
||||
return [year, month, day]
|
||||
endfunction
|
||||
|
||||
function! s:_names(dates, format, locale) abort
|
||||
return s:_with_locale('map(copy(a:1), "strftime(a:2, v:val)")',
|
||||
\ a:locale, copy(a:dates), a:format)
|
||||
endfunction
|
||||
|
||||
function! s:_with_locale(expr, locale, ...) abort
|
||||
let current_locale = ''
|
||||
if a:locale !=# ''
|
||||
let current_locale = v:lc_time
|
||||
execute 'language time' a:locale
|
||||
endif
|
||||
try
|
||||
return eval(a:expr)
|
||||
finally
|
||||
if a:locale !=# ''
|
||||
execute 'language time' current_locale
|
||||
endif
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
function! s:_div(n, d) abort
|
||||
return s:_divmod(a:n, a:d)[0]
|
||||
endfunction
|
||||
function! s:_mod(n, d) abort
|
||||
return s:_divmod(a:n, a:d)[1]
|
||||
endfunction
|
||||
function! s:_divmod(n, d) abort
|
||||
let [q, mod] = [a:n / a:d, a:n % a:d]
|
||||
return mod != 0 && (a:d < 0) != (mod < 0) ? [q - 1, mod + a:d] : [q, mod]
|
||||
endfunction
|
||||
|
||||
|
||||
" ----------------------------------------------------------------------------
|
||||
function! s:_month_abbr(locale) abort
|
||||
return s:month_names(0, a:locale)
|
||||
endfunction
|
||||
function! s:_month_full(locale) abort
|
||||
return s:month_names(1, a:locale)
|
||||
endfunction
|
||||
function! s:_weekday_abbr(locale) abort
|
||||
return s:weekday_names(0, a:locale)
|
||||
endfunction
|
||||
function! s:_weekday_full(locale) abort
|
||||
return s:weekday_names(1, a:locale)
|
||||
endfunction
|
||||
function! s:_am_pm_lower(locale) abort
|
||||
return s:am_pm_names(1, a:locale)
|
||||
endfunction
|
||||
function! s:_am_pm_upper(locale) abort
|
||||
return s:am_pm_names(0, a:locale)
|
||||
endfunction
|
||||
|
||||
" key = descriptor
|
||||
" value = string (format alias)
|
||||
" value = [field, captor, format_conv, parse_conv]
|
||||
" at format:
|
||||
" field = function name of source.
|
||||
" captor = [flat, width] for number format.
|
||||
" format_conv = expr for convert. some variables are available.
|
||||
" parse_conv = unused.
|
||||
" at parse:
|
||||
" field = param name (with "_")
|
||||
" if it doesn't exist, the descriptor can't use.
|
||||
" field = #skip
|
||||
" in this case, captor is a skipping pattern
|
||||
" captor = pattern to match.
|
||||
" captor = [flat, width] for number format.
|
||||
" captor = a function to return a pattern or candidates.
|
||||
" format_conv = unused.
|
||||
" parse_conv = expr for convert. some variables are available.
|
||||
let s:format_info = {
|
||||
\ '%': ['', '%', '%'],
|
||||
\ 'a': ['day_of_week', function('s:_weekday_abbr'),
|
||||
\ 's:_weekday_abbr(locale)[value]'],
|
||||
\ 'A': ['day_of_week', function('s:_weekday_full'),
|
||||
\ 's:_weekday_full(locale)[value]'],
|
||||
\ 'b': ['month', function('s:_month_abbr'),
|
||||
\ 's:_month_abbr(locale)[value - 1]', 'value + 1'],
|
||||
\ 'B': ['month', function('s:_month_full'),
|
||||
\ 's:_month_full(locale)[value - 1]', 'value + 1'],
|
||||
\ 'c': '%F %T %z',
|
||||
\ 'C': ['year', ['0', 2], '(value + 99) / 100', 'o[key] % 100 + value * 100'],
|
||||
\ 'd': ['day', ['0', 2]],
|
||||
\ 'D': '%m/%d/%y',
|
||||
\ 'e': '%_m/%_d/%_y',
|
||||
\ 'F': '%Y-%m-%d',
|
||||
\ 'h': '%b',
|
||||
\ 'H': ['hour', ['0', 2]],
|
||||
\ 'I': ['hour', ['0', 2], 's:_mod(value - 1, 12) + 1', 'value % 12'],
|
||||
\ 'j': ['day_of_year', ['0', 3]],
|
||||
\ 'k': '%_H',
|
||||
\ 'l': '%_I',
|
||||
\ 'm': ['month', ['0', 2]],
|
||||
\ 'M': ['minute', ['0', 2]],
|
||||
\ 'n': ['', '\_s*', "\n"],
|
||||
\ 'p': ['hour', function('s:_am_pm_upper'),
|
||||
\ 's:_am_pm_upper(locale)[value / 12]', 'o[key] + value * 12'],
|
||||
\ 'P': ['hour', function('s:_am_pm_lower'),
|
||||
\ 's:_am_pm_lower(locale)[value / 12]', 'o[key] + value * 12'],
|
||||
\ 'r': '%I:%M:%S %p',
|
||||
\ 'R': '%H:%M',
|
||||
\ 's': ['unix_time', ['', '']],
|
||||
\ 'S': ['second', ['0', 2]],
|
||||
\ 't': ['', '\_.*', "\t"],
|
||||
\ 'u': ['day_of_week', ['0', 1], 'value == 0 ? 7 : value'],
|
||||
\ 'U': 'TODO',
|
||||
\ 'T': '%H:%M:%S',
|
||||
\ 'w': ['day_of_week', ['0', 1]],
|
||||
\ 'y': ['year', ['0', 2], 'value % 100',
|
||||
\ '(o[key] != 0 ? o[key] : (value < 69 ? 2000 : 1900)) + value'],
|
||||
\ 'Y': ['year', ['0', 4]],
|
||||
\ 'z': ['timezone', '\v[+-]?%(\d{1,2})?:?%(\d{1,2})?', 'value.offset_string()',
|
||||
\ 's:timezone(empty(value) ? 0 : value)'],
|
||||
\ '*': ['#skip', '.\{-}', ''],
|
||||
\ }
|
||||
let s:DESCRIPTORS_PATTERN = '[' . join(keys(s:format_info), '') . ']'
|
||||
|
||||
" 'foo%Ybar%02m' => ['foo', ['Y', '', -1], 'bar', ['m', '0', 2], '']
|
||||
function! s:_split_format(format) abort
|
||||
let res = []
|
||||
let pat = '\C%\([-_0^#]\?\)\(\d*\)\(' . s:DESCRIPTORS_PATTERN . '\)'
|
||||
let format = a:format
|
||||
while format !=# ''
|
||||
let i = match(format, pat)
|
||||
if i < 0
|
||||
let res += [format]
|
||||
break
|
||||
endif
|
||||
if i != 0
|
||||
let res += [format[: i - 1]]
|
||||
let format = format[i :]
|
||||
endif
|
||||
let [matched, flag, width, d] = matchlist(format, pat)[: 3]
|
||||
let format = format[len(matched) :]
|
||||
let info = s:format_info[d]
|
||||
if type(info) == v:t_string
|
||||
let format = info . format
|
||||
else
|
||||
let res += [[info, flag, width]]
|
||||
endif
|
||||
unlet info
|
||||
endwhile
|
||||
return res
|
||||
endfunction
|
||||
|
||||
if has('win32') " This means any versions of windows https://github.com/vim-jp/vital.vim/wiki/Coding-Rule#how-to-check-if-the-runtime-os-is-windows
|
||||
function! s:_default_tz() abort
|
||||
let hm = map(split(strftime('%H %M', 0), ' '), 'str2nr(v:val)')
|
||||
if str2nr(strftime('%Y', 0)) != 1970
|
||||
let tz_sec = s:SECONDS_OF_DAY - hm[0] * s:SECONDS_OF_HOUR - hm[1] * s:NUM_SECONDS
|
||||
return printf('-%02d%02d', tz_sec / s:SECONDS_OF_HOUR, (tz_sec / s:NUM_SECONDS) % s:NUM_MINUTES)
|
||||
endif
|
||||
return printf('+%02d%02d', hm[0], hm[1])
|
||||
endfunction
|
||||
else
|
||||
function! s:_default_tz() abort
|
||||
return strftime('%z')
|
||||
endfunction
|
||||
endif
|
||||
|
||||
call s:_init()
|
@ -8,23 +8,24 @@ function! dein#autoload#_source(...) abort
|
||||
let plugins = empty(a:000) ? values(g:dein#_plugins) :
|
||||
\ dein#util#_convert2list(a:1)
|
||||
if empty(plugins)
|
||||
return
|
||||
return []
|
||||
endif
|
||||
|
||||
if type(plugins[0]) != v:t_dict
|
||||
let plugins = map(dein#util#_convert2list(a:1),
|
||||
\ 'get(g:dein#_plugins, v:val, {})')
|
||||
\ { _, val -> get(g:dein#_plugins, val, {}) })
|
||||
endif
|
||||
|
||||
let rtps = dein#util#_split_rtp(&runtimepath)
|
||||
let index = index(rtps, dein#util#_get_runtime_path())
|
||||
if index < 0
|
||||
return 1
|
||||
return []
|
||||
endif
|
||||
|
||||
let sourced = []
|
||||
for plugin in filter(plugins,
|
||||
\ "!empty(v:val) && !v:val.sourced && v:val.rtp !=# ''")
|
||||
\ { _, val -> !empty(val) && !val.sourced && val.rtp !=# ''
|
||||
\ && (!has_key(v:val, 'if') || eval(v:val.if)) })
|
||||
call s:source_plugin(rtps, index, plugin, sourced)
|
||||
endfor
|
||||
|
||||
@ -35,11 +36,26 @@ function! dein#autoload#_source(...) abort
|
||||
|
||||
" Reload script files.
|
||||
for plugin in sourced
|
||||
for directory in filter(['plugin', 'after/plugin'],
|
||||
\ "isdirectory(plugin.rtp.'/'.v:val)")
|
||||
for file in dein#util#_globlist(plugin.rtp.'/'.directory.'/**/*.vim')
|
||||
for directory in map(filter(
|
||||
\ ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'],
|
||||
\ { _, val -> isdirectory(plugin.rtp . '/' . val) }),
|
||||
\ { _, val -> plugin.rtp . '/' . val })
|
||||
if directory =~# 'ftdetect'
|
||||
if get(plugin, 'merge_ftdetect')
|
||||
continue
|
||||
endif
|
||||
execute 'augroup filetypedetect'
|
||||
endif
|
||||
let files = glob(directory . '/**/*.vim', v:true, v:true)
|
||||
if has('nvim')
|
||||
let files += glob(directory . '/**/*.lua', v:true, v:true)
|
||||
endif
|
||||
for file in files
|
||||
execute 'source' fnameescape(file)
|
||||
endfor
|
||||
if directory =~# 'ftdetect'
|
||||
execute 'augroup END'
|
||||
endif
|
||||
endfor
|
||||
|
||||
if !has('vim_starting')
|
||||
@ -54,6 +70,19 @@ function! dein#autoload#_source(...) abort
|
||||
silent execute 'doautocmd' augroup event
|
||||
endif
|
||||
endfor
|
||||
|
||||
" Register for lazy loaded denops plugin
|
||||
if isdirectory(plugin.rtp . '/denops')
|
||||
\ && exists('*denops#plugin#is_loaded')
|
||||
for name in filter(map(globpath(plugin.rtp,
|
||||
\ 'denops/*/main.ts', v:true, v:true),
|
||||
\ { _, val -> fnamemodify(val, ':h:t')}),
|
||||
\ { _, val -> !denops#plugin#is_loaded(val) })
|
||||
" Note: denops#plugin#register() may be failed
|
||||
silent! call denops#plugin#register(name, { 'mode': 'skip' })
|
||||
call denops#plugin#wait(name)
|
||||
endfor
|
||||
endif
|
||||
endif
|
||||
endfor
|
||||
|
||||
@ -64,14 +93,16 @@ function! dein#autoload#_source(...) abort
|
||||
call s:reset_ftplugin()
|
||||
endif
|
||||
|
||||
if (is_reset || filetype_before !=# filetype_after) && &filetype !=# ''
|
||||
if (is_reset || filetype_before !=# filetype_after) && &l:filetype !=# ''
|
||||
" Recall FileType autocmd
|
||||
let &filetype = &filetype
|
||||
let &l:filetype = &l:filetype
|
||||
endif
|
||||
|
||||
if !has('vim_starting')
|
||||
call dein#call_hook('post_source', sourced)
|
||||
endif
|
||||
|
||||
return sourced
|
||||
endfunction
|
||||
|
||||
function! dein#autoload#_on_default_event(event) abort
|
||||
@ -87,28 +118,28 @@ function! dein#autoload#_on_default_event(event) abort
|
||||
|
||||
for filetype in split(&l:filetype, '\.')
|
||||
let plugins += filter(copy(lazy_plugins),
|
||||
\ "index(get(v:val, 'on_ft', []), filetype) >= 0")
|
||||
\ { _, val -> index(get(val, 'on_ft', []), filetype) >= 0 })
|
||||
endfor
|
||||
|
||||
let plugins += filter(copy(lazy_plugins),
|
||||
\ "!empty(filter(copy(get(v:val, 'on_path', [])),
|
||||
\ 'path =~? v:val'))")
|
||||
\ { _, val -> !empty(filter(copy(get(val, 'on_path', [])),
|
||||
\ { _, val -> path =~? val })) })
|
||||
let plugins += filter(copy(lazy_plugins),
|
||||
\ "!has_key(v:val, 'on_event')
|
||||
\ && has_key(v:val, 'on_if') && eval(v:val.on_if)")
|
||||
\ { _, val -> !has_key(val, 'on_event') && has_key(val, 'on_if')
|
||||
\ && eval(val.on_if) })
|
||||
|
||||
call s:source_events(a:event, plugins)
|
||||
endfunction
|
||||
function! dein#autoload#_on_event(event, plugins) abort
|
||||
let lazy_plugins = filter(dein#util#_get_plugins(a:plugins),
|
||||
\ '!v:val.sourced')
|
||||
\ { _, val -> !val.sourced })
|
||||
if empty(lazy_plugins)
|
||||
execute 'autocmd! dein-events' a:event
|
||||
return
|
||||
endif
|
||||
|
||||
let plugins = filter(copy(lazy_plugins),
|
||||
\ "!has_key(v:val, 'on_if') || eval(v:val.on_if)")
|
||||
\ { _, val -> !has_key(val, 'on_if') || eval(val.on_if) })
|
||||
call s:source_events(a:event, plugins)
|
||||
endfunction
|
||||
function! s:source_events(event, plugins) abort
|
||||
@ -148,8 +179,8 @@ function! dein#autoload#_on_func(name) abort
|
||||
endif
|
||||
|
||||
call dein#autoload#_source(filter(dein#util#_get_lazy_plugins(),
|
||||
\ "stridx(function_prefix, v:val.normalized_name.'#') == 0
|
||||
\ || (index(get(v:val, 'on_func', []), a:name) >= 0)"))
|
||||
\ { _, val -> stridx(function_prefix, val.normalized_name.'#') == 0
|
||||
\ || (index(get(val, 'on_func', []), a:name) >= 0) }))
|
||||
endfunction
|
||||
|
||||
function! dein#autoload#_on_lua(name) abort
|
||||
@ -164,17 +195,17 @@ function! dein#autoload#_on_lua(name) abort
|
||||
let g:dein#_called_lua[a:name] = v:true
|
||||
|
||||
call dein#autoload#_source(filter(dein#util#_get_lazy_plugins(),
|
||||
\ "index(get(v:val, 'on_lua', []), mod_root) >= 0"))
|
||||
\ { _, val -> index(get(val, 'on_lua', []), mod_root) >= 0 }))
|
||||
endfunction
|
||||
|
||||
function! dein#autoload#_on_pre_cmd(name) abort
|
||||
call dein#autoload#_source(
|
||||
\ filter(dein#util#_get_lazy_plugins(),
|
||||
\ "index(map(copy(get(v:val, 'on_cmd', [])),
|
||||
\ 'tolower(v:val)'), a:name) >= 0
|
||||
\ { _, val -> index(map(copy(get(val, 'on_cmd', [])),
|
||||
\ { _, val2 -> tolower(val2) }), a:name) >= 0
|
||||
\ || stridx(tolower(a:name),
|
||||
\ substitute(tolower(v:val.normalized_name),
|
||||
\ '[_-]', '', 'g')) == 0"))
|
||||
\ substitute(tolower(val.normalized_name),
|
||||
\ '[_-]', '', 'g')) == 0 }))
|
||||
endfunction
|
||||
|
||||
function! dein#autoload#_on_cmd(command, name, args, bang, line1, line2) abort
|
||||
@ -202,7 +233,11 @@ function! dein#autoload#_on_map(mapping, name, mode) abort
|
||||
|
||||
let input = s:get_input()
|
||||
|
||||
call dein#source(a:name)
|
||||
let sourced = dein#source(a:name)
|
||||
if empty(sourced)
|
||||
" Prevent infinite loop
|
||||
silent! execute a:mode.'unmap' a:mapping
|
||||
endif
|
||||
|
||||
if a:mode ==# 'v' || a:mode ==# 'x'
|
||||
call feedkeys('gv', 'n')
|
||||
@ -256,6 +291,7 @@ endfunction
|
||||
|
||||
function! s:source_plugin(rtps, index, plugin, sourced) abort
|
||||
if a:plugin.sourced || index(a:sourced, a:plugin) >= 0
|
||||
\ || (has_key(a:plugin, 'if') && !eval(a:plugin.if))
|
||||
return
|
||||
endif
|
||||
|
||||
@ -286,7 +322,7 @@ function! s:source_plugin(rtps, index, plugin, sourced) abort
|
||||
let a:plugin.sourced = 1
|
||||
|
||||
for on_source in filter(dein#util#_get_lazy_plugins(),
|
||||
\ "index(get(v:val, 'on_source', []), a:plugin.name) >= 0")
|
||||
\ { _, val -> index(get(val, 'on_source', []), a:plugin.name) >= 0 })
|
||||
if s:source_plugin(a:rtps, index, on_source, a:sourced)
|
||||
let index += 1
|
||||
endif
|
||||
@ -362,19 +398,25 @@ function! s:get_input() abort
|
||||
endfunction
|
||||
|
||||
function! s:is_reset_ftplugin(plugins) abort
|
||||
if &filetype ==# ''
|
||||
if &l:filetype ==# ''
|
||||
return 0
|
||||
endif
|
||||
|
||||
for plugin in a:plugins
|
||||
let ftplugin = plugin.rtp . '/ftplugin/' . &filetype
|
||||
let after = plugin.rtp . '/after/ftplugin/' . &filetype
|
||||
if !empty(filter(['ftplugin', 'indent',
|
||||
let ftplugin = plugin.rtp . '/ftplugin/' . &l:filetype
|
||||
let after = plugin.rtp . '/after/ftplugin/' . &l:filetype
|
||||
let check_ftplugin = !empty(filter(['ftplugin', 'indent',
|
||||
\ 'after/ftplugin', 'after/indent',],
|
||||
\ "filereadable(printf('%s/%s/%s.vim',
|
||||
\ plugin.rtp, v:val, &filetype))"))
|
||||
\ || isdirectory(ftplugin) || isdirectory(after)
|
||||
\ || glob(ftplugin. '_*.vim') !=# '' || glob(after . '_*.vim') !=# ''
|
||||
\ { _, val -> filereadable(printf('%s/%s/%s.vim',
|
||||
\ plugin.rtp, val, &l:filetype))
|
||||
\ || filereadable(printf('%s/%s/%s.lua',
|
||||
\ plugin.rtp, val, &l:filetype))}))
|
||||
if check_ftplugin
|
||||
\ || isdirectory(ftplugin) || isdirectory(after)
|
||||
\ || glob(ftplugin. '_*.vim', v:true) !=# ''
|
||||
\ || glob(after . '_*.vim', v:true) !=# ''
|
||||
\ || glob(ftplugin. '_*.lua', v:true) !=# ''
|
||||
\ || glob(after . '_*.lua', v:true) !=# ''
|
||||
return 1
|
||||
endif
|
||||
endfor
|
||||
|
@ -12,7 +12,8 @@ let s:progress = ''
|
||||
|
||||
" Global options definition.
|
||||
let g:dein#install_max_processes =
|
||||
\ get(g:, 'dein#install_max_processes', 8)
|
||||
\ get(g:, 'dein#install_max_processes',
|
||||
\ dein#util#_is_windows() ? 16 : 8)
|
||||
let g:dein#install_progress_type =
|
||||
\ get(g:, 'dein#install_progress_type', 'echo')
|
||||
let g:dein#install_message_type =
|
||||
@ -25,6 +26,8 @@ let g:dein#install_github_api_token =
|
||||
\ get(g:, 'dein#install_github_api_token', '')
|
||||
let g:dein#install_curl_command =
|
||||
\ get(g:, 'dein#install_curl_command', 'curl')
|
||||
let g:dein#install_check_diff =
|
||||
\ get(g:, 'dein#install_check_diff', v:false)
|
||||
|
||||
function! s:get_job() abort
|
||||
if !exists('s:Job')
|
||||
@ -42,7 +45,7 @@ function! dein#install#_update(plugins, update_type, async) abort
|
||||
let plugins = dein#util#_get_plugins(a:plugins)
|
||||
|
||||
if a:update_type ==# 'install'
|
||||
let plugins = filter(plugins, '!isdirectory(v:val.path)')
|
||||
let plugins = filter(plugins, { _, val -> !isdirectory(val.path) })
|
||||
endif
|
||||
|
||||
if a:async && !empty(s:global_context) &&
|
||||
@ -112,10 +115,6 @@ function! dein#install#_check_update(plugins, force, async) abort
|
||||
call s:error('curl must be executable for the feature.')
|
||||
return
|
||||
endif
|
||||
if !exists('*strptime') && !has('python3')
|
||||
call s:error('+python3 is required for the feature.')
|
||||
return
|
||||
endif
|
||||
|
||||
let s:global_context.progress_type = 'echo'
|
||||
|
||||
@ -158,6 +157,7 @@ function! dein#install#_check_update(plugins, force, async) abort
|
||||
else
|
||||
let candidates[-1] .= a:data[0]
|
||||
endif
|
||||
|
||||
let candidates += a:data[1:]
|
||||
endfunction
|
||||
let process.job = s:get_job().start(
|
||||
@ -177,7 +177,8 @@ function! dein#install#_check_update(plugins, force, async) abort
|
||||
try
|
||||
let json = json_decode(result)
|
||||
let results += filter(values(json['data']),
|
||||
\ "type(v:val) == v:t_dict && has_key(v:val, 'pushedAt')")
|
||||
\ { _, val -> type(val) == v:t_dict
|
||||
\ && has_key(val, 'pushedAt') })
|
||||
catch
|
||||
call s:error('json output decode error: ' + string(result))
|
||||
endtry
|
||||
@ -193,15 +194,13 @@ function! dein#install#_check_update(plugins, force, async) abort
|
||||
let check_pushed[node['nameWithOwner']] =
|
||||
\ exists('*strptime') ?
|
||||
\ strptime(format, pushed_at) :
|
||||
\ has('nvim') ?
|
||||
\ msgpack#strptime(format, pushed_at) :
|
||||
\ s:strptime_py(format, pushed_at)
|
||||
\ dein#DateTime#from_format(pushed_at, format).unix_time()
|
||||
endfor
|
||||
|
||||
" Get the last updated time by rollbackfile timestamp.
|
||||
" Note: .git timestamp may be changed by git commands.
|
||||
let rollbacks = reverse(sort(dein#util#_globlist(
|
||||
\ s:get_rollback_directory() . '/*')))
|
||||
let rollbacks = reverse(sort(glob(
|
||||
\ s:get_rollback_directory() . '/*', v:true, v:true)))
|
||||
let rollback_time = empty(rollbacks) ? -1 : getftime(rollbacks[0])
|
||||
|
||||
" Compare with .git directory updated time.
|
||||
@ -225,12 +224,13 @@ function! dein#install#_check_update(plugins, force, async) abort
|
||||
let s:global_context = {}
|
||||
|
||||
if empty(updated)
|
||||
call dein#util#_notify(strftime('Done: (%Y/%m/%d %H:%M:%S)'))
|
||||
call s:notify(strftime('Done: (%Y/%m/%d %H:%M:%S)'))
|
||||
return
|
||||
endif
|
||||
|
||||
call dein#util#_notify('Updated plugins: ' .
|
||||
\ string(map(copy(updated), 'v:val.name')))
|
||||
" Note: Use echo to display it in confirm
|
||||
call s:echo('Updated plugins: ' .
|
||||
\ string(map(copy(updated), { _, val -> val.name })), 'echo')
|
||||
if !a:force && confirm(
|
||||
\ 'Updated plugins are exists. Update now?', "yes\nNo", 2) != 1
|
||||
return
|
||||
@ -240,6 +240,11 @@ function! dein#install#_check_update(plugins, force, async) abort
|
||||
endfunction
|
||||
|
||||
function! dein#install#_reinstall(plugins) abort
|
||||
if g:dein#_is_sudo
|
||||
call s:error('update/install is disabled in sudo session.')
|
||||
return
|
||||
endif
|
||||
|
||||
let plugins = dein#util#_get_plugins(a:plugins)
|
||||
|
||||
for plugin in plugins
|
||||
@ -265,6 +270,11 @@ function! dein#install#_reinstall(plugins) abort
|
||||
\ 'install', 0)
|
||||
endfunction
|
||||
function! dein#install#_direct_install(repo, options) abort
|
||||
if g:dein#_is_sudo
|
||||
call s:error('update/install is disabled in sudo session.')
|
||||
return
|
||||
endif
|
||||
|
||||
let options = copy(a:options)
|
||||
let options.merged = 0
|
||||
|
||||
@ -281,14 +291,19 @@ function! dein#install#_direct_install(repo, options) abort
|
||||
let line = printf('call dein#add(%s, %s)',
|
||||
\ string(a:repo), string(options))
|
||||
if !filereadable(file)
|
||||
call writefile([line], file)
|
||||
call dein#util#_safe_writefile([line], file)
|
||||
else
|
||||
call writefile(add(readfile(file), line), file)
|
||||
call dein#util#_safe_writefile(add(readfile(file), line), file)
|
||||
endif
|
||||
endfunction
|
||||
function! dein#install#_rollback(date, plugins) abort
|
||||
if g:dein#_is_sudo
|
||||
call s:error('update/install is disabled in sudo session.')
|
||||
return
|
||||
endif
|
||||
|
||||
let glob = s:get_rollback_directory() . '/' . a:date . '*'
|
||||
let rollbacks = reverse(sort(dein#util#_globlist(glob)))
|
||||
let rollbacks = reverse(sort(glob(glob, v:true, v:true)))
|
||||
if empty(rollbacks)
|
||||
return
|
||||
endif
|
||||
@ -301,45 +316,54 @@ function! dein#install#_recache_runtimepath() abort
|
||||
return
|
||||
endif
|
||||
|
||||
let start = reltime()
|
||||
|
||||
" Clear runtime path.
|
||||
call s:clear_runtimepath()
|
||||
|
||||
let plugins = values(dein#get())
|
||||
|
||||
let merged_plugins = filter(copy(plugins), 'v:val.merged')
|
||||
let merged_plugins = filter(copy(plugins), { _, val -> val.merged })
|
||||
let lazy_merged_plugins = filter(copy(merged_plugins),
|
||||
\ { _, val -> val.lazy })
|
||||
let nolazy_merged_plugins = filter(copy(merged_plugins),
|
||||
\ { _, val -> !val.lazy })
|
||||
let merge_ftdetect_plugins = filter(copy(plugins),
|
||||
\ { _, val -> get(val, 'merge_ftdetect', 0)
|
||||
\ || (val.merged && !val.lazy) })
|
||||
|
||||
call s:copy_files(lazy_merged_plugins, '')
|
||||
|
||||
let runtime = dein#util#_get_runtime_path()
|
||||
|
||||
call s:copy_files(filter(copy(merged_plugins), 'v:val.lazy'), '')
|
||||
" Remove plugin directory
|
||||
call dein#install#_rm(dein#util#_get_runtime_path() . '/plugin')
|
||||
call dein#install#_rm(dein#util#_get_runtime_path() . '/after/plugin')
|
||||
call dein#install#_rm(runtime . '/plugin')
|
||||
call dein#install#_rm(runtime . '/after/plugin')
|
||||
|
||||
call s:copy_files(filter(copy(merged_plugins), '!v:val.lazy'), '')
|
||||
call s:copy_files(nolazy_merged_plugins, '')
|
||||
|
||||
call s:helptags()
|
||||
|
||||
call s:generate_ftplugin()
|
||||
|
||||
" Clear ftdetect and after/ftdetect directories.
|
||||
call dein#install#_rm(
|
||||
\ dein#util#_get_runtime_path().'/ftdetect')
|
||||
call dein#install#_rm(
|
||||
\ dein#util#_get_runtime_path().'/after/ftdetect')
|
||||
call dein#install#_rm(runtime . '/ftdetect')
|
||||
call dein#install#_rm(runtime . '/after/ftdetect')
|
||||
|
||||
call s:merge_files(plugins, 'ftdetect')
|
||||
call s:merge_files(plugins, 'after/ftdetect')
|
||||
call s:merge_files(merge_ftdetect_plugins, 'ftdetect')
|
||||
call s:merge_files(merge_ftdetect_plugins, 'after/ftdetect')
|
||||
|
||||
silent call dein#remote_plugins()
|
||||
|
||||
call dein#call_hook('post_source')
|
||||
|
||||
call dein#util#_save_merged_plugins()
|
||||
|
||||
call dein#install#_save_rollback(
|
||||
\ s:get_rollback_directory() . '/' . strftime('%Y%m%d%H%M%S'), [])
|
||||
|
||||
call dein#clear_state()
|
||||
call dein#util#_clear_state()
|
||||
|
||||
call s:log(strftime('Runtimepath updated: (%Y/%m/%d %H:%M:%S)'))
|
||||
call s:log('recache_runtimepath: ' . split(reltimestr(reltime(start)))[0])
|
||||
endfunction
|
||||
function! s:clear_runtimepath() abort
|
||||
if dein#util#_get_cache_path() ==# ''
|
||||
@ -354,21 +378,19 @@ function! s:clear_runtimepath() abort
|
||||
|
||||
if !isdirectory(runtimepath)
|
||||
" Create runtime path
|
||||
call mkdir(runtimepath, 'p')
|
||||
call dein#util#_safe_mkdir(runtimepath)
|
||||
endif
|
||||
endfunction
|
||||
function! s:helptags() abort
|
||||
if g:dein#_runtime_path ==# '' || g:dein#_is_sudo
|
||||
if g:dein#_runtime_path ==# ''
|
||||
return ''
|
||||
endif
|
||||
|
||||
try
|
||||
let tags = dein#util#_get_runtime_path() . '/doc'
|
||||
if !isdirectory(tags)
|
||||
call mkdir(tags, 'p')
|
||||
endif
|
||||
call s:copy_files(filter(
|
||||
\ values(dein#get()), '!v:val.merged'), 'doc')
|
||||
call dein#util#_safe_mkdir(tags)
|
||||
call s:copy_files(filter(values(dein#get()),
|
||||
\ { _, val -> !val.merged }), 'doc')
|
||||
silent execute 'helptags' fnameescape(tags)
|
||||
catch /^Vim(helptags):E151:/
|
||||
" Ignore an error that occurs when there is no help file
|
||||
@ -380,8 +402,8 @@ function! s:helptags() abort
|
||||
endfunction
|
||||
function! s:copy_files(plugins, directory) abort
|
||||
let directory = (a:directory ==# '' ? '' : '/' . a:directory)
|
||||
let srcs = filter(map(copy(a:plugins), 'v:val.rtp . directory'),
|
||||
\ 'isdirectory(v:val)')
|
||||
let srcs = filter(map(copy(a:plugins), { _, val -> val.rtp . directory }),
|
||||
\ { _, val -> isdirectory(val) })
|
||||
let stride = 50
|
||||
for start in range(0, len(srcs), stride)
|
||||
call dein#install#_copy_directories(srcs[start : start + stride-1],
|
||||
@ -391,42 +413,41 @@ endfunction
|
||||
function! s:merge_files(plugins, directory) abort
|
||||
let files = []
|
||||
for plugin in a:plugins
|
||||
for file in filter(split(globpath(
|
||||
\ plugin.rtp, a:directory.'/**', 1), '\n'),
|
||||
\ '!isdirectory(v:val)')
|
||||
for file in filter(globpath(
|
||||
\ plugin.rtp, a:directory.'/**', v:true, v:true),
|
||||
\ { _, val -> !isdirectory(val) })
|
||||
let files += readfile(file, ':t')
|
||||
endfor
|
||||
endfor
|
||||
|
||||
if !empty(files)
|
||||
call dein#util#_writefile(printf('.dein/%s/%s.vim',
|
||||
\ a:directory, a:directory), files)
|
||||
call dein#util#_cache_writefile(files,
|
||||
\ printf('.dein/%s/%s.vim', a:directory, a:directory))
|
||||
endif
|
||||
endfunction
|
||||
function! s:list_directory(directory) abort
|
||||
return dein#util#_globlist(a:directory . '/*')
|
||||
endfunction
|
||||
function! dein#install#_save_rollback(rollbackfile, plugins) abort
|
||||
let revisions = {}
|
||||
for plugin in filter(dein#util#_get_plugins(a:plugins),
|
||||
\ 's:check_rollback(v:val)')
|
||||
\ { _, val -> s:check_rollback(val) })
|
||||
let rev = s:get_revision_number(plugin)
|
||||
if rev !=# ''
|
||||
let revisions[plugin.name] = rev
|
||||
endif
|
||||
endfor
|
||||
|
||||
call writefile([json_encode(revisions)], expand(a:rollbackfile))
|
||||
call dein#util#_safe_writefile(
|
||||
\ [json_encode(revisions)], expand(a:rollbackfile))
|
||||
endfunction
|
||||
function! dein#install#_load_rollback(rollbackfile, plugins) abort
|
||||
let revisions = json_decode(readfile(a:rollbackfile)[0])
|
||||
|
||||
let plugins = dein#util#_get_plugins(a:plugins)
|
||||
call filter(plugins, "has_key(revisions, v:val.name)
|
||||
\ && has_key(dein#util#_get_type(v:val.type),
|
||||
call filter(plugins, { _, val -> has_key(revisions, val.name)
|
||||
\ && has_key(dein#util#_get_type(val.type),
|
||||
\ 'get_rollback_command')
|
||||
\ && s:check_rollback(v:val)
|
||||
\ && s:get_revision_number(v:val) !=# revisions[v:val.name]")
|
||||
\ && s:check_rollback(val)
|
||||
\ && s:get_revision_number(val) !=# revisions[val.name]
|
||||
\ })
|
||||
if empty(plugins)
|
||||
return
|
||||
endif
|
||||
@ -444,9 +465,7 @@ endfunction
|
||||
function! s:get_rollback_directory() abort
|
||||
let parent = printf('%s/rollbacks/%s',
|
||||
\ dein#util#_get_cache_path(), g:dein#_progname)
|
||||
if !isdirectory(parent)
|
||||
call mkdir(parent, 'p')
|
||||
endif
|
||||
call dein#util#_safe_mkdir(parent)
|
||||
|
||||
return parent
|
||||
endfunction
|
||||
@ -480,6 +499,11 @@ function! dein#install#_get_default_ftplugin() abort
|
||||
\ ' execute "runtime! ftplugin/" . ft . ".vim"',
|
||||
\ ' \ "ftplugin/" . ft . "_*.vim"',
|
||||
\ ' \ "ftplugin/" . ft . "/*.vim"',
|
||||
\ ' if has("nvim")',
|
||||
\ ' execute "runtime! ftplugin/" . ft . ".lua"',
|
||||
\ ' \ "ftplugin/" . ft . "_*.lua"',
|
||||
\ ' \ "ftplugin/" . ft . "/*.lua"',
|
||||
\ ' endif',
|
||||
\ ' endfor',
|
||||
\ ' endif',
|
||||
\ ' call s:after_ftplugin()',
|
||||
@ -488,11 +512,13 @@ function! dein#install#_get_default_ftplugin() abort
|
||||
\]
|
||||
endfunction
|
||||
function! s:generate_ftplugin() abort
|
||||
if empty(g:dein#_ftplugin)
|
||||
return
|
||||
endif
|
||||
|
||||
" Create after/ftplugin
|
||||
let after = dein#util#_get_runtime_path() . '/after/ftplugin'
|
||||
if !isdirectory(after)
|
||||
call mkdir(after, 'p')
|
||||
endif
|
||||
call dein#util#_safe_mkdir(after)
|
||||
|
||||
" Merge g:dein#_ftplugin
|
||||
let ftplugin = {}
|
||||
@ -512,14 +538,17 @@ function! s:generate_ftplugin() abort
|
||||
endfor
|
||||
|
||||
" Generate ftplugin.vim
|
||||
call writefile(dein#install#_get_default_ftplugin() + [
|
||||
call dein#util#_safe_writefile(
|
||||
\ dein#install#_get_default_ftplugin() + [
|
||||
\ 'function! s:after_ftplugin()',
|
||||
\ ] + get(ftplugin, '_', []) + ['endfunction'],
|
||||
\ dein#util#_get_runtime_path() . '/ftplugin.vim')
|
||||
|
||||
" Generate after/ftplugin
|
||||
for [filetype, list] in filter(items(ftplugin), "v:val[0] !=# '_'")
|
||||
call writefile(list, printf('%s/%s.vim', after, filetype))
|
||||
for [filetype, list] in filter(items(ftplugin),
|
||||
\ { _, val -> val[0] !=# '_' })
|
||||
call dein#util#_safe_writefile(
|
||||
\ list, printf('%s/%s.vim', after, filetype))
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
@ -542,7 +571,7 @@ function! dein#install#_polling() abort
|
||||
endfunction
|
||||
|
||||
function! dein#install#_remote_plugins() abort
|
||||
if !has('nvim')
|
||||
if !has('nvim') || g:dein#_is_sudo
|
||||
return
|
||||
endif
|
||||
|
||||
@ -558,12 +587,12 @@ function! dein#install#_remote_plugins() abort
|
||||
|
||||
" Load not loaded neovim remote plugins
|
||||
let remote_plugins = filter(values(dein#get()),
|
||||
\ "isdirectory(v:val.rtp . '/rplugin') && !v:val.sourced")
|
||||
\ { _, val -> isdirectory(val.rtp . '/rplugin') && !val.sourced })
|
||||
|
||||
call dein#autoload#_source(remote_plugins)
|
||||
|
||||
call s:log('loaded remote plugins: ' .
|
||||
\ string(map(copy(remote_plugins), 'v:val.name')))
|
||||
\ string(map(copy(remote_plugins), { _, val -> val.name })))
|
||||
|
||||
let &runtimepath = dein#util#_join_rtp(dein#util#_uniq(
|
||||
\ dein#util#_split_rtp(&runtimepath)), &runtimepath, '')
|
||||
@ -574,7 +603,7 @@ endfunction
|
||||
|
||||
function! dein#install#_each(cmd, plugins) abort
|
||||
let plugins = filter(dein#util#_get_plugins(a:plugins),
|
||||
\ 'isdirectory(v:val.path)')
|
||||
\ { _, val -> isdirectory(val.path) })
|
||||
|
||||
let global_context_save = s:global_context
|
||||
|
||||
@ -604,7 +633,7 @@ endfunction
|
||||
function! dein#install#_build(plugins) abort
|
||||
let error = 0
|
||||
for plugin in filter(dein#util#_get_plugins(a:plugins),
|
||||
\ "isdirectory(v:val.path) && has_key(v:val, 'build')")
|
||||
\ { _, val -> isdirectory(val.path) && has_key(val, 'build') })
|
||||
call s:print_progress_message('Building: ' . plugin.name)
|
||||
if dein#install#_each(plugin.build, plugin)
|
||||
let error = 1
|
||||
@ -741,19 +770,24 @@ function! s:get_updated_message(context, plugins) abort
|
||||
return ''
|
||||
endif
|
||||
|
||||
" Diff check
|
||||
if g:dein#install_check_diff
|
||||
call s:check_diff(a:plugins)
|
||||
endif
|
||||
|
||||
return "Updated plugins:\n".
|
||||
\ join(map(copy(a:plugins),
|
||||
\ "' ' . v:val.name . (v:val.commit_count == 0 ? ''
|
||||
\ { _, val -> ' ' . val.name . (val.commit_count == 0 ? ''
|
||||
\ : printf('(%d change%s)',
|
||||
\ v:val.commit_count,
|
||||
\ (v:val.commit_count == 1 ? '' : 's')))
|
||||
\ . ((v:val.old_rev !=# ''
|
||||
\ && v:val.uri =~# '^\\h\\w*://github.com/') ? \"\\n\"
|
||||
\ val.commit_count,
|
||||
\ (val.commit_count == 1 ? '' : 's')))
|
||||
\ . ((val.old_rev !=# ''
|
||||
\ && val.uri =~# '^\h\w*://github.com/') ? "\n"
|
||||
\ . printf(' %s/compare/%s...%s',
|
||||
\ substitute(substitute(v:val.uri, '\\.git$', '', ''),
|
||||
\ '^\\h\\w*:', 'https:', ''),
|
||||
\ v:val.old_rev, v:val.new_rev) : '')")
|
||||
\ , "\n")
|
||||
\ substitute(substitute(val.uri, '\.git$', '', ''),
|
||||
\ '^\h\w*:', 'https:', ''),
|
||||
\ val.old_rev, val.new_rev) : '')
|
||||
\ }) , "\n")
|
||||
endfunction
|
||||
function! s:get_errored_message(plugins) abort
|
||||
if empty(a:plugins)
|
||||
@ -761,12 +795,28 @@ function! s:get_errored_message(plugins) abort
|
||||
endif
|
||||
|
||||
let msg = "Error installing plugins:\n".join(
|
||||
\ map(copy(a:plugins), "' ' . v:val.name"), "\n")
|
||||
\ map(copy(a:plugins), { _, val -> ' ' . val.name }), "\n")
|
||||
let msg .= "\n"
|
||||
let msg .= "Please read the error message log with the :message command.\n"
|
||||
|
||||
return msg
|
||||
endfunction
|
||||
function! s:check_diff(plugins) abort
|
||||
for plugin in a:plugins
|
||||
let type = dein#util#_get_type(plugin.type)
|
||||
if !has_key(type, 'get_diff_command') || plugin.old_rev ==# ''
|
||||
continue
|
||||
endif
|
||||
|
||||
let diff = s:system_cd(
|
||||
\ type.get_diff_command(plugin, plugin.old_rev, plugin.new_rev),
|
||||
\ plugin.path)
|
||||
if diff !=# ''
|
||||
echo printf("%s: The documentation is updated\n%s\n\n",
|
||||
\ plugin.name, diff)
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
|
||||
" Helper functions
|
||||
@ -784,24 +834,33 @@ function! dein#install#_cd(path) abort
|
||||
call s:error(v:throwpoint)
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
function! dein#install#_system(command) abort
|
||||
" Todo: use job API instead for Vim8/neovim only
|
||||
" let job = s:Job.start()
|
||||
" let exitval = job.wait()
|
||||
|
||||
if !has('nvim') && type(a:command) == v:t_list
|
||||
" system() does not support List arguments in Vim.
|
||||
let command = s:args2string(a:command)
|
||||
return s:job_system.system(a:command)
|
||||
endfunction
|
||||
let s:job_system = {}
|
||||
function! s:job_system.on_out(data) abort
|
||||
let candidates = s:job_system.candidates
|
||||
if empty(candidates)
|
||||
call add(candidates, a:data[0])
|
||||
else
|
||||
let command = a:command
|
||||
let candidates[-1] .= a:data[0]
|
||||
endif
|
||||
let candidates += a:data[1:]
|
||||
endfunction
|
||||
function! s:job_system.system(cmd) abort
|
||||
let self.candidates = []
|
||||
|
||||
let command = s:iconv(command, &encoding, 'char')
|
||||
let output = s:iconv(system(command), 'char', &encoding)
|
||||
return substitute(output, '\n$', '', '')
|
||||
let job = s:get_job().start(
|
||||
\ s:convert_args(a:cmd),
|
||||
\ {'on_stdout': self.on_out})
|
||||
|
||||
let s:job_system.status = job.wait(
|
||||
\ g:dein#install_process_timeout * 1000)
|
||||
return join(s:job_system.candidates, "\n")
|
||||
endfunction
|
||||
function! dein#install#_status() abort
|
||||
return v:shell_error
|
||||
return s:job_system.status
|
||||
endfunction
|
||||
function! s:system_cd(command, path) abort
|
||||
let cwd = getcwd()
|
||||
@ -841,43 +900,29 @@ function! s:job_execute.execute(cmd) abort
|
||||
return job.wait(g:dein#install_process_timeout * 1000)
|
||||
endfunction
|
||||
|
||||
function! dein#install#_system_bg(command) abort
|
||||
let job = s:get_job().start(
|
||||
\ s:convert_args(a:command),
|
||||
\ {
|
||||
\ 'on_stderr': {
|
||||
\ v -> map(copy(v), { _, val -> dein#util#_error(val) })
|
||||
\ }
|
||||
\ })
|
||||
return job
|
||||
endfunction
|
||||
|
||||
function! dein#install#_rm(path) abort
|
||||
if !isdirectory(a:path) && !filereadable(a:path)
|
||||
return
|
||||
endif
|
||||
|
||||
" Note: delete rf is broken before Vim 8.1.1378
|
||||
if has('patch-8.1.1378')
|
||||
try
|
||||
call delete(a:path, 'rf')
|
||||
catch
|
||||
call s:error('Error deleting directory: ' . a:path)
|
||||
call s:error(v:exception)
|
||||
call s:error(v:throwpoint)
|
||||
endtry
|
||||
return
|
||||
endif
|
||||
|
||||
" Note: In Windows, ['rmdir', '/S', '/Q'] does not work.
|
||||
" After Vim 8.0.928, double quote escape does not work in job. Too bad.
|
||||
let cmdline = ' "' . a:path . '"'
|
||||
if dein#util#_is_windows()
|
||||
" Note: In rm command, must use "\" instead of "/".
|
||||
let cmdline = substitute(cmdline, '/', '\\\\', 'g')
|
||||
endif
|
||||
|
||||
let rm_command = dein#util#_is_windows() ? 'cmd /C rmdir /S /Q' : 'rm -rf'
|
||||
let cmdline = rm_command . cmdline
|
||||
let result = system(cmdline)
|
||||
if v:shell_error
|
||||
call dein#util#_error(result)
|
||||
endif
|
||||
|
||||
" Error check.
|
||||
if getftype(a:path) !=# ''
|
||||
call dein#util#_error(printf('"%s" cannot be removed.', a:path))
|
||||
call dein#util#_error(printf('cmdline is "%s".', cmdline))
|
||||
endif
|
||||
try
|
||||
call delete(a:path, 'rf')
|
||||
catch
|
||||
call s:error('Error deleting directory: ' . a:path)
|
||||
call s:error(v:exception)
|
||||
call s:error(v:throwpoint)
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
function! dein#install#_copy_directories(srcs, dest) abort
|
||||
@ -885,6 +930,13 @@ function! dein#install#_copy_directories(srcs, dest) abort
|
||||
return 0
|
||||
endif
|
||||
|
||||
if dein#util#_is_windows() && has('python3')
|
||||
\ && dein#install#_python_version_check()
|
||||
" In Windows, copy directory is too slow!
|
||||
" Note: Python 3.8.0 is needed
|
||||
return dein#install#_copy_directories_py(a:srcs, a:dest)
|
||||
endif
|
||||
|
||||
let status = 0
|
||||
if dein#util#_is_windows()
|
||||
if !executable('robocopy')
|
||||
@ -892,36 +944,11 @@ function! dein#install#_copy_directories(srcs, dest) abort
|
||||
return 1
|
||||
endif
|
||||
|
||||
let temp = tempname() . '.bat'
|
||||
let exclude = tempname()
|
||||
|
||||
try
|
||||
let lines = ['@echo off']
|
||||
let format ='robocopy.exe %s /E /NJH /NJS /NDL /NC /NS /MT /XO /XD ".git"'
|
||||
for src in a:srcs
|
||||
call add(lines, printf(format,
|
||||
\ substitute(printf('"%s" "%s"', src, a:dest),
|
||||
\ '/', '\\', 'g')))
|
||||
endfor
|
||||
call writefile(lines, temp)
|
||||
let result = dein#install#_system(temp)
|
||||
finally
|
||||
call delete(temp)
|
||||
endtry
|
||||
|
||||
" Robocopy returns between 0 and 7 upon success
|
||||
let status = dein#install#_status()
|
||||
let status = (status > 7) ? status : 0
|
||||
|
||||
if status
|
||||
call dein#util#_error('copy command failed.')
|
||||
call dein#util#_error(s:iconv(result, 'char', &encoding))
|
||||
call dein#util#_error('cmdline: ' . temp)
|
||||
call dein#util#_error('tempfile: ' . string(lines))
|
||||
endif
|
||||
let status = dein#install#_copy_directories_robocopy(a:srcs, a:dest)
|
||||
else " Not Windows
|
||||
let srcs = map(filter(copy(a:srcs),
|
||||
\ 'len(s:list_directory(v:val))'), 'shellescape(v:val . ''/'')')
|
||||
\ { _, val -> len(glob(val . '/*', v:true, v:true)) }),
|
||||
\ { _, val -> shellescape(val . '/') })
|
||||
let is_rsync = executable('rsync')
|
||||
if is_rsync
|
||||
let cmdline = printf("rsync -a -q --exclude '/.git/' %s %s",
|
||||
@ -947,6 +974,80 @@ function! dein#install#_copy_directories(srcs, dest) abort
|
||||
|
||||
return status
|
||||
endfunction
|
||||
function! dein#install#_copy_directories_robocopy(srcs, dest) abort
|
||||
let jobs = []
|
||||
let format = 'robocopy.exe %s /E /NJH /NJS '
|
||||
\ . '/NDL /NC /NS /MT:8 /XO /XD ".git"'
|
||||
let srcs = a:srcs
|
||||
let MAX_LINES = 8
|
||||
while !empty(srcs)
|
||||
let temp = tempname() . '.bat'
|
||||
let lines = ['@echo off']
|
||||
|
||||
while len(lines) < MAX_LINES && !empty(srcs)
|
||||
let path = substitute(printf('"%s" "%s"', srcs[0], a:dest),
|
||||
\ '/', '\\', 'g')
|
||||
call add(lines, printf(format, path))
|
||||
|
||||
let srcs = srcs[1:]
|
||||
endwhile
|
||||
|
||||
call dein#util#_safe_writefile(lines, temp)
|
||||
|
||||
let job = dein#install#_system_bg(temp)
|
||||
call add(jobs, { 'commands': lines, 'job': job })
|
||||
endwhile
|
||||
|
||||
" Async check
|
||||
let ret = 0
|
||||
while !empty(jobs)
|
||||
let i = 0
|
||||
for job in jobs
|
||||
let status = job.job.wait(100)
|
||||
if status == -1
|
||||
" Next check
|
||||
let i += 1
|
||||
continue
|
||||
endif
|
||||
|
||||
" Robocopy returns between 0 and 7 upon success
|
||||
let status = (status > 7) ? status : 0
|
||||
|
||||
if status
|
||||
call dein#util#_error('copy command failed.')
|
||||
call dein#util#_error('cmdline: ' . string(job.commands))
|
||||
let ret = 1
|
||||
endif
|
||||
|
||||
call remove(jobs, i)
|
||||
|
||||
break
|
||||
endfor
|
||||
endwhile
|
||||
|
||||
return ret
|
||||
endfunction
|
||||
function! dein#install#_copy_directories_py(srcs, dest) abort
|
||||
py3 << EOF
|
||||
import shutil
|
||||
import vim
|
||||
for src in vim.eval('a:srcs'):
|
||||
shutil.copytree(src, vim.eval('a:dest'),
|
||||
dirs_exist_ok=True,
|
||||
ignore=shutil.ignore_patterns('.git'))
|
||||
EOF
|
||||
endfunction
|
||||
function! dein#install#_python_version_check() abort
|
||||
python3 << EOF
|
||||
import vim
|
||||
import sys
|
||||
vim.vars['dein#_python_version_check'] = (
|
||||
sys.version_info.major,
|
||||
sys.version_info.minor,
|
||||
sys.version_info.micro) >= (3, 8, 0)
|
||||
EOF
|
||||
return get(g:, 'dein#_python_version_check', 0)
|
||||
endfunction
|
||||
|
||||
function! s:install_blocking(context) abort
|
||||
try
|
||||
@ -962,7 +1063,6 @@ function! s:install_blocking(context) abort
|
||||
call s:done(a:context)
|
||||
endtry
|
||||
|
||||
|
||||
return len(a:context.errored_plugins)
|
||||
endfunction
|
||||
function! s:install_async(context) abort
|
||||
@ -1005,7 +1105,7 @@ function! s:check_loop(context) abort
|
||||
endfor
|
||||
|
||||
" Filter eof processes.
|
||||
call filter(a:context.processes, '!v:val.eof')
|
||||
call filter(a:context.processes, { _, val -> !val.eof })
|
||||
endfunction
|
||||
function! s:restore_view(context) abort
|
||||
if a:context.progress_type ==# 'tabline'
|
||||
@ -1067,15 +1167,35 @@ function! s:done(context) abort
|
||||
call s:notify(s:get_errored_message(a:context.errored_plugins))
|
||||
endif
|
||||
|
||||
call dein#install#_recache_runtimepath()
|
||||
|
||||
if !empty(a:context.synced_plugins)
|
||||
call dein#call_hook('done_update', a:context.synced_plugins)
|
||||
call dein#source(map(copy(a:context.synced_plugins), 'v:val.name'))
|
||||
call dein#install#_recache_runtimepath()
|
||||
|
||||
call dein#source(map(copy(a:context.synced_plugins),
|
||||
\ { _, val -> val.name }))
|
||||
|
||||
" Execute done_update hooks
|
||||
let done_update_plugins = filter(copy(a:context.synced_plugins),
|
||||
\ { _, val -> has_key(val, 'hook_done_update') })
|
||||
if !empty(done_update_plugins)
|
||||
if has('vim_starting')
|
||||
let s:done_updated_plugins = done_update_plugins
|
||||
autocmd dein VimEnter * call s:call_done_update_hooks(
|
||||
\ s:done_updated_plugins)
|
||||
else
|
||||
" Reload plugins to execute hooks
|
||||
runtime! plugin/**/*.vim
|
||||
|
||||
if has('nvim')
|
||||
" Neovim loads lua files at startup
|
||||
runtime! plugin/**/*.lua
|
||||
endif
|
||||
|
||||
call s:call_done_update_hooks(done_update_plugins)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
redraw
|
||||
echo ''
|
||||
redraw | echo ''
|
||||
|
||||
call s:notify(strftime('Done: (%Y/%m/%d %H:%M:%S)'))
|
||||
|
||||
@ -1090,6 +1210,17 @@ function! s:done(context) abort
|
||||
unlet s:timer
|
||||
endif
|
||||
endfunction
|
||||
function! s:call_done_update_hooks(plugins) abort
|
||||
let cwd = getcwd()
|
||||
try
|
||||
for plugin in a:plugins
|
||||
call dein#install#_cd(plugin.path)
|
||||
call dein#call_hook('done_update', plugin)
|
||||
endfor
|
||||
finally
|
||||
call dein#install#_cd(cwd)
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
function! s:sync(plugin, context) abort
|
||||
let a:context.number += 1
|
||||
@ -1204,6 +1335,8 @@ function! s:init_job(process, context, cmd) abort
|
||||
let candidates[-1] .= a:data[0]
|
||||
endif
|
||||
|
||||
call s:print_progress_message(candidates[-1])
|
||||
|
||||
let candidates += a:data[1:]
|
||||
endfunction
|
||||
|
||||
@ -1221,12 +1354,9 @@ function! s:init_job(process, context, cmd) abort
|
||||
|
||||
let candidates = get(a:process.job, 'candidates', [])
|
||||
let output = join((self.eof ? candidates : candidates[: -2]), "\n")
|
||||
if output !=# ''
|
||||
if output !=# '' && a:process.output !=# output
|
||||
let a:process.output = output
|
||||
let a:process.start_time = localtime()
|
||||
call s:log(s:get_short_message(
|
||||
\ a:process.plugin, a:process.number,
|
||||
\ a:process.max_plugins, output))
|
||||
endif
|
||||
let self.candidates = self.eof ? [] : candidates[-1:]
|
||||
|
||||
@ -1311,24 +1441,22 @@ function! s:check_output(context, process) abort
|
||||
\ plugin, new_rev, a:process.rev), '\n')
|
||||
let plugin.commit_count = len(log_messages)
|
||||
call s:log(map(log_messages,
|
||||
\ 's:get_short_message(plugin, num, max, v:val)'))
|
||||
\ { _, val -> s:get_short_message(plugin, num, max, val) }))
|
||||
|
||||
let plugin.old_rev = a:process.rev
|
||||
let plugin.new_rev = new_rev
|
||||
|
||||
" Execute "post_update" before "build"
|
||||
if has_key(plugin, 'hook_post_update')
|
||||
" To load plugin is needed to execute "post_update"
|
||||
call dein#source(plugin.name)
|
||||
call dein#call_hook('post_update', plugin)
|
||||
endif
|
||||
|
||||
let type = dein#util#_get_type(plugin.type)
|
||||
let plugin.uri = has_key(type, 'get_uri') ?
|
||||
\ type.get_uri(plugin.repo, plugin) : ''
|
||||
|
||||
let cwd = getcwd()
|
||||
try
|
||||
call dein#install#_cd(plugin.path)
|
||||
|
||||
call dein#call_hook('post_update', plugin)
|
||||
finally
|
||||
call dein#install#_cd(cwd)
|
||||
endtry
|
||||
|
||||
if dein#install#_build([plugin.name])
|
||||
call s:log(s:get_plugin_message(plugin, num, max, 'Build failed'))
|
||||
call s:error(plugin.path)
|
||||
@ -1348,7 +1476,7 @@ function! s:iconv(expr, from, to) abort
|
||||
endif
|
||||
|
||||
if type(a:expr) == v:t_list
|
||||
return map(copy(a:expr), 'iconv(v:val, a:from, a:to)')
|
||||
return map(copy(a:expr), { _, val -> iconv(val, a:from, a:to) })
|
||||
else
|
||||
let result = iconv(a:expr, a:from, a:to)
|
||||
return result !=# '' ? result : a:expr
|
||||
@ -1423,17 +1551,13 @@ function! s:append_log_file(msg) abort
|
||||
let msg = readfile(logfile) + msg
|
||||
endif
|
||||
|
||||
let dir = fnamemodify(logfile, ':h')
|
||||
if !isdirectory(dir)
|
||||
call mkdir(dir, 'p')
|
||||
endif
|
||||
call writefile(msg, logfile)
|
||||
call dein#util#_safe_writefile(msg, logfile)
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:echo(expr, mode) abort
|
||||
let msg = map(filter(dein#util#_convert2list(a:expr), "v:val !=# ''"),
|
||||
\ "'[dein] ' . v:val")
|
||||
let msg = map(filter(dein#util#_convert2list(a:expr),
|
||||
\ { _, val -> val !=# '' }), { _, val -> '[dein] ' . val })
|
||||
if empty(msg)
|
||||
return
|
||||
endif
|
||||
@ -1519,36 +1643,3 @@ function! s:strwidthpart_reverse(str, width) abort
|
||||
|
||||
return ret
|
||||
endfunction
|
||||
|
||||
function! s:args2string(args) abort
|
||||
return type(a:args) == v:t_string ? a:args :
|
||||
\ dein#util#_is_windows() ?
|
||||
\ dein#install#_args2string_windows(a:args) :
|
||||
\ dein#install#_args2string_unix(a:args)
|
||||
endfunction
|
||||
|
||||
function! dein#install#_args2string_windows(args) abort
|
||||
if empty(a:args)
|
||||
return ''
|
||||
endif
|
||||
let str = (a:args[0] =~# ' ') ? '"' . a:args[0] . '"' : a:args[0]
|
||||
if len(a:args) > 1
|
||||
let str .= ' '
|
||||
let str .= join(map(copy(a:args[1:]), '''"'' . v:val . ''"'''))
|
||||
endif
|
||||
return str
|
||||
endfunction
|
||||
function! dein#install#_args2string_unix(args) abort
|
||||
return join(map(copy(a:args), 'string(v:val)'))
|
||||
endfunction
|
||||
|
||||
function! s:strptime_py(format, str) abort
|
||||
let ret = ''
|
||||
python3 << EOF
|
||||
import datetime
|
||||
import vim
|
||||
vim.command('let ret = ' + str(datetime.datetime.strptime(
|
||||
vim.eval('a:str'), vim.eval('a:format')).timestamp()))
|
||||
EOF
|
||||
return ret
|
||||
endfunction
|
||||
|
94
bundle/dein.vim/autoload/dein/min.vim
Normal file
94
bundle/dein.vim/autoload/dein/min.vim
Normal file
@ -0,0 +1,94 @@
|
||||
function! dein#min#_init() abort
|
||||
let g:dein#name = ''
|
||||
let g:dein#plugin = {}
|
||||
let g:dein#_cache_version = 410
|
||||
let g:dein#_plugins = {}
|
||||
let g:dein#_multiple_plugins = []
|
||||
let g:dein#_base_path = ''
|
||||
let g:dein#_cache_path = ''
|
||||
let g:dein#_runtime_path = ''
|
||||
let g:dein#_hook_add = ''
|
||||
let g:dein#_ftplugin = {}
|
||||
let g:dein#_called_lua = {}
|
||||
let g:dein#_off1 = ''
|
||||
let g:dein#_off2 = ''
|
||||
let g:dein#_vimrcs = []
|
||||
let g:dein#_block_level = 0
|
||||
let g:dein#_event_plugins = {}
|
||||
let g:dein#_is_sudo = $SUDO_USER !=# '' && $USER !=# $SUDO_USER
|
||||
\ && $HOME !=# expand('~'.$USER)
|
||||
\ && $HOME ==# expand('~'.$SUDO_USER)
|
||||
let g:dein#_progname = fnamemodify(v:progname, ':r')
|
||||
let g:dein#_init_runtimepath = &runtimepath
|
||||
let g:dein#_loaded_rplugins = v:false
|
||||
|
||||
if get(g:, 'dein#lazy_rplugins', v:false)
|
||||
" Disable remote plugin loading
|
||||
let g:loaded_remote_plugins = 1
|
||||
endif
|
||||
|
||||
augroup dein
|
||||
autocmd!
|
||||
autocmd FuncUndefined *
|
||||
\ if stridx(expand('<afile>'), 'remote#') != 0 |
|
||||
\ call dein#autoload#_on_func(expand('<afile>')) |
|
||||
\ endif
|
||||
autocmd BufRead *? call dein#autoload#_on_default_event('BufRead')
|
||||
autocmd BufNew,BufNewFile *? call dein#autoload#_on_default_event('BufNew')
|
||||
autocmd VimEnter *? call dein#autoload#_on_default_event('VimEnter')
|
||||
autocmd FileType *? call dein#autoload#_on_default_event('FileType')
|
||||
autocmd BufWritePost *.lua,*.vim,*.toml,vimrc,.vimrc
|
||||
\ call dein#util#_check_vimrcs()
|
||||
augroup END
|
||||
augroup dein-events | augroup END
|
||||
|
||||
if !exists('##CmdUndefined') | return | endif
|
||||
autocmd dein CmdUndefined *
|
||||
\ call dein#autoload#_on_pre_cmd(expand('<afile>'))
|
||||
if has('nvim')
|
||||
lua <<END
|
||||
table.insert(package.loaders, 1, (function()
|
||||
return function(mod_name)
|
||||
if string.find(mod_name, '^vim.') == nil then
|
||||
vim.fn['dein#autoload#_on_lua'](mod_name)
|
||||
end
|
||||
return nil
|
||||
end
|
||||
end)())
|
||||
END
|
||||
endif
|
||||
endfunction
|
||||
function! dein#min#_load_cache_raw(vimrcs) abort
|
||||
let g:dein#_vimrcs = a:vimrcs
|
||||
let cache = get(g:, 'dein#cache_directory', g:dein#_base_path)
|
||||
\ .'/cache_' . g:dein#_progname
|
||||
let time = getftime(cache)
|
||||
if !empty(filter(map(copy(g:dein#_vimrcs),
|
||||
\ { _, val -> getftime(expand(val)) }), { _, val -> time < val }))
|
||||
return [{}, {}]
|
||||
endif
|
||||
return has('nvim') ? json_decode(readfile(cache))
|
||||
\ : js_decode(readfile(cache)[0])
|
||||
endfunction
|
||||
function! dein#min#load_state(path, ...) abort
|
||||
if !exists('#dein')
|
||||
call dein#min#_init()
|
||||
endif
|
||||
let sourced = a:0 > 0 ? a:1 : has('vim_starting') &&
|
||||
\ (!exists('&loadplugins') || &loadplugins)
|
||||
if (g:dein#_is_sudo || !sourced) | return 1 | endif
|
||||
let g:dein#_base_path = expand(a:path)
|
||||
|
||||
let state = get(g:, 'dein#cache_directory', g:dein#_base_path)
|
||||
\ . '/state_' . g:dein#_progname . '.vim'
|
||||
if !filereadable(state) | return 1 | endif
|
||||
try
|
||||
execute 'source' fnameescape(state)
|
||||
catch
|
||||
if v:exception !=# 'Cache loading error'
|
||||
call dein#util#_error('Loading state error: ' . v:exception)
|
||||
endif
|
||||
call dein#clear_state()
|
||||
return 1
|
||||
endtry
|
||||
endfunction
|
@ -6,7 +6,7 @@
|
||||
|
||||
" Global options definition."
|
||||
let g:dein#enable_name_conversion =
|
||||
\ get(g:, 'dein#enable_name_conversion', 0)
|
||||
\ get(g:, 'dein#enable_name_conversion', v:false)
|
||||
let g:dein#default_options =
|
||||
\ get(g:, 'dein#default_options', {})
|
||||
|
||||
@ -17,8 +17,8 @@ function! dein#parse#_add(repo, options, overwrite) abort
|
||||
let plugin = dein#parse#_dict(dein#parse#_init(a:repo, a:options))
|
||||
let plugin_check = get(g:dein#_plugins, plugin.name, {})
|
||||
let overwrite = get(a:options, 'overwrite', a:overwrite)
|
||||
if get(plugin_check, 'sourced', 0) || !get(plugin, 'if', 1)
|
||||
" Skip already loaded or not enabled plugin.
|
||||
if get(plugin_check, 'sourced', 0)
|
||||
" Skip already loaded plugin.
|
||||
return {}
|
||||
endif
|
||||
|
||||
@ -40,20 +40,20 @@ function! dein#parse#_add(repo, options, overwrite) abort
|
||||
let plugin = dein#parse#_dict(dein#parse#_init(a:repo, options))
|
||||
endif
|
||||
|
||||
let g:dein#_plugins[plugin.name] = plugin
|
||||
|
||||
if plugin.rtp !=# ''
|
||||
if plugin.lazy
|
||||
call s:parse_lazy(plugin)
|
||||
endif
|
||||
if has_key(plugin, 'hook_add')
|
||||
call dein#util#_execute_hook(plugin, plugin.hook_add)
|
||||
call dein#util#_call_hook('add', plugin)
|
||||
endif
|
||||
if has_key(plugin, 'ftplugin')
|
||||
call s:merge_ftplugin(plugin.ftplugin)
|
||||
endif
|
||||
endif
|
||||
|
||||
let g:dein#_plugins[plugin.name] = plugin
|
||||
|
||||
return plugin
|
||||
endfunction
|
||||
function! dein#parse#_init(repo, options) abort
|
||||
@ -88,7 +88,7 @@ function! dein#parse#_dict(plugin) abort
|
||||
if !has_key(plugin, 'normalized_name')
|
||||
let plugin.normalized_name = substitute(
|
||||
\ fnamemodify(plugin.name, ':r'),
|
||||
\ '\c^n\?vim[_-]\|[_-]n\?vim$', '', 'g')
|
||||
\ '\c^\%(n\?vim\|dps\)[_-]\|[_-]n\?vim$', '', 'g')
|
||||
endif
|
||||
|
||||
if !has_key(a:plugin, 'name') && g:dein#enable_name_conversion
|
||||
@ -131,16 +131,15 @@ function! dein#parse#_dict(plugin) abort
|
||||
endif
|
||||
|
||||
" Deprecated check.
|
||||
for key in filter(['directory', 'base'], 'has_key(plugin, v:val)')
|
||||
for key in filter(['directory', 'base'],
|
||||
\ { _, val -> has_key(plugin, val) })
|
||||
call dein#util#_error('plugin name = ' . plugin.name)
|
||||
call dein#util#_error(string(key) . ' is deprecated.')
|
||||
endfor
|
||||
|
||||
if !has_key(plugin, 'lazy')
|
||||
let plugin.lazy =
|
||||
\ has_key(plugin, 'on_i')
|
||||
\ || has_key(plugin, 'on_idle')
|
||||
\ || has_key(plugin, 'on_ft')
|
||||
\ has_key(plugin, 'on_ft')
|
||||
\ || has_key(plugin, 'on_cmd')
|
||||
\ || has_key(plugin, 'on_func')
|
||||
\ || has_key(plugin, 'on_lua')
|
||||
@ -161,17 +160,13 @@ function! dein#parse#_dict(plugin) abort
|
||||
\ && stridx(plugin.rtp, dein#util#_get_base_path()) == 0
|
||||
endif
|
||||
|
||||
if has_key(plugin, 'if') && type(plugin.if) == v:t_string
|
||||
let plugin.if = eval(a:plugin.if)
|
||||
endif
|
||||
|
||||
" Hooks
|
||||
for hook in filter([
|
||||
\ 'hook_add', 'hook_source',
|
||||
\ 'hook_post_source', 'hook_post_update',
|
||||
\ ], 'has_key(plugin, v:val) && type(plugin[v:val]) == v:t_string')
|
||||
let plugin[hook] = substitute(plugin[hook],
|
||||
\ '\n\s*\\\|\%(^\|\n\)\s*"[^\n]*', '', 'g')
|
||||
\ ], { _, val -> has_key(plugin, val)
|
||||
\ && type(plugin[val]) == v:t_string })
|
||||
let plugin[hook] = substitute(plugin[hook], '\n\s*\\', '', 'g')
|
||||
endfor
|
||||
|
||||
return plugin
|
||||
@ -191,13 +186,22 @@ function! dein#parse#_load_toml(filename, default) abort
|
||||
|
||||
" Parse.
|
||||
if has_key(toml, 'hook_add')
|
||||
let pattern = '\n\s*\\\|\%(^\|\n\)\s*"[^\n]*'
|
||||
let g:dein#_hook_add .= "\n" . substitute(
|
||||
\ toml.hook_add, pattern, '', 'g')
|
||||
\ toml.hook_add, '\n\s*\\', '', 'g')
|
||||
endif
|
||||
if has_key(toml, 'ftplugin')
|
||||
call s:merge_ftplugin(toml.ftplugin)
|
||||
endif
|
||||
if has_key(toml, 'multiple_plugins')
|
||||
for multi in toml.multiple_plugins
|
||||
if !has_key(multi, 'plugins')
|
||||
call dein#util#_error('Invalid multiple_plugins: ' . a:filename)
|
||||
return 1
|
||||
endif
|
||||
|
||||
call add(g:dein#_multiple_plugins, multi)
|
||||
endfor
|
||||
endif
|
||||
|
||||
if has_key(toml, 'plugins')
|
||||
for plugin in toml.plugins
|
||||
@ -222,8 +226,6 @@ function! dein#parse#_plugins2toml(plugins) abort
|
||||
let default.frozen = 0
|
||||
let default.local = 0
|
||||
let default.depends = []
|
||||
let default.on_i = 0
|
||||
let default.on_idle = 0
|
||||
let default.on_ft = []
|
||||
let default.on_cmd = []
|
||||
let default.on_func = []
|
||||
@ -246,14 +248,15 @@ function! dein#parse#_plugins2toml(plugins) abort
|
||||
\ 'repo': 1,
|
||||
\ }
|
||||
|
||||
for plugin in dein#util#_sort_by(a:plugins, 'v:val.repo')
|
||||
for plugin in sort(a:plugins,
|
||||
\ { a, b -> a.repo ==# b.repo ? 0 : a.repo ># b.repo ? 1 : -1 })
|
||||
let toml += ['[[plugins]]',
|
||||
\ 'repo = ' . string(plugin.repo)]
|
||||
|
||||
for key in filter(sort(keys(default)),
|
||||
\ '!has_key(skip_default, v:val) && has_key(plugin, v:val)
|
||||
\ && (type(plugin[v:val]) !=# type(default[v:val])
|
||||
\ || plugin[v:val] !=# default[v:val])')
|
||||
\ { _, val -> !has_key(skip_default, val) && has_key(plugin, val)
|
||||
\ && (type(plugin[val]) !=# type(default[val])
|
||||
\ || plugin[val] !=# default[val]) })
|
||||
let val = plugin[key]
|
||||
if key =~# '^hook_'
|
||||
call add(toml, key . " = '''")
|
||||
@ -280,10 +283,10 @@ function! dein#parse#_local(localdir, options, includes) abort
|
||||
let base = fnamemodify(dein#util#_expand(a:localdir), ':p')
|
||||
let directories = []
|
||||
for glob in a:includes
|
||||
let directories += map(filter(dein#util#_globlist(base . glob),
|
||||
\ 'isdirectory(v:val)'), "
|
||||
\ substitute(dein#util#_substitute_path(
|
||||
\ fnamemodify(v:val, ':p')), '/$', '', '')")
|
||||
let directories += map(filter(glob(base . glob, v:true, v:true),
|
||||
\ { _, val -> isdirectory(val) }),
|
||||
\ { _, val -> substitute(dein#util#_substitute_path(
|
||||
\ fnamemodify(val, ':p')), '/$', '', '') })
|
||||
endfor
|
||||
|
||||
for dir in dein#util#_uniq(directories)
|
||||
@ -304,19 +307,12 @@ function! s:parse_lazy(plugin) abort
|
||||
for key in filter([
|
||||
\ 'on_ft', 'on_path', 'on_cmd', 'on_func', 'on_map',
|
||||
\ 'on_lua', 'on_source', 'on_event',
|
||||
\ ], 'has_key(a:plugin, v:val)
|
||||
\ && type(a:plugin[v:val]) != v:t_list
|
||||
\ && type(a:plugin[v:val]) != v:t_dict
|
||||
\')
|
||||
\ ], { _, val -> has_key(a:plugin, val)
|
||||
\ && type(a:plugin[val]) != v:t_list
|
||||
\ && type(a:plugin[val]) != v:t_dict })
|
||||
let a:plugin[key] = [a:plugin[key]]
|
||||
endfor
|
||||
|
||||
if get(a:plugin, 'on_i', 0)
|
||||
let a:plugin.on_event = ['InsertEnter']
|
||||
endif
|
||||
if get(a:plugin, 'on_idle', 0)
|
||||
let a:plugin.on_event = ['FocusLost', 'CursorHold']
|
||||
endif
|
||||
if has_key(a:plugin, 'on_event')
|
||||
for event in a:plugin.on_event
|
||||
if !has_key(g:dein#_event_plugins, event)
|
||||
@ -355,11 +351,11 @@ function! s:generate_dummy_mappings(plugin) abort
|
||||
let a:plugin.dummy_mappings = []
|
||||
let items = type(a:plugin.on_map) == v:t_dict ?
|
||||
\ map(items(a:plugin.on_map),
|
||||
\ "[split(v:val[0], '\\zs'), dein#util#_convert2list(v:val[1])]") :
|
||||
\ { _, val -> [split(val[0], '\zs'),
|
||||
\ dein#util#_convert2list(val[1])]}) :
|
||||
\ map(copy(a:plugin.on_map),
|
||||
\ "type(v:val) == v:t_list ?
|
||||
\ [split(v:val[0], '\\zs'), v:val[1:]] :
|
||||
\ [['n', 'x'], [v:val]]")
|
||||
\ { _, val -> type(val) == v:t_list ?
|
||||
\ [split(val[0], '\zs'), val[1:]] : [['n', 'x'], [val]] })
|
||||
for [modes, mappings] in items
|
||||
if mappings ==# ['<Plug>']
|
||||
" Use plugin name.
|
||||
@ -378,9 +374,9 @@ function! s:generate_dummy_mappings(plugin) abort
|
||||
\ string(a:plugin.name))
|
||||
for mode in modes
|
||||
let raw_map = mode.'noremap <unique><silent> '.mapping
|
||||
\ . (mode ==# 'c' ? " \<C-r>=" :
|
||||
\ mode ==# 'i' ? " \<C-o>:call " : " :\<C-u>call ") . prefix
|
||||
\ . string(mode) . ')<CR>'
|
||||
\ . (mode ==# 'c' ? " \<C-r>=" :
|
||||
\ mode ==# 'i' ? " \<C-o>:call " : " :\<C-u>call ")
|
||||
\ . prefix . string(mode) . ')<CR>'
|
||||
call add(a:plugin.dummy_mappings, [mode, mapping, raw_map])
|
||||
silent! execute raw_map
|
||||
endfor
|
||||
@ -396,17 +392,17 @@ function! s:merge_ftplugin(ftplugin) abort
|
||||
let g:dein#_ftplugin[ft] .= "\n" . val
|
||||
endif
|
||||
endfor
|
||||
call map(g:dein#_ftplugin, "substitute(v:val, pattern, '', 'g')")
|
||||
call map(g:dein#_ftplugin, { _, val -> substitute(val, pattern, '', 'g') })
|
||||
endfunction
|
||||
|
||||
function! dein#parse#_get_types() abort
|
||||
if !exists('s:types')
|
||||
" Load types.
|
||||
let s:types = {}
|
||||
for type in filter(map(split(globpath(&runtimepath,
|
||||
\ 'autoload/dein/types/*.vim', 1), '\n'),
|
||||
\ "dein#types#{fnamemodify(v:val, ':t:r')}#define()"),
|
||||
\ '!empty(v:val)')
|
||||
for type in filter(map(globpath(&runtimepath,
|
||||
\ 'autoload/dein/types/*.vim', v:true, v:true),
|
||||
\ { _, val -> dein#types#{fnamemodify(val, ':t:r')}#define() }),
|
||||
\ { _, val -> !empty(val) })
|
||||
let s:types[type.name] = type
|
||||
endfor
|
||||
endif
|
||||
|
@ -3,6 +3,27 @@
|
||||
"
|
||||
" public api
|
||||
"
|
||||
function! dein#toml#syntax() abort
|
||||
if has('nvim') && exists(':TSEnableAll')
|
||||
TSBufDisable highlight
|
||||
endif
|
||||
|
||||
syntax clear
|
||||
|
||||
unlet! b:current_syntax
|
||||
runtime! syntax/toml.vim
|
||||
|
||||
unlet! b:current_syntax
|
||||
syntax include @tomlVim syntax/vim.vim
|
||||
|
||||
syntax region tomlVim matchgroup=tomlString
|
||||
\ start=+\<\w*\s*=\s*'''+
|
||||
\ end=+'''+ contains=@tomlVim keepend
|
||||
syntax region tomlVim matchgroup=tomlString
|
||||
\ start=+\<\w*\s*=\s*"""+
|
||||
\ end=+"""+ contains=@tomlVim keepend
|
||||
endfunction
|
||||
|
||||
function! dein#toml#parse(text) abort
|
||||
let input = {
|
||||
\ 'text': a:text,
|
||||
|
@ -6,12 +6,14 @@
|
||||
"=============================================================================
|
||||
|
||||
" Global options definition.
|
||||
call dein#util#_set_default(
|
||||
\ 'g:dein#types#git#clone_depth', 0)
|
||||
call dein#util#_set_default(
|
||||
\ 'g:dein#types#git#command_path', 'git')
|
||||
call dein#util#_set_default(
|
||||
\ 'g:dein#types#git#default_protocol', 'https')
|
||||
\ 'g:dein#types#git#default_hub_site', 'github.com')
|
||||
call dein#util#_set_default(
|
||||
\ 'g:dein#types#git#clone_depth', 0)
|
||||
\ 'g:dein#types#git#default_protocol', 'https')
|
||||
call dein#util#_set_default(
|
||||
\ 'g:dein#types#git#pull_command', 'pull --ff --ff-only')
|
||||
|
||||
@ -69,7 +71,7 @@ function! s:type.get_uri(repo, options) abort
|
||||
\ ':.*$', '', '')
|
||||
endif
|
||||
if host ==# ''
|
||||
let host = 'github.com'
|
||||
let host = g:dein#types#git#default_hub_site
|
||||
endif
|
||||
|
||||
if protocol ==# ''
|
||||
@ -199,6 +201,14 @@ function! s:type.get_rollback_command(plugin, rev) abort
|
||||
|
||||
return [self.command, 'reset', '--hard', a:rev]
|
||||
endfunction
|
||||
function! s:type.get_diff_command(plugin, old_rev, new_rev) abort
|
||||
if !self.executable
|
||||
return []
|
||||
endif
|
||||
|
||||
return [self.command, 'diff', a:old_rev . '..'. a:new_rev,
|
||||
\ '--', 'doc', 'README', 'README.md']
|
||||
endfunction
|
||||
|
||||
function! s:is_git_dir(path) abort
|
||||
if isdirectory(a:path)
|
||||
|
@ -27,12 +27,8 @@ function! s:type.init(repo, options) abort
|
||||
endfunction
|
||||
|
||||
function! s:type.get_sync_command(plugin) abort
|
||||
let path = a:plugin.path
|
||||
if !isdirectory(path)
|
||||
" Create script type directory.
|
||||
call mkdir(path, 'p')
|
||||
endif
|
||||
call dein#util#_safe_mkdir(a:plugin.path)
|
||||
|
||||
let outpath = path . '/' . fnamemodify(a:plugin.repo, ':t')
|
||||
let outpath = a:plugin.path . '/' . fnamemodify(a:plugin.repo, ':t')
|
||||
return dein#util#_download(a:plugin.repo, outpath)
|
||||
endfunction
|
||||
|
@ -37,9 +37,7 @@ function! dein#util#_get_runtime_path() abort
|
||||
endif
|
||||
|
||||
let g:dein#_runtime_path = dein#util#_get_cache_path() . '/.dein'
|
||||
if !isdirectory(g:dein#_runtime_path)
|
||||
call mkdir(g:dein#_runtime_path, 'p')
|
||||
endif
|
||||
call dein#util#_safe_mkdir(g:dein#_runtime_path)
|
||||
return g:dein#_runtime_path
|
||||
endfunction
|
||||
function! dein#util#_get_cache_path() abort
|
||||
@ -50,14 +48,12 @@ function! dein#util#_get_cache_path() abort
|
||||
let g:dein#_cache_path = get(g:,
|
||||
\ 'dein#cache_directory', g:dein#_base_path)
|
||||
\ . '/.cache/' . fnamemodify(dein#util#_get_myvimrc(), ':t')
|
||||
if !isdirectory(g:dein#_cache_path)
|
||||
call mkdir(g:dein#_cache_path, 'p')
|
||||
endif
|
||||
call dein#util#_safe_mkdir(g:dein#_cache_path)
|
||||
return g:dein#_cache_path
|
||||
endfunction
|
||||
function! dein#util#_get_vimrcs(vimrcs) abort
|
||||
return !empty(a:vimrcs) ?
|
||||
\ map(dein#util#_convert2list(a:vimrcs), 'expand(v:val)') :
|
||||
\ map(dein#util#_convert2list(a:vimrcs), { _, val -> expand(val) }) :
|
||||
\ [dein#util#_get_myvimrc()]
|
||||
endfunction
|
||||
function! dein#util#_get_myvimrc() abort
|
||||
@ -74,52 +70,63 @@ function! dein#util#_error(msg) abort
|
||||
endfunction
|
||||
function! dein#util#_notify(msg) abort
|
||||
call dein#util#_set_default(
|
||||
\ 'g:dein#enable_notification', 0)
|
||||
\ 'g:dein#enable_notification', v:false)
|
||||
call dein#util#_set_default(
|
||||
\ 'g:dein#notification_icon', '')
|
||||
call dein#util#_set_default(
|
||||
\ 'g:dein#notification_time', 2)
|
||||
|
||||
if !g:dein#enable_notification || a:msg ==# '' || has('vim_starting')
|
||||
if !g:dein#enable_notification || a:msg ==# ''
|
||||
call dein#util#_error(a:msg)
|
||||
return
|
||||
endif
|
||||
|
||||
let title = '[dein]'
|
||||
|
||||
if has('nvim') && dein#util#_luacheck('notify')
|
||||
" Use nvim-notify plugin
|
||||
call luaeval('require("notify")(_A.msg, "info", {'.
|
||||
\ 'timeout=vim.g["dein#notification_time"] * 1000,'.
|
||||
\ 'title=_A.title })',
|
||||
\ { 'msg': a:msg, 'title': title })
|
||||
return
|
||||
endif
|
||||
|
||||
if has('vim_starting') && !has('gui_running')
|
||||
call dein#util#_error(a:msg)
|
||||
return
|
||||
endif
|
||||
|
||||
let icon = dein#util#_expand(g:dein#notification_icon)
|
||||
|
||||
let title = '[dein]'
|
||||
let cmd = ''
|
||||
let cmd = []
|
||||
if executable('notify-send')
|
||||
let cmd = printf('notify-send --expire-time=%d',
|
||||
\ g:dein#notification_time * 1000)
|
||||
let cmd = ['notify-send', '-t', g:dein#notification_time * 1000]
|
||||
if icon !=# ''
|
||||
let cmd .= ' --icon=' . string(icon)
|
||||
endif
|
||||
let cmd .= ' ' . string(title) . ' ' . string(a:msg)
|
||||
elseif dein#util#_is_windows() && executable('Snarl_CMD')
|
||||
let cmd = printf('Snarl_CMD snShowMessage %d "%s" "%s"',
|
||||
\ g:dein#notification_time, title, a:msg)
|
||||
if icon !=# ''
|
||||
let cmd .= ' "' . icon . '"'
|
||||
let cmd += ['-i', icon]
|
||||
endif
|
||||
let cmd += [title, a:msg]
|
||||
elseif dein#util#_is_mac()
|
||||
let cmd = ''
|
||||
let cmd = []
|
||||
if executable('terminal-notifier')
|
||||
let cmd .= 'terminal-notifier -title '
|
||||
\ . string(title) . ' -message ' . string(a:msg)
|
||||
let cmd += ['terminal-notifier', '-title', 'title', '-message', a:msg]
|
||||
if icon !=# ''
|
||||
let cmd .= ' -appIcon ' . string(icon)
|
||||
let cmd += ['-appIcon', icon]
|
||||
endif
|
||||
else
|
||||
let cmd .= printf("osascript -e 'display notification "
|
||||
\ ."\"%s\" with title \"%s\"'", a:msg, title)
|
||||
let cmd += ['osascript', '-e', 'display notification '
|
||||
\ . printf('"%s" with title "%s"', a:msg, title)]
|
||||
endif
|
||||
endif
|
||||
|
||||
if cmd !=# ''
|
||||
call dein#install#_system(cmd)
|
||||
if !empty(cmd)
|
||||
call dein#install#_system_bg(cmd)
|
||||
endif
|
||||
endfunction
|
||||
function! dein#util#_luacheck(module) abort
|
||||
return luaeval('pcall(require, _A.module)', { 'module': a:module })
|
||||
endfunction
|
||||
|
||||
|
||||
function! dein#util#_chomp(str) abort
|
||||
return a:str !=# '' && a:str[-1:] ==# '/' ? a:str[: -2] : a:str
|
||||
@ -149,42 +156,49 @@ endfunction
|
||||
function! dein#util#_is_powershell() abort
|
||||
return dein#install#_is_async() && fnamemodify(&shell, ':t:r') =~? 'powershell\|pwsh'
|
||||
endfunction
|
||||
function! dein#util#_has_job() abort
|
||||
return (has('nvim') && exists('v:t_list'))
|
||||
\ || (has('patch-8.0.0027') && has('job'))
|
||||
endfunction
|
||||
|
||||
function! dein#util#_check_lazy_plugins() abort
|
||||
return map(filter(dein#util#_get_lazy_plugins(),
|
||||
\ "isdirectory(v:val.rtp)
|
||||
\ && !get(v:val, 'local', 0)
|
||||
\ && get(v:val, 'hook_source', '') ==# ''
|
||||
\ && get(v:val, 'hook_add', '') ==# ''
|
||||
\ && !isdirectory(v:val.rtp . '/plugin')
|
||||
\ && !isdirectory(v:val.rtp . '/after/plugin')"),
|
||||
\ 'v:val.name')
|
||||
return map(filter(dein#util#_get_lazy_plugins(), { _, val ->
|
||||
\ isdirectory(val.rtp)
|
||||
\ && !get(val, 'local', 0)
|
||||
\ && get(val, 'hook_source', '') ==# ''
|
||||
\ && get(val, 'hook_add', '') ==# ''
|
||||
\ && !isdirectory(val.rtp . '/plugin')
|
||||
\ && !isdirectory(val.rtp . '/after/plugin')
|
||||
\ }), { _, val -> val.name })
|
||||
endfunction
|
||||
function! dein#util#_check_clean() abort
|
||||
let plugins_directories = map(values(dein#get()), 'v:val.path')
|
||||
let plugins_directories = map(values(dein#get()), { _, val -> val.path })
|
||||
let path = dein#util#_substitute_path(
|
||||
\ globpath(dein#util#_get_base_path(), 'repos/*/*/*'))
|
||||
\ globpath(dein#util#_get_base_path(), 'repos/*/*/*', v:true))
|
||||
return filter(split(path, "\n"),
|
||||
\ "isdirectory(v:val) && fnamemodify(v:val, ':t') !=# 'dein.vim'
|
||||
\ && index(plugins_directories, v:val) < 0")
|
||||
\ { _, val -> isdirectory(val)
|
||||
\ && fnamemodify(val, ':t') !=# 'dein.vim'
|
||||
\ && index(plugins_directories, val) < 0
|
||||
\ })
|
||||
endfunction
|
||||
|
||||
function! dein#util#_writefile(path, list) abort
|
||||
if g:dein#_is_sudo || !filewritable(dein#util#_get_cache_path())
|
||||
function! dein#util#_cache_writefile(list, path) abort
|
||||
if !filewritable(dein#util#_get_cache_path())
|
||||
return 1
|
||||
endif
|
||||
|
||||
let path = dein#util#_get_cache_path() . '/' . a:path
|
||||
let dir = fnamemodify(path, ':h')
|
||||
if !isdirectory(dir)
|
||||
call mkdir(dir, 'p')
|
||||
return dein#util#_safe_writefile(a:list, path)
|
||||
endfunction
|
||||
function! dein#util#_safe_writefile(list, path, ...) abort
|
||||
if g:dein#_is_sudo
|
||||
return 1
|
||||
endif
|
||||
|
||||
return writefile(a:list, path)
|
||||
call dein#util#_safe_mkdir(fnamemodify(a:path, ':h'))
|
||||
return writefile(a:list, a:path, get(a:000, 0, ''))
|
||||
endfunction
|
||||
function! dein#util#_safe_mkdir(path) abort
|
||||
if g:dein#_is_sudo || isdirectory(a:path)
|
||||
return 1
|
||||
endif
|
||||
return mkdir(a:path, 'p')
|
||||
endfunction
|
||||
|
||||
function! dein#util#_get_type(name) abort
|
||||
@ -206,30 +220,33 @@ function! dein#util#_save_cache(vimrcs, is_state, is_starting) abort
|
||||
if has_key(plugin, 'orig_opts')
|
||||
call remove(plugin, 'orig_opts')
|
||||
endif
|
||||
if has_key(plugin, 'called')
|
||||
call remove(plugin, 'called')
|
||||
endif
|
||||
|
||||
" Hooks
|
||||
for hook in filter([
|
||||
\ 'hook_add', 'hook_source',
|
||||
\ 'hook_post_source', 'hook_post_update',
|
||||
\ ], 'has_key(plugin, v:val)
|
||||
\ && type(plugin[v:val]) == v:t_func')
|
||||
\ ], { _, val -> has_key(plugin, val)
|
||||
\ && type(plugin[val]) == v:t_func })
|
||||
call remove(plugin, hook)
|
||||
endfor
|
||||
endfor
|
||||
|
||||
if !isdirectory(g:dein#_base_path)
|
||||
call mkdir(g:dein#_base_path, 'p')
|
||||
endif
|
||||
call dein#util#_safe_mkdir(g:dein#_base_path)
|
||||
|
||||
call writefile([string(a:vimrcs),
|
||||
\ json_encode(plugins), json_encode(g:dein#_ftplugin)],
|
||||
let src = [plugins, g:dein#_ftplugin]
|
||||
call dein#util#_safe_writefile(
|
||||
\ has('nvim') ? [json_encode(src)] : [js_encode(src)],
|
||||
\ get(g:, 'dein#cache_directory', g:dein#_base_path)
|
||||
\ .'/cache_' . g:dein#_progname)
|
||||
endfunction
|
||||
function! dein#util#_check_vimrcs() abort
|
||||
let time = getftime(dein#util#_get_runtime_path())
|
||||
let ret = !empty(filter(map(copy(g:dein#_vimrcs), 'getftime(expand(v:val))'),
|
||||
\ 'time < v:val'))
|
||||
let ret = !empty(filter(map(copy(g:dein#_vimrcs),
|
||||
\ { _, val -> getftime(expand(val)) }),
|
||||
\ { _, val -> time < val }))
|
||||
if !ret
|
||||
return 0
|
||||
endif
|
||||
@ -238,33 +255,6 @@ function! dein#util#_check_vimrcs() abort
|
||||
|
||||
return ret
|
||||
endfunction
|
||||
function! dein#util#_load_merged_plugins() abort
|
||||
let path = dein#util#_get_cache_path() . '/merged'
|
||||
if !filereadable(path)
|
||||
return []
|
||||
endif
|
||||
let merged = readfile(path)
|
||||
if len(merged) != s:merged_length
|
||||
return []
|
||||
endif
|
||||
sandbox return merged[: s:merged_length - 2] + eval(merged[-1])
|
||||
endfunction
|
||||
function! dein#util#_save_merged_plugins() abort
|
||||
let merged = dein#util#_get_merged_plugins()
|
||||
call writefile(merged[: s:merged_length - 2] +
|
||||
\ [string(merged[s:merged_length - 1 :])],
|
||||
\ dein#util#_get_cache_path() . '/merged')
|
||||
endfunction
|
||||
function! dein#util#_get_merged_plugins() abort
|
||||
let ftplugin_len = 0
|
||||
for ftplugin in values(g:dein#_ftplugin)
|
||||
let ftplugin_len += len(ftplugin)
|
||||
endfor
|
||||
let merged_format =
|
||||
\ "{'repo': v:val.repo, 'rev': get(v:val, 'rev', '')}"
|
||||
return [merged_format, string(ftplugin_len)] +
|
||||
\ sort(map(values(g:dein#_plugins), merged_format))
|
||||
endfunction
|
||||
|
||||
function! dein#util#_save_state(is_starting) abort
|
||||
if g:dein#_block_level != 0
|
||||
@ -272,12 +262,12 @@ function! dein#util#_save_state(is_starting) abort
|
||||
return 1
|
||||
endif
|
||||
|
||||
if dein#util#_get_cache_path() ==# '' || !a:is_starting
|
||||
if dein#util#_get_cache_path() ==# '' || !a:is_starting || g:dein#_is_sudo
|
||||
" Ignore
|
||||
return 1
|
||||
endif
|
||||
|
||||
if get(g:, 'dein#auto_recache', 0)
|
||||
if get(g:, 'dein#auto_recache', v:false)
|
||||
call dein#util#_notify('auto recached')
|
||||
call dein#recache_runtimepath()
|
||||
endif
|
||||
@ -294,7 +284,7 @@ function! dein#util#_save_state(is_starting) abort
|
||||
\ 'if g:dein#_cache_version !=# ' . g:dein#_cache_version . ' || ' .
|
||||
\ 'g:dein#_init_runtimepath !=# ' . string(g:dein#_init_runtimepath) .
|
||||
\ ' | throw ''Cache loading error'' | endif',
|
||||
\ 'let [plugins, ftplugin] = dein#load_cache_raw('.
|
||||
\ 'let [plugins, ftplugin] = dein#min#_load_cache_raw('.
|
||||
\ string(g:dein#_vimrcs) .')',
|
||||
\ "if empty(plugins) | throw 'Cache loading error' | endif",
|
||||
\ 'let g:dein#_plugins = plugins',
|
||||
@ -333,7 +323,8 @@ function! dein#util#_save_state(is_starting) abort
|
||||
|
||||
" Invalid hooks detection
|
||||
for key in keys(filter(copy(plugin),
|
||||
\ "stridx(v:key, 'hook_') == 0 && type(v:val) != v:t_string"))
|
||||
\ { key, val -> stridx(key, 'hook_') == 0
|
||||
\ && type(val) != v:t_string }))
|
||||
call dein#util#_error(
|
||||
\ printf('%s: "%s" must be string to save state',
|
||||
\ plugin.name, key))
|
||||
@ -342,7 +333,7 @@ function! dein#util#_save_state(is_starting) abort
|
||||
|
||||
" Add events
|
||||
for [event, plugins] in filter(items(g:dein#_event_plugins),
|
||||
\ "exists('##' . v:val[0])")
|
||||
\ { _, val -> exists('##' . val[0]) })
|
||||
call add(lines, printf('autocmd dein-events %s call '
|
||||
\. 'dein#autoload#_on_event("%s", %s)',
|
||||
\ (exists('##' . event) ? event . ' *' : 'User ' . event),
|
||||
@ -351,28 +342,25 @@ function! dein#util#_save_state(is_starting) abort
|
||||
|
||||
" Add inline vimrcs
|
||||
for vimrc in get(g:, 'dein#inline_vimrcs', [])
|
||||
let lines += filter(readfile(vimrc), "v:val !=# '' && v:val !~# '^\\s*\"'")
|
||||
let lines += filter(readfile(vimrc),
|
||||
\ { _, val -> val !=# '' && val !~# '^\s*"' })
|
||||
endfor
|
||||
|
||||
call writefile(lines, get(g:, 'dein#cache_directory', g:dein#_base_path)
|
||||
\ .'/state_' . g:dein#_progname . '.vim')
|
||||
let state = get(g:, 'dein#cache_directory', g:dein#_base_path)
|
||||
\ . '/state_' . g:dein#_progname . '.vim'
|
||||
call dein#util#_safe_writefile(lines, state)
|
||||
endfunction
|
||||
function! dein#util#_clear_state() abort
|
||||
let base = get(g:, 'dein#cache_directory', g:dein#_base_path)
|
||||
for cache in dein#util#_globlist(base.'/state_*.vim')
|
||||
\ + dein#util#_globlist(base.'/cache_*')
|
||||
for cache in glob(base.'/state_*.vim', v:true, v:true)
|
||||
\ + glob(base.'/cache_*', v:true, v:true)
|
||||
call delete(cache)
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
function! dein#util#_begin(path, vimrcs) abort
|
||||
if !exists('#dein')
|
||||
call dein#_init()
|
||||
endif
|
||||
|
||||
if !dein#util#_has_job()
|
||||
call dein#util#_error('Does not work in the Vim (' . v:version . ').')
|
||||
return 1
|
||||
call dein#min#_init()
|
||||
endif
|
||||
|
||||
if a:path ==# '' || g:dein#_block_level != 0
|
||||
@ -388,6 +376,9 @@ function! dein#util#_begin(path, vimrcs) abort
|
||||
call dein#util#_get_runtime_path()
|
||||
call dein#util#_get_cache_path()
|
||||
let g:dein#_vimrcs = dein#util#_get_vimrcs(a:vimrcs)
|
||||
if exists('g:dein#inline_vimrcs')
|
||||
let g:dein#_vimrcs += g:dein#inline_vimrcs
|
||||
endif
|
||||
let g:dein#_hook_add = ''
|
||||
|
||||
if has('vim_starting')
|
||||
@ -433,7 +424,7 @@ function! dein#util#_end() abort
|
||||
|
||||
if !has('vim_starting')
|
||||
call dein#source(filter(values(g:dein#_plugins),
|
||||
\ "!v:val.lazy && !v:val.sourced && v:val.rtp !=# ''"))
|
||||
\ { _, val -> !val.lazy && !val.sourced && val.rtp !=# '' }))
|
||||
endif
|
||||
|
||||
" Add runtimepath
|
||||
@ -448,7 +439,10 @@ function! dein#util#_end() abort
|
||||
let sourced = has('vim_starting') &&
|
||||
\ (!exists('&loadplugins') || &loadplugins)
|
||||
for plugin in filter(values(g:dein#_plugins),
|
||||
\ "!v:val.lazy && !v:val.sourced && v:val.rtp !=# ''")
|
||||
\ { _, val -> !empty(val)
|
||||
\ && !val.lazy && !val.sourced && val.rtp !=# ''
|
||||
\ && (!has_key(v:val, 'if') || eval(v:val.if)) })
|
||||
|
||||
" Load dependencies
|
||||
if has_key(plugin, 'depends')
|
||||
let depends += plugin.depends
|
||||
@ -469,12 +463,20 @@ function! dein#util#_end() abort
|
||||
call dein#source(depends)
|
||||
endif
|
||||
|
||||
for multi in filter(copy(g:dein#_multiple_plugins),
|
||||
\ { _, val -> dein#is_available(val.plugins) })
|
||||
if has_key(multi, 'hook_add')
|
||||
let g:dein#_hook_add .= "\n" . substitute(
|
||||
\ multi.hook_add, '\n\s*\\', '', 'g')
|
||||
endif
|
||||
endfor
|
||||
|
||||
if g:dein#_hook_add !=# ''
|
||||
call dein#util#_execute_hook({}, g:dein#_hook_add)
|
||||
endif
|
||||
|
||||
for [event, plugins] in filter(items(g:dein#_event_plugins),
|
||||
\ "exists('##' . v:val[0])")
|
||||
\ { _, val -> exists('##' . val[0]) })
|
||||
execute printf('autocmd dein-events %s call '
|
||||
\. 'dein#autoload#_on_event("%s", %s)',
|
||||
\ (exists('##' . event) ? event . ' *' : 'User ' . event),
|
||||
@ -508,17 +510,27 @@ endfunction
|
||||
|
||||
function! dein#util#_call_hook(hook_name, ...) abort
|
||||
let hook = 'hook_' . a:hook_name
|
||||
let plugins = filter(dein#util#_get_plugins((a:0 ? a:1 : [])),
|
||||
\ "((a:hook_name !=# 'source'
|
||||
\ && a:hook_name !=# 'post_source') || v:val.sourced)
|
||||
\ && has_key(v:val, hook) && isdirectory(v:val.path)")
|
||||
|
||||
for plugin in filter(dein#util#_tsort(plugins),
|
||||
\ 'has_key(v:val, hook)')
|
||||
let plugins = filter(dein#util#_tsort(
|
||||
\ dein#util#_get_plugins((a:0 ? a:1 : []))),
|
||||
\ { _, val ->
|
||||
\ ((a:hook_name !=# 'source'
|
||||
\ && a:hook_name !=# 'post_source') || val.sourced)
|
||||
\ && has_key(val, hook) && isdirectory(val.path)
|
||||
\ && (!has_key(v:val, 'if') || eval(v:val.if))
|
||||
\ })
|
||||
for plugin in plugins
|
||||
call dein#util#_execute_hook(plugin, plugin[hook])
|
||||
endfor
|
||||
endfunction
|
||||
function! dein#util#_execute_hook(plugin, hook) abort
|
||||
" Skip twice call
|
||||
if !has_key(a:plugin, 'called')
|
||||
let a:plugin.called = {}
|
||||
endif
|
||||
if has_key(a:plugin.called, string(a:hook))
|
||||
return
|
||||
endif
|
||||
|
||||
try
|
||||
let g:dein#plugin = a:plugin
|
||||
|
||||
@ -527,6 +539,8 @@ function! dein#util#_execute_hook(plugin, hook) abort
|
||||
else
|
||||
call call(a:hook, [])
|
||||
endif
|
||||
|
||||
let a:plugin.called[string(a:hook)] = v:true
|
||||
catch
|
||||
call dein#util#_error(
|
||||
\ 'Error occurred while executing hook: ' .
|
||||
@ -547,16 +561,11 @@ function! dein#util#_set_hook(plugins, hook_name, hook) abort
|
||||
\ type(a:hook) != v:t_string ? a:hook :
|
||||
\ substitute(a:hook, '\n\s*\\\|\%(^\|\n\)\s*"[^\n]*', '', 'g')
|
||||
if a:hook_name ==# 'hook_add'
|
||||
call dein#util#_execute_hook(plugin, plugin[a:hook_name])
|
||||
call dein#util#_call_hook('add', plugin)
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
function! dein#util#_sort_by(list, expr) abort
|
||||
let pairs = map(a:list, printf('[v:val, %s]', a:expr))
|
||||
return map(s:sort(pairs,
|
||||
\ 'a:a[1] ==# a:b[1] ? 0 : a:a[1] ># a:b[1] ? 1 : -1'), 'v:val[0]')
|
||||
endfunction
|
||||
function! dein#util#_tsort(plugins) abort
|
||||
let sorted = []
|
||||
let mark = {}
|
||||
@ -573,11 +582,12 @@ function! dein#util#_split_rtp(runtimepath) abort
|
||||
endif
|
||||
|
||||
let split = split(a:runtimepath, '\\\@<!\%(\\\\\)*\zs,')
|
||||
return map(split,'substitute(v:val, ''\\\([\\,]\)'', ''\1'', ''g'')')
|
||||
return map(split, { _, val -> substitute(val, '\\\([\\,]\)', '\1', 'g') })
|
||||
endfunction
|
||||
function! dein#util#_join_rtp(list, runtimepath, rtp) abort
|
||||
return (stridx(a:runtimepath, '\,') < 0 && stridx(a:rtp, ',') < 0) ?
|
||||
\ join(a:list, ',') : join(map(copy(a:list), 's:escape(v:val)'), ',')
|
||||
\ join(a:list, ',') : join(map(copy(a:list),
|
||||
\ { _, val -> s:escape(val) }), ',')
|
||||
endfunction
|
||||
|
||||
function! dein#util#_add_after(rtps, path) abort
|
||||
@ -597,9 +607,6 @@ function! dein#util#_substitute_path(path) abort
|
||||
return ((s:is_windows || has('win32unix')) && a:path =~# '\\') ?
|
||||
\ tr(a:path, '\', '/') : a:path
|
||||
endfunction
|
||||
function! dein#util#_globlist(path) abort
|
||||
return split(glob(a:path), '\n')
|
||||
endfunction
|
||||
|
||||
function! dein#util#_convert2list(expr) abort
|
||||
return type(a:expr) ==# v:t_list ? copy(a:expr) :
|
||||
@ -628,21 +635,22 @@ endfunction
|
||||
|
||||
function! dein#util#_get_lazy_plugins() abort
|
||||
return filter(values(g:dein#_plugins),
|
||||
\ "!v:val.sourced && v:val.rtp !=# ''")
|
||||
\ { _, val -> !val.sourced && val.rtp !=# '' })
|
||||
endfunction
|
||||
|
||||
function! dein#util#_get_plugins(plugins) abort
|
||||
return empty(a:plugins) ?
|
||||
\ values(dein#get()) :
|
||||
\ filter(map(dein#util#_convert2list(a:plugins),
|
||||
\ 'type(v:val) == v:t_dict ? v:val : dein#get(v:val)'),
|
||||
\ '!empty(v:val)')
|
||||
\ { _, val -> type(val) == v:t_dict ? val : dein#get(val) }),
|
||||
\ { _, val -> !empty(val) })
|
||||
endfunction
|
||||
|
||||
function! dein#util#_disable(names) abort
|
||||
for plugin in map(filter(dein#util#_convert2list(a:names),
|
||||
\ 'has_key(g:dein#_plugins, v:val)
|
||||
\ && !g:dein#_plugins[v:val].sourced'), 'g:dein#_plugins[v:val]')
|
||||
\ { _, val ->
|
||||
\ has_key(g:dein#_plugins, val) && !g:dein#_plugins[val].sourced
|
||||
\ }), { _, val -> g:dein#_plugins[val]})
|
||||
if has_key(plugin, 'dummy_commands')
|
||||
for command in plugin.dummy_commands
|
||||
silent! execute 'delcommand' command[0]
|
||||
@ -699,21 +707,25 @@ function! s:tsort_impl(target, mark, sorted) abort
|
||||
endfunction
|
||||
|
||||
function! dein#util#_check_install(plugins) abort
|
||||
if g:dein#_is_sudo
|
||||
return
|
||||
endif
|
||||
|
||||
if !empty(a:plugins)
|
||||
let invalids = filter(dein#util#_convert2list(a:plugins),
|
||||
\ 'empty(dein#get(v:val))')
|
||||
\ { _, val -> empty(dein#get(val)) })
|
||||
if !empty(invalids)
|
||||
call dein#util#_error('Invalid plugins: ' .
|
||||
\ string(map(invalids, 'v:val')))
|
||||
call dein#util#_error('Invalid plugins: ' . string(invalids))
|
||||
return -1
|
||||
endif
|
||||
endif
|
||||
let plugins = empty(a:plugins) ? values(dein#get()) :
|
||||
\ map(dein#util#_convert2list(a:plugins), 'dein#get(v:val)')
|
||||
let plugins = filter(plugins, '!isdirectory(v:val.path)')
|
||||
\ map(dein#util#_convert2list(a:plugins),
|
||||
\ { _, val -> dein#get(val) })
|
||||
let plugins = filter(plugins, { _, val -> !isdirectory(val.path) })
|
||||
if empty(plugins) | return 0 | endif
|
||||
call dein#util#_notify('Not installed plugins: ' .
|
||||
\ string(map(plugins, 'v:val.name')))
|
||||
\ string(map(plugins, { _, val -> val.name })))
|
||||
return 1
|
||||
endfunction
|
||||
|
||||
@ -721,7 +733,7 @@ function! s:msg2list(expr) abort
|
||||
return type(a:expr) ==# v:t_list ? a:expr : split(a:expr, '\n')
|
||||
endfunction
|
||||
function! s:skipempty(string) abort
|
||||
return filter(split(a:string, '\n'), "v:val !=# ''")
|
||||
return filter(split(a:string, '\n'), { _, val -> val !=# '' })
|
||||
endfunction
|
||||
|
||||
function! s:escape(path) abort
|
||||
@ -729,17 +741,6 @@ function! s:escape(path) abort
|
||||
return substitute(a:path, ',\|\\,\@=', '\\\0', 'g')
|
||||
endfunction
|
||||
|
||||
function! s:sort(list, expr) abort
|
||||
if type(a:expr) == v:t_func
|
||||
return sort(a:list, a:expr)
|
||||
endif
|
||||
let s:expr = a:expr
|
||||
return sort(a:list, 's:_compare')
|
||||
endfunction
|
||||
function! s:_compare(a, b) abort
|
||||
return eval(s:expr)
|
||||
endfunction
|
||||
|
||||
function! s:execute(expr) abort
|
||||
if exists('*execute')
|
||||
return execute(split(a:expr, '\n'), '')
|
||||
|
@ -22,13 +22,13 @@ let s:kind.action_table.preview = {
|
||||
\ }
|
||||
function! s:kind.action_table.preview.func(candidate) abort
|
||||
" Search help files.
|
||||
let readme = get(split(globpath(
|
||||
\ a:candidate.action__path, 'doc/*.?*', 1), '\n'), 0, '')
|
||||
let readme = get(globpath(a:candidate.action__path, 'doc/*.?*',
|
||||
\ v:true, v:true), 0, '')
|
||||
|
||||
if readme ==# ''
|
||||
" Search README files.
|
||||
let readme = get(split(globpath(
|
||||
\ a:candidate.action__path, 'README*', 1), '\n'), 0, '')
|
||||
let readme = get(globpath(a:candidate.action__path, 'README*',
|
||||
\ v:true, v:true), 0, '')
|
||||
if readme ==# ''
|
||||
return
|
||||
endif
|
||||
|
@ -43,22 +43,22 @@ let s:source.converters = s:source.source__converter
|
||||
|
||||
|
||||
function! s:source.gather_candidates(args, context) abort
|
||||
let _ = map(copy(a:context.source__plugins), "{
|
||||
\ 'word': substitute(v:val.repo,
|
||||
let _ = map(copy(a:context.source__plugins), { _, val -> {
|
||||
\ 'word': substitute(val.repo,
|
||||
\ '^\%(https\?\|git\)://\%(github.com/\)\?', '', ''),
|
||||
\ 'kind': 'dein',
|
||||
\ 'action__path': v:val.path,
|
||||
\ 'action__directory': v:val.path,
|
||||
\ 'action__plugin': v:val,
|
||||
\ 'action__plugin_name': v:val.name,
|
||||
\ 'source__type': v:val.type,
|
||||
\ 'source__is_sourced': v:val.sourced,
|
||||
\ 'source__is_installed': isdirectory(v:val.path),
|
||||
\ 'action__path': val.path,
|
||||
\ 'action__directory': val.path,
|
||||
\ 'action__plugin': val,
|
||||
\ 'action__plugin_name': val.name,
|
||||
\ 'source__type': val.type,
|
||||
\ 'source__is_sourced': val.sourced,
|
||||
\ 'source__is_installed': isdirectory(val.path),
|
||||
\ 'is_multiline': 1,
|
||||
\ }
|
||||
\")
|
||||
\ } )
|
||||
|
||||
let max = max(map(copy(_), 'len(v:val.word)'))
|
||||
let max = max(map(copy(_), { _, val -> len(val.word) }))
|
||||
|
||||
call unite#print_source_message(
|
||||
\ '#: not sourced, X: not installed', self.name)
|
||||
@ -85,24 +85,10 @@ function! s:get_commit_status(plugin) abort
|
||||
return 'Not installed'
|
||||
endif
|
||||
|
||||
let type = dein#types#git#define()
|
||||
let cmd = type.get_revision_number_command(a:plugin)
|
||||
if cmd ==# ''
|
||||
let type = dein#util#_get_type(a:plugin.type)
|
||||
if !has_key(type, 'get_revision_number')
|
||||
return ''
|
||||
endif
|
||||
|
||||
let cwd = getcwd()
|
||||
try
|
||||
call dein#install#_cd(a:plugin.path)
|
||||
let output = dein#install#_system(cmd)
|
||||
finally
|
||||
call dein#install#_cd(cwd)
|
||||
endtry
|
||||
|
||||
if dein#install#_get_last_status()
|
||||
return printf('Error(%d) occurred when executing "%s"',
|
||||
\ dein#install#_get_last_status(), cmd)
|
||||
endif
|
||||
|
||||
return output
|
||||
return type.get_revision_number(a:plugin)
|
||||
endfunction
|
||||
|
@ -43,11 +43,11 @@ function! s:source.async_gather_candidates(args, context) abort
|
||||
let log = a:context.source__is_bang ?
|
||||
\ dein#install#_get_updates_log()
|
||||
\ : dein#install#_get_log()
|
||||
let candidates = map(copy(log[len(a:context.source__log):]), "{
|
||||
\ 'word' : (v:val =~# '^\\s*\\h\\w*://' ? ' -> diff URI' : v:val),
|
||||
\ 'kind' : (v:val =~# '^\\s*\\h\\w*://' ? 'uri' : 'word'),
|
||||
\ 'action__uri' : substitute(v:val, '^\\s\\+', '', ''),
|
||||
\ }")
|
||||
let candidates = map(copy(log[len(a:context.source__log):]), { _, val -> {
|
||||
\ 'word' : (val =~# '^\s*\h\w*://' ? ' -> diff URI' : val),
|
||||
\ 'kind' : (val =~# '^\s*\h\w*://' ? 'uri' : 'word'),
|
||||
\ 'action__uri' : substitute(val, '^\s\+', '', ''),
|
||||
\ } })
|
||||
let a:context.source__log = copy(log)
|
||||
return candidates
|
||||
endfunction
|
||||
|
@ -14,7 +14,10 @@ endfunction
|
||||
|
||||
function! s:start(args, options) abort
|
||||
let job = extend(copy(s:job), a:options)
|
||||
let job_options = {}
|
||||
let job_options = {
|
||||
\ 'stderr_buffered': v:false,
|
||||
\ 'stdout_buffered': v:false
|
||||
\ }
|
||||
if has_key(a:options, 'cwd')
|
||||
let job_options.cwd = a:options.cwd
|
||||
endif
|
||||
|
@ -118,12 +118,12 @@ 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")
|
||||
return globpath(base, '**/*.vim', v:true, v:true)
|
||||
endfunction
|
||||
|
||||
function! s:_global_vital_files() abort
|
||||
let pattern = 'autoload/vital/__*__/**/*.vim'
|
||||
return split(globpath(&runtimepath, pattern, 1), "\n")
|
||||
return globpath(&runtimepath, pattern, v:true, v:true)
|
||||
endfunction
|
||||
|
||||
function! s:_extract_files(pattern, files) abort
|
||||
|
@ -37,21 +37,18 @@ Write-Output "`" Required:"
|
||||
Write-Output "set runtimepath+=$InstallDir"
|
||||
Write-Output ""
|
||||
Write-Output "`" Required:"
|
||||
Write-Output "if dein#load_state('$PluginDir')"
|
||||
Write-Output " call dein#begin('$PluginDir')"
|
||||
Write-Output "call dein#begin('$PluginDir')"
|
||||
Write-Output ""
|
||||
Write-Output " `" Let dein manage dein"
|
||||
Write-Output " `" Required:"
|
||||
Write-Output " call dein#add('$InstallDir')"
|
||||
Write-Output "`" Let dein manage dein"
|
||||
Write-Output "`" Required:"
|
||||
Write-Output "call dein#add('$InstallDir')"
|
||||
Write-Output ""
|
||||
Write-Output " `" Add or remove your plugins here like this:"
|
||||
Write-Output " `"call dein#add('Shougo/neosnippet.vim')"
|
||||
Write-Output " `"call dein#add('Shougo/neosnippet-snippets')"
|
||||
Write-Output "`" Add or remove your plugins here like this:"
|
||||
Write-Output "`"call dein#add('Shougo/neosnippet.vim')"
|
||||
Write-Output "`"call dein#add('Shougo/neosnippet-snippets')"
|
||||
Write-Output ""
|
||||
Write-Output " `" Required:"
|
||||
Write-Output " call dein#end()"
|
||||
Write-Output " call dein#save_state()"
|
||||
Write-Output "endif"
|
||||
Write-Output "`" Required:"
|
||||
Write-Output "call dein#end()"
|
||||
Write-Output ""
|
||||
Write-Output "`" Required:"
|
||||
Write-Output "filetype plugin indent on"
|
||||
|
@ -3,6 +3,8 @@
|
||||
# Original version is created by shoma2da
|
||||
# https://github.com/shoma2da/neobundle_installer
|
||||
|
||||
set -e
|
||||
|
||||
if [ $# -ne 1 ]; then
|
||||
echo "You must specify the installation directory!"
|
||||
exit 1
|
||||
@ -51,21 +53,18 @@ echo "Please add the following settings for dein to the top of your vimrc (Vim)
|
||||
echo "set runtimepath+=$INSTALL_DIR"
|
||||
echo ""
|
||||
echo "\" Required:"
|
||||
echo "if dein#load_state('$PLUGIN_DIR')"
|
||||
echo " call dein#begin('$PLUGIN_DIR')"
|
||||
echo "call dein#begin('$PLUGIN_DIR')"
|
||||
echo ""
|
||||
echo " \" Let dein manage dein"
|
||||
echo " \" Required:"
|
||||
echo " call dein#add('$INSTALL_DIR')"
|
||||
echo "\" Let dein manage dein"
|
||||
echo "\" Required:"
|
||||
echo "call dein#add('$INSTALL_DIR')"
|
||||
echo ""
|
||||
echo " \" Add or remove your plugins here like this:"
|
||||
echo " \"call dein#add('Shougo/neosnippet.vim')"
|
||||
echo " \"call dein#add('Shougo/neosnippet-snippets')"
|
||||
echo "\" Add or remove your plugins here like this:"
|
||||
echo "\"call dein#add('Shougo/neosnippet.vim')"
|
||||
echo "\"call dein#add('Shougo/neosnippet-snippets')"
|
||||
echo ""
|
||||
echo " \" Required:"
|
||||
echo " call dein#end()"
|
||||
echo " call dein#save_state()"
|
||||
echo "endif"
|
||||
echo "\" Required:"
|
||||
echo "call dein#end()"
|
||||
echo ""
|
||||
echo "\" Required:"
|
||||
echo "filetype plugin indent on"
|
||||
|
@ -1,6 +1,6 @@
|
||||
*dein.txt* Dark powered Vim/Neovim plugin manager
|
||||
|
||||
Version: 2.1
|
||||
Version: 3.0
|
||||
Author: Shougo <Shougo.Matsu at gmail.com>
|
||||
License: MIT license
|
||||
|
||||
@ -18,6 +18,7 @@ Interface |dein-interface|
|
||||
Unite Sources |dein-unite-sources|
|
||||
Denite Sources |dein-denite-sources|
|
||||
Configuration Examples |dein-examples|
|
||||
Plugins merged feature |dein-merge|
|
||||
FAQ |dein-faq|
|
||||
Compatibility |dein-compatibility|
|
||||
|
||||
@ -67,10 +68,11 @@ Note: The plugins are not updated automatically.
|
||||
INSTALL *dein-install*
|
||||
|
||||
Requirements:
|
||||
* Vim 8.0 or above or NeoVim.
|
||||
* Vim 8.2+ or NeoVim 0.5+.
|
||||
* "git" command in $PATH (if you want to install github or vim.org plugins)
|
||||
|
||||
Note: If you use Vim 7.4, please use dein.vim ver.1.5 instead.
|
||||
Note: If you use below Vim 8.2 or neovim 0.5, please use dein.vim ver.2.2
|
||||
instead.
|
||||
|
||||
First of all, git clone the repository.
|
||||
|
||||
@ -180,7 +182,6 @@ dein#check_update([{force}[, {plugins}]])
|
||||
|dein#check_install()|.
|
||||
Note: You need to set |g:dein#install_github_api_token| to use
|
||||
the feature.
|
||||
Note: |+python3| or |strptime()| is required.
|
||||
Note: The update check is quick but it is not perfect
|
||||
solution. If "git" command change ".git" directory status(for
|
||||
example: "git reset"), it cannot detect the update properly.
|
||||
@ -230,6 +231,8 @@ dein#disable({plugins})
|
||||
{plugins} is the plugins name list.
|
||||
Note: This command must be executed before dein loads
|
||||
the plugins.
|
||||
Note: Disabled plugins are removed from dein's plugin list.
|
||||
You cannot get disabled plugins from dein.
|
||||
|
||||
*dein#each()*
|
||||
dein#each({command}[, {plugins}])
|
||||
@ -274,6 +277,10 @@ dein#install([{plugins}])
|
||||
{plugins} is the plugins name list.
|
||||
If you omit it, dein will install all plugins.
|
||||
|
||||
*dein#is_available()*
|
||||
dein#is_available([{plugin-name}])
|
||||
Return non-zero if {plugin-name} exists and is enabled.
|
||||
|
||||
*dein#is_sourced()*
|
||||
dein#is_sourced({plugin-name})
|
||||
Return non-zero if {plugin-name} exists and is sourced.
|
||||
@ -297,21 +304,22 @@ dein#load_rollback({rollbackfile}[, {plugins}])
|
||||
Note: It is the dangerous command.
|
||||
|
||||
*dein#load_state()*
|
||||
*dein#min#load_state()*
|
||||
dein#load_state({base-path})
|
||||
Load dein's state from the cache script,
|
||||
which is located in `dein#util#_get_runtime_path() . '/state_'
|
||||
. fnamemodify(v:progname, ':r') . '.vim'`.
|
||||
{base-path} is where your downloaded plugins will be placed.
|
||||
dein#min#load_state({base-path})
|
||||
Load dein's state from the cache script, {base-path} is where
|
||||
your downloaded plugins will be placed.
|
||||
Note: You must call it before |dein#begin()|. It clears dein
|
||||
all configuration.
|
||||
Note: It overwrites your 'runtimepath' completely, you must
|
||||
not call it after change 'runtimepath' dynamically.
|
||||
Note: The block is skipped if dein's state is loaded.
|
||||
Note: |dein#min#load_state()| is faster a bit.
|
||||
|
||||
It returns 1, if the cache script is old or invalid or not
|
||||
found.
|
||||
>
|
||||
if dein#load_state(path)
|
||||
if dein#min#load_state(path)
|
||||
call dein#begin(path)
|
||||
" My plugins here:
|
||||
" ...
|
||||
@ -354,6 +362,11 @@ dein#local({directory}, [{options}, [{names}]])
|
||||
call dein#local("~/.vim/bundle", {},
|
||||
\ ['plugin1', 'plugin2', 'vim-*', '*.vim'])
|
||||
<
|
||||
*dein#toml#syntax()*
|
||||
dein#toml#syntax()
|
||||
Enable dein specific toml syntax.
|
||||
Note: It is experimental feature.
|
||||
|
||||
*dein#update()*
|
||||
dein#update([{plugins}])
|
||||
Install/Update the plugins.
|
||||
@ -425,6 +438,7 @@ dein#source([{plugins}])
|
||||
|:source| the plugins specified by {plugins}.
|
||||
{plugins} is the plugins name list.
|
||||
If you omit it, dein will source all plugins.
|
||||
It returns sourced plugins list.
|
||||
|
||||
*dein#tap()*
|
||||
dein#tap({plugin-name})
|
||||
@ -439,8 +453,9 @@ VARIABLES *dein-variables*
|
||||
g:dein#auto_recache
|
||||
If you set it to 1, call |dein#recache_runtimepath()|
|
||||
automatically in |dein#save_state()|.
|
||||
Note: It is slow especially Windows.
|
||||
|
||||
Default: 0
|
||||
Default: v:false
|
||||
|
||||
*g:dein#cache_directory*
|
||||
g:dein#cache_directory
|
||||
@ -468,32 +483,45 @@ g:dein#enable_name_conversion
|
||||
|dein-options-normalized_name| is used as plugin name.
|
||||
It is useful for absorbing difference of repository name.
|
||||
|
||||
Defaults: "0"
|
||||
Defaults: v:false
|
||||
|
||||
*g:dein#enable_notification*
|
||||
g:dein#enable_notification
|
||||
If you set it to 1, dein uses the notification feature.
|
||||
You need the following commands to use it.
|
||||
|
||||
In Windows: "Snarl" and "Snarl_CMD" commands
|
||||
http://snarl.fullphat.net/
|
||||
https://www.tlhan-ghun.de/projects/snarl-command-line-tools/snarl_cmd-exe/
|
||||
In neovim: "nvim-notify"
|
||||
https://github.com/rcarriga/nvim-notify
|
||||
Note: This is experimental.
|
||||
|
||||
In Windows: "notify-send for Windows"
|
||||
http://vaskovsky.net/notify-send/
|
||||
https://github.com/vaskovsky/notify-send
|
||||
|
||||
In Mac: "terminal-notifier" or "osascript" command
|
||||
https://github.com/julienXX/terminal-notifier
|
||||
https://github.com/julienXX/terminal-notifier
|
||||
Note: "reattach-to-user-namespace" command is needed in tmux.
|
||||
|
||||
In Linux: "notify-send" command
|
||||
|
||||
Defaults: "0"
|
||||
Defaults: v:false
|
||||
|
||||
*g:dein#inline_vimrcs*
|
||||
g:dein#inline_vimrcs
|
||||
The vimrcs are sourced in |dein#end()| or
|
||||
|dein#load_state()|.
|
||||
Note: It must be set before |dein#begin()|.
|
||||
Note: The files must not be included "<<" pattern(here
|
||||
document). It breaks the parser.
|
||||
|
||||
Defaults: []
|
||||
|
||||
*g:dein#install_check_diff*
|
||||
g:dein#install_check_diff
|
||||
It checks plugins documentation diff when updated plugins.
|
||||
|
||||
Defaults: v:false
|
||||
|
||||
*g:dein#install_github_api_token*
|
||||
g:dein#install_github_api_token
|
||||
github API key to use |dein#check_update()|.
|
||||
@ -507,7 +535,7 @@ g:dein#install_max_processes
|
||||
asynchronous update.
|
||||
If it is less than equal 1, this feature is disabled.
|
||||
|
||||
Defaults: "8"
|
||||
Defaults: "16"(Windows) or "8"(Others)
|
||||
|
||||
*g:dein#install_process_timeout*
|
||||
g:dein#install_process_timeout
|
||||
@ -553,8 +581,10 @@ g:dein#install_log_filename
|
||||
g:dein#lazy_rplugins
|
||||
If you set it to 1, neovim remote plugins are lazy loaded.
|
||||
It is useful to save startup time.
|
||||
Note: It disables all remote plugins at startup. You must
|
||||
define all remote plugins as lazy loaded if it is enabled.
|
||||
|
||||
Defaults: "0"
|
||||
Defaults: v:false
|
||||
|
||||
*g:dein#name*
|
||||
g:dein#name
|
||||
@ -564,7 +594,7 @@ g:dein#name
|
||||
|
||||
*g:dein#notification_icon*
|
||||
g:dein#notification_icon
|
||||
The notification icon path.
|
||||
The notification icon path or stocked icon to display.
|
||||
|
||||
Default: ""
|
||||
|
||||
@ -594,6 +624,12 @@ g:dein#types#git#command_path
|
||||
|
||||
Default: "git"
|
||||
|
||||
*g:dein#types#git#default_hub_site*
|
||||
g:dein#types#git#default_hub_site
|
||||
The default hub site used for git type.
|
||||
|
||||
Default: "github.com"
|
||||
|
||||
*g:dein#types#git#default_protocol*
|
||||
g:dein#types#git#default_protocol
|
||||
The default protocol used for git (github).
|
||||
@ -635,6 +671,7 @@ build (String)
|
||||
\ 'build':
|
||||
\ 'sh -c "cd ruby/command-t && ruby extconf.rb && make"'
|
||||
\ })
|
||||
<
|
||||
*dein-options-depends*
|
||||
depends (List or String)
|
||||
Specify a list of plugins a plugin depends on.
|
||||
@ -651,13 +688,16 @@ frozen (Bool)
|
||||
ftplugin (Dictionary)
|
||||
"_" key is executed after all ftplugin.
|
||||
"{filetype}" key is executed {filetype} ftplugin.
|
||||
Note: You need to call |dein#recache_runtimepath()| or enable
|
||||
|g:dein#auto_recache| after vimrc is changed.
|
||||
|
||||
*dein-options-if*
|
||||
if (Bool) or (String)
|
||||
If set to v:false, dein doesn't register the plugin, i.e. the
|
||||
plugin will be disabled.
|
||||
If it is String, dein will eval it.
|
||||
If set to |v:false|, dein doesn't load the plugin.
|
||||
If it is |String|, dein will eval it.
|
||||
If you don't set it, dein will register (enable) the plugin.
|
||||
Note: You cannot disable plugins register in dein if you use
|
||||
the option.
|
||||
|
||||
*dein-options-lazy*
|
||||
lazy (Bool)
|
||||
@ -675,6 +715,13 @@ merged (Bool)
|
||||
If set to v:false, dein doesn't merge the plugin directory.
|
||||
It is useful for the plugin files conflicts.
|
||||
|
||||
*dein-options-merge_ftdetect*
|
||||
merge_ftdetect (Bool)
|
||||
If set to v:true, dein merge the plugin "ftdetect" directory.
|
||||
It is useful to enable file detection when lazy loaded plugin.
|
||||
Note: It does not work if ftdetect script depends on lazy
|
||||
plugin functions.
|
||||
|
||||
*dein-options-name*
|
||||
name (String)
|
||||
Specify the name of the plugin. This is used for dein
|
||||
@ -718,20 +765,6 @@ on_ft (List) or (String)
|
||||
If it is matched to 'filetype', dein will call
|
||||
|dein#source()|.
|
||||
|
||||
*dein-options-on_i*
|
||||
on_i (Bool)
|
||||
If set to v:true, dein will call |dein#source()| on
|
||||
|InsertEnter| autocmd.
|
||||
Note: This is deprecated option. You should use
|
||||
|dein-options-on_event| instead.
|
||||
|
||||
*dein-options-on_idle*
|
||||
on_idle (Bool)
|
||||
If set to v:true, dein will call |dein#source()| on
|
||||
|FocusLost| or |CursorHold| autocmd.
|
||||
Note: This is deprecated option. You should use
|
||||
|dein-options-on_event| instead.
|
||||
|
||||
*dein-options-on_if*
|
||||
on_if (String)
|
||||
If it is evaluated and it is non-zero, dein will call
|
||||
@ -750,6 +783,7 @@ on_lua (List) or (String)
|
||||
If it is matched to the required lua module root, dein will
|
||||
call |dein#source()|.
|
||||
Note: It is for neovim only.
|
||||
Note: It does not work for neovim standard modules.
|
||||
|
||||
*dein-options-on_map*
|
||||
on_map (Dictionary) or (List) or (String)
|
||||
@ -766,11 +800,20 @@ on_map (Dictionary) or (List) or (String)
|
||||
\ { 'on_map': {'n': '<Plug>'} })
|
||||
<
|
||||
Note: You can use "<Plug>" keyword as {mapping}. If
|
||||
{mapping} is "<Plug>", "<Plug>(normalized_name" is
|
||||
{mapping} is "<Plug>", "<Plug>({normalized_name}" is
|
||||
used.
|
||||
For example: >
|
||||
" It is same as "'mappings': '<Plug>(anzu'
|
||||
" It is same as "'on_map': '<Plug>(anzu'"
|
||||
call dein#add('osyo-manga/vim-anzu', {'on_map': '<Plug>'})
|
||||
|
||||
" It is same as "'on_map': '<Plug>(easy-align'"
|
||||
" But it does not work as expected. Because the plugin
|
||||
" defines '<Plug>(EasyAlign)' mapping instead.
|
||||
call dein#add('junegunn/vim-easy-align', {'on_map': '<Plug>'})
|
||||
|
||||
" This works as expected
|
||||
call dein#add('junegunn/vim-easy-align',
|
||||
\ {'on_map': '<Plug>(EasyAlign)'})
|
||||
<
|
||||
Note: You cannot use lazy <Plug> mappings twice.
|
||||
For example: >
|
||||
@ -894,7 +937,7 @@ hook_add (String) or (Function)
|
||||
Because the plugin is not sourced when "hook_add".
|
||||
>
|
||||
call dein#add('Shougo/defx.nvim', {
|
||||
\ 'hook_add': 'nnoremap <silent> [Space]v
|
||||
\ 'hook_add': 'nnoremap <silent> <Space>v
|
||||
\ :<C-u>Defx<CR>'
|
||||
\ })
|
||||
call dein#add('kana/vim-niceblock', {
|
||||
@ -910,7 +953,9 @@ hook_add (String) or (Function)
|
||||
<
|
||||
*dein-options-hook_done_update*
|
||||
hook_done_update (String) or (Function)
|
||||
It is executed after the all plugins are updated.
|
||||
It is executed after are updated and before
|
||||
|dein-options-build|.
|
||||
Note: The plugin may not be sourced.
|
||||
|
||||
*dein-options-hook_post_source*
|
||||
hook_post_source (String) or (Function)
|
||||
@ -923,7 +968,7 @@ hook_post_source (String) or (Function)
|
||||
<
|
||||
*dein-options-hook_post_update*
|
||||
hook_post_update (String) or (Function)
|
||||
It is executed after the plugins are updated.
|
||||
It is executed after plugins are sourced and updated.
|
||||
|
||||
*dein-options-hook_source*
|
||||
hook_source (String) or (Function)
|
||||
@ -964,6 +1009,8 @@ TOML *dein-toml*
|
||||
"{filetype}" key is executed {filetype} ftplugin.
|
||||
You can define multiple filetypes by "{filetype1}_{filetype2}"
|
||||
key. "b:undo_ftplugin" is defined automatically.
|
||||
Note: You need to call |dein#recache_runtimepath()| or enable
|
||||
|g:dein#auto_recache| after vimrc is changed.
|
||||
|
||||
*dein-toml-hook_add*
|
||||
hook_add (String)
|
||||
@ -975,6 +1022,11 @@ TOML *dein-toml*
|
||||
It is converted to |dein#add()|.
|
||||
"repo" key is needed.
|
||||
|
||||
*dein-toml-multple_plugins*
|
||||
multiple_plugins (Dictionary)
|
||||
It is converted to |dein-toml-hook_add|.
|
||||
"plugins" key is needed.
|
||||
|
||||
*dein-toml-example*
|
||||
|
||||
TOML file sample is here:
|
||||
@ -1008,12 +1060,18 @@ TOML *dein-toml*
|
||||
python = '''
|
||||
let b:undo_ftplugin .= 'setlocal foldmethod<'
|
||||
setlocal foldmethod=indent
|
||||
|
||||
# "hook_add" is only executed when both "foo" and "bar" are
|
||||
# available.
|
||||
[[multiple_plugins]]
|
||||
plugins = ['foo', 'bar']
|
||||
hook_add = ''
|
||||
'''
|
||||
|
||||
==============================================================================
|
||||
UNITE SOURCES *dein-unite-sources*
|
||||
|
||||
Here let me explain about a source for |unite| provided in dein.
|
||||
Here let me explain about a source for unite plugin provided in dein.
|
||||
|
||||
*dein-unite-source-dein*
|
||||
dein
|
||||
@ -1035,7 +1093,7 @@ dein_log
|
||||
==============================================================================
|
||||
DENITE SOURCES *dein-denite-sources*
|
||||
|
||||
Here let me explain about a source for |denite| provided in dein.
|
||||
Here let me explain about a source for denite plugin provided in dein.
|
||||
|
||||
*dein-denite-source-dein*
|
||||
dein
|
||||
@ -1055,37 +1113,69 @@ dein/log
|
||||
EXAMPLES *dein-examples*
|
||||
>
|
||||
if &compatible
|
||||
set nocompatible
|
||||
set nocompatible " Be iMproved
|
||||
endif
|
||||
|
||||
" Required:
|
||||
set runtimepath+={path to dein.vim directory}
|
||||
|
||||
if dein#load_state({path to plugin base path directory})
|
||||
call dein#begin({path to plugin base path directory})
|
||||
" Required:
|
||||
call dein#begin({path to plugin base path directory})
|
||||
|
||||
call dein#add({path to dein.vim directory})
|
||||
call dein#add('Shougo/deoplete.nvim')
|
||||
if !has('nvim')
|
||||
call dein#add('roxma/nvim-yarp')
|
||||
call dein#add('roxma/vim-hug-neovim-rpc')
|
||||
endif
|
||||
...
|
||||
|
||||
call dein#end()
|
||||
call dein#save_state()
|
||||
" Let dein manage dein
|
||||
call dein#add({path to dein.vim directory})
|
||||
if !has('nvim')
|
||||
call dein#add('roxma/nvim-yarp')
|
||||
call dein#add('roxma/vim-hug-neovim-rpc')
|
||||
endif
|
||||
|
||||
" Add or remove your plugins here like this:
|
||||
"call dein#add('Shougo/neosnippet.vim')
|
||||
"call dein#add('Shougo/neosnippet-snippets')
|
||||
|
||||
" Required:
|
||||
call dein#end()
|
||||
|
||||
" Required:
|
||||
filetype plugin indent on
|
||||
syntax enable
|
||||
|
||||
" If you want to install not installed plugins on startup.
|
||||
"if dein#check_install()
|
||||
" call dein#install()
|
||||
"endif
|
||||
<
|
||||
==============================================================================
|
||||
PLUGINS MERGED FEATURE *dein-merge*
|
||||
|
||||
dein.vim copies the files of multiple plugins into a single directory and
|
||||
loads them as plugins by default. It expects to improve performance.
|
||||
|
||||
That path is usually `DEIN_INSTALLED_DIR/.cache/init.vim/.dein`.
|
||||
For DEIN_INSTALLED_DIR, see |dein-install|.
|
||||
|
||||
Other plugin managers add a plugin path into 'runtimepath' to load external
|
||||
plugins. However, if the 'runtimepath' is very large then it will load
|
||||
slowly. This is because Vim needs to find and load all 'runtimepath' to load
|
||||
plugins. In dein.vim, this problem does not exist.
|
||||
|
||||
The following plugins will not be merged to prevent merge problems
|
||||
- |dein-options-merged| is v:false
|
||||
- local plugin (|dein#local()|)
|
||||
- lazy loaded plugin (|dein-options-lazy|)
|
||||
- uses |dein-options-build|
|
||||
- uses |dein-options-hook_post_update|
|
||||
- uses |dein-options-if|
|
||||
|
||||
==============================================================================
|
||||
FAQ *dein-faq*
|
||||
|
||||
Q: How to donate money to you?
|
||||
|
||||
A: I don't get the donation, but if you want to donate, please support neovim
|
||||
project. My plugins depends on neovim development.
|
||||
A: I have started github sponsorship to spend more time for Vim/neovim
|
||||
plugins. You can donate money to help me!
|
||||
|
||||
https://salt.bountysource.com/teams/neovim
|
||||
https://github.com/sponsors/Shougo
|
||||
|
||||
Q: Where is ":NeoBundleFetch" in dein features?
|
||||
|
||||
@ -1110,7 +1200,7 @@ A: You can use |dein#check_install()|.
|
||||
call dein#install()
|
||||
endif
|
||||
<
|
||||
Q: I want to disable plugins.
|
||||
Q: I want to disable plugins loading dynamically.
|
||||
|
||||
A: Please use |dein-options-if|.
|
||||
|
||||
@ -1133,15 +1223,15 @@ Or you can use |dein#source()| for it.
|
||||
Q: There is the conflict between "jedi-vim" and "vim-pyenv" "initialize.py"
|
||||
file.
|
||||
|
||||
A: It is the plugins problem. The plugins should not create the conflited
|
||||
name file. But you can avoid the problem by |dein-options-merged|.
|
||||
A: All plugins should avoid file name collisions. dein.vim can load them
|
||||
by setting |dein-options-merged|. See |dein-merge| for details.
|
||||
|
||||
Q: How to remove the disabled plugins?
|
||||
|
||||
A: You can remove them like below.
|
||||
Note: You must call |dein#recache_runtimepath()| after the remove.
|
||||
>
|
||||
call map(dein#check_clean(), "delete(v:val, 'rf')")
|
||||
call map(dein#check_clean(), { _, val -> delete(val, 'rf') })
|
||||
call dein#recache_runtimepath()
|
||||
<
|
||||
Q: How to use the script functions for hooks feature?
|
||||
@ -1203,9 +1293,10 @@ If you have found "Process timeout" error, you should increase
|
||||
|
||||
Q: YouCompleteMe does not work. I have built YouCompleteMe manually.
|
||||
|
||||
A: dein.vim has merge feature. It copys the plugins into the merge directory.
|
||||
So dein.vim does not know the manually built binary. It does not be copied.
|
||||
You should disable the merge feature manually. >
|
||||
A: dein.vim has |dein-merge| feature. It copies the plugin files into the
|
||||
merge directory. If you build it manually, it will not be copied
|
||||
from time to time.
|
||||
You can disable the |dein-options-merged|. >
|
||||
call dein#add('Valloric/YouCompleteMe', {'merged': 0})
|
||||
|
||||
or >
|
||||
@ -1217,9 +1308,9 @@ A: It is Vim/neovim |delete()| implementation bug.
|
||||
It uses |glob()| internally.
|
||||
If the directory has contains "[]" files, it will be errored.
|
||||
For example, vimtex has the file.
|
||||
https://github.com/lervag/vimtex/tree/master/test/issues/237/
|
||||
https://github.com/lervag/vimtex/issues/237
|
||||
|
||||
You can disable the merge feature to prevent the error. >
|
||||
You can disable the |dein-merge| feature to prevent the error. >
|
||||
call dein#add('lervag/vimtex', {'merged': 0})
|
||||
|
||||
|
||||
@ -1230,8 +1321,8 @@ repository.
|
||||
|
||||
Q: Why dein.vim merges the plugins directories automatically?
|
||||
|
||||
A: To avoid long 'runtimepath'. If 'runtimepath' is long, Vim/neovim loading
|
||||
performance will be bad.
|
||||
A: |dein-merge| merge improves performance by avoiding long 'runtimepath'.
|
||||
See also the |dein-merge|.
|
||||
|
||||
Q: I want to update from shell.
|
||||
|
||||
@ -1288,20 +1379,51 @@ plugins?
|
||||
https://github.com/Shougo/dein.vim/issues/357
|
||||
|
||||
A: You can use |g:dein#auto_recache| option instead.
|
||||
Dein.vim has merge feature. It copys the plugins into the merge directory.
|
||||
You can disable the feature by |dein-options-merged|. It is like other plugin
|
||||
managers behavior.
|
||||
Why dein.vim has the feature? It is for loading performance.
|
||||
Other plugin manager adds 'runtimepath' to load external plugins.
|
||||
But if 'runtimepath' is very big, plugin loading is slower. Because Vim needs
|
||||
to search all huge 'runtimepath' to load it. Dein.vim has not the problem.
|
||||
Dein.vim has |dein-merge| feature. It copies the plugins into the
|
||||
merge directory. You can disable the feature by setting
|
||||
|dein-options-merged|. See also the |dein-merge|.
|
||||
|
||||
Q: I want to load plugins lazily on requiring lua modules
|
||||
A: >
|
||||
call dein#add('neovim/nvim-lsp', {'on_lua': 'nvim_lsp'})
|
||||
|
||||
Q: deoplete does not work when I use |dein#load_state()|.
|
||||
|
||||
A: Please read |dein#load_state()| documentation. "The block is skipped if
|
||||
dein's state is loaded." >
|
||||
|
||||
if dein#load_state(path)
|
||||
call dein#begin(path)
|
||||
call dein#add('Shougo/deoplete.nvim')
|
||||
let g:deoplete#enable_at_startup = v:true " It will be skipped!
|
||||
call dein#end()
|
||||
call dein#save_state()
|
||||
endif
|
||||
|
||||
" You must set variables or execute functions outside the block
|
||||
let g:deoplete#enable_at_startup = v:true
|
||||
|
||||
Q: I want to enable default merged config in Windows.
|
||||
|
||||
A: >
|
||||
let g:dein#default_options = { 'merged': v:true }
|
||||
|
||||
==============================================================================
|
||||
COMPATIBILITY *dein-compatibility*
|
||||
|
||||
2021.09.20
|
||||
* Remove "dein-options-on_i".
|
||||
* Remove "dein-options-on_idle".
|
||||
|
||||
2021.09.18
|
||||
* hook_post_update is executed before "build".
|
||||
* hook_done_update is executed after "build" and sourced.
|
||||
|
||||
2021.08.28
|
||||
* Change dein#source() return value
|
||||
|
||||
2021.08.26
|
||||
* Vim 8.2 or nvim 0.5 is required
|
||||
|
||||
==============================================================================
|
||||
vim:tw=78:ts=8:ft=help:norl:noet:fen:
|
||||
|
@ -6,7 +6,7 @@ let s:assert = themis#helper('assert')
|
||||
let s:path = tempname()
|
||||
|
||||
function! s:suite.before_each() abort
|
||||
call dein#_init()
|
||||
call dein#min#_init()
|
||||
endfunction
|
||||
|
||||
function! s:suite.block_normal() abort
|
||||
@ -21,7 +21,7 @@ function! s:suite.begin_invalid() abort
|
||||
call s:assert.equals(dein#begin(s:path), 0)
|
||||
call s:assert.equals(dein#begin(s:path), 1)
|
||||
|
||||
call dein#_init()
|
||||
call dein#min#_init()
|
||||
call s:assert.equals(dein#end(), 1)
|
||||
|
||||
call s:assert.equals(dein#end(), 1)
|
||||
|
@ -13,10 +13,7 @@ let s:filetype_save = &l:filetype
|
||||
let s:this_script = fnamemodify(expand('<sfile>'), ':p')
|
||||
|
||||
|
||||
let s:merged_format = "{'repo': v:val.repo, 'rev': get(v:val, 'rev', '')}"
|
||||
|
||||
function! s:dein_install() abort
|
||||
call dein#util#_save_merged_plugins()
|
||||
return dein#install#_update([], 'install', 0)
|
||||
endfunction
|
||||
|
||||
@ -25,18 +22,18 @@ function! s:dein_update() abort
|
||||
endfunction
|
||||
|
||||
function! s:suite.before_each() abort
|
||||
call dein#_init()
|
||||
call dein#min#_init()
|
||||
let &runtimepath = s:runtimepath_save
|
||||
let &l:filetype = s:filetype_save
|
||||
let g:temp = tempname()
|
||||
let g:dein#install_progress_type = 'echo'
|
||||
let g:dein#enable_notification = 0
|
||||
let g:dein#enable_notification = v:false
|
||||
endfunction
|
||||
|
||||
" Note: It must be checked in the first
|
||||
function! s:suite.install() abort
|
||||
let g:dein#install_progress_type = 'title'
|
||||
let g:dein#enable_notification = 1
|
||||
let g:dein#enable_notification = v:true
|
||||
|
||||
call dein#begin(s:path)
|
||||
|
||||
@ -54,9 +51,6 @@ function! s:suite.install() abort
|
||||
let plugin = dein#get('deoplete.nvim')
|
||||
call s:assert.true(isdirectory(plugin.rtp))
|
||||
call s:assert.equals(dein#each('git gc'), 0)
|
||||
|
||||
call s:assert.equals(dein#util#_get_merged_plugins(),
|
||||
\ dein#util#_load_merged_plugins())
|
||||
endfunction
|
||||
|
||||
function! s:suite.tap() abort
|
||||
@ -168,17 +162,7 @@ function! s:suite.if() abort
|
||||
call dein#begin(s:path)
|
||||
|
||||
call dein#add('Shougo/deoplete.nvim', {'if': 0, 'on_cmd': 'FooBar'})
|
||||
|
||||
call s:assert.equals(dein#get('deoplete.nvim'), {})
|
||||
call s:assert.false(exists(':FooBar'))
|
||||
|
||||
call dein#end()
|
||||
|
||||
call dein#begin(s:path)
|
||||
|
||||
call dein#add('Shougo/deoplete.nvim', {'if': '1+1'})
|
||||
|
||||
call s:assert.equals(dein#get('deoplete.nvim').if, 2)
|
||||
call s:assert.equals(dein#get('deoplete.nvim').if, 0)
|
||||
|
||||
call dein#end()
|
||||
endfunction
|
||||
@ -196,27 +180,14 @@ function! s:suite.lazy_manual() abort
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin.rtp })), 0)
|
||||
|
||||
call s:assert.equals(dein#source(['deoplete.nvim']), 0)
|
||||
call s:assert.equals(len(dein#source(['deoplete.nvim'])), 1)
|
||||
|
||||
call s:assert.equals(plugin.sourced, 1)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 1)
|
||||
endfunction
|
||||
|
||||
function! s:suite.lazy_on_i() abort
|
||||
call dein#begin(s:path)
|
||||
|
||||
call dein#add('Shougo/deoplete.nvim', { 'on_i': 1 })
|
||||
|
||||
call s:assert.equals(s:dein_install(), 0)
|
||||
|
||||
call dein#end()
|
||||
|
||||
call s:assert.equals(g:dein#_event_plugins,
|
||||
\ {'InsertEnter': ['deoplete.nvim']})
|
||||
\ { _, val -> val ==# plugin.rtp })), 1)
|
||||
endfunction
|
||||
|
||||
function! s:suite.lazy_on_ft() abort
|
||||
@ -232,20 +203,20 @@ function! s:suite.lazy_on_ft() abort
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin.rtp })), 0)
|
||||
|
||||
set filetype=c
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin.rtp })), 0)
|
||||
|
||||
set filetype=cpp
|
||||
|
||||
call s:assert.equals(plugin.sourced, 1)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 1)
|
||||
\ { _, val -> val ==# plugin.rtp })), 1)
|
||||
endfunction
|
||||
|
||||
function! s:suite.lazy_on_path() abort
|
||||
@ -261,14 +232,14 @@ function! s:suite.lazy_on_path() abort
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin.rtp })), 0)
|
||||
|
||||
execute 'edit' tempname()
|
||||
|
||||
call s:assert.equals(plugin.sourced, 1)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 1)
|
||||
\ { _, val -> val ==# plugin.rtp })), 1)
|
||||
endfunction
|
||||
|
||||
function! s:suite.lazy_on_if() abort
|
||||
@ -276,7 +247,7 @@ function! s:suite.lazy_on_if() abort
|
||||
|
||||
let temp = tempname()
|
||||
call dein#add('Shougo/deol.nvim',
|
||||
\ { 'on_if': '&filetype ==# "foobar"' })
|
||||
\ { 'on_if': '&l:filetype ==# "foobar"' })
|
||||
|
||||
call s:assert.equals(s:dein_install(), 0)
|
||||
|
||||
@ -286,7 +257,7 @@ function! s:suite.lazy_on_if() abort
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin.rtp })), 0)
|
||||
|
||||
set filetype=foobar
|
||||
|
||||
@ -294,7 +265,7 @@ function! s:suite.lazy_on_if() abort
|
||||
call s:assert.equals(plugin.sourced, 1)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 1)
|
||||
\ { _, val -> val ==# plugin.rtp })), 1)
|
||||
endfunction
|
||||
|
||||
function! s:suite.lazy_on_source() abort
|
||||
@ -312,14 +283,14 @@ function! s:suite.lazy_on_source() abort
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin.rtp })), 0)
|
||||
|
||||
call dein#source('deol.nvim')
|
||||
|
||||
call s:assert.equals(plugin.sourced, 1)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 1)
|
||||
\ { _, val -> val ==# plugin.rtp })), 1)
|
||||
endfunction
|
||||
|
||||
function! s:suite.lazy_on_func() abort
|
||||
@ -338,26 +309,26 @@ function! s:suite.lazy_on_func() abort
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin.rtp })), 0)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin2.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin2.rtp })), 0)
|
||||
|
||||
call dein#autoload#_on_func('deoplete#initialize')
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 1)
|
||||
\ { _, val -> val ==# plugin.rtp })), 1)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin2.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin2.rtp })), 0)
|
||||
|
||||
call neosnippet#expandable()
|
||||
|
||||
call s:assert.equals(plugin.sourced, 1)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin2.rtp')), 1)
|
||||
\ { _, val -> val ==# plugin2.rtp })), 1)
|
||||
endfunction
|
||||
|
||||
function! s:suite.lazy_on_cmd() abort
|
||||
@ -374,7 +345,7 @@ function! s:suite.lazy_on_cmd() abort
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin.rtp })), 0)
|
||||
|
||||
NeoCompleteDisable
|
||||
|
||||
@ -396,7 +367,7 @@ function! s:suite.lazy_on_map() abort
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin1.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin1.rtp })), 0)
|
||||
|
||||
call dein#autoload#_on_map('', 'deol.nvim', 'n')
|
||||
call dein#autoload#_on_map('', 'neosnippet.vim', 'n')
|
||||
@ -405,7 +376,7 @@ function! s:suite.lazy_on_map() abort
|
||||
call s:assert.equals(plugin2.sourced, 1)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin1.rtp')), 1)
|
||||
\ { _, val -> val ==# plugin1.rtp })), 1)
|
||||
endfunction
|
||||
|
||||
function! s:suite.lazy_on_pre_cmd() abort
|
||||
@ -421,7 +392,7 @@ function! s:suite.lazy_on_pre_cmd() abort
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin.rtp })), 0)
|
||||
|
||||
call dein#autoload#_on_pre_cmd('Deol')
|
||||
|
||||
@ -429,58 +400,7 @@ function! s:suite.lazy_on_pre_cmd() abort
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 1)
|
||||
endfunction
|
||||
|
||||
if has('nvim-0.5')
|
||||
function! s:suite.lazy_on_lua() abort
|
||||
call dein#begin(s:path)
|
||||
|
||||
call dein#add('Shougo/deoplete.nvim', { 'on_lua': 'vim' })
|
||||
|
||||
call s:assert.equals(s:dein_install(), 0)
|
||||
|
||||
call dein#end()
|
||||
|
||||
let plugin = dein#get('deoplete.nvim')
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
|
||||
lua require'vim.highlight'
|
||||
|
||||
call s:assert.equals(plugin.sourced, 1)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 1)
|
||||
endfunction
|
||||
endif
|
||||
|
||||
function! s:suite.lazy_on_idle() abort
|
||||
call dein#begin(s:path)
|
||||
|
||||
call dein#add('Shougo/defx.nvim', { 'on_idle': 1})
|
||||
|
||||
call s:assert.equals(s:dein_install(), 0)
|
||||
|
||||
call dein#end()
|
||||
|
||||
call s:assert.equals(g:dein#_event_plugins,
|
||||
\ {'CursorHold': ['defx.nvim'], 'FocusLost': ['defx.nvim']})
|
||||
|
||||
let plugin = dein#get('defx.nvim')
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
|
||||
doautocmd CursorHold
|
||||
|
||||
call s:assert.equals(plugin.sourced, 1)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 1)
|
||||
\ { _, val -> val ==# plugin.rtp })), 1)
|
||||
endfunction
|
||||
|
||||
function! s:suite.depends() abort
|
||||
@ -497,7 +417,7 @@ function! s:suite.depends() abort
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 1)
|
||||
\ { _, val -> val ==# plugin.rtp })), 1)
|
||||
endfunction
|
||||
|
||||
function! s:suite.depends_lazy() abort
|
||||
@ -517,15 +437,15 @@ function! s:suite.depends_lazy() abort
|
||||
call s:assert.equals(isdirectory(plugin.rtp), 1)
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 0)
|
||||
\ { _, val -> val ==# plugin.rtp })), 0)
|
||||
|
||||
call s:assert.equals(dein#source(['deoplete.nvim']), 0)
|
||||
call s:assert.equals(len(dein#source(['deoplete.nvim'])), 2)
|
||||
|
||||
call s:assert.equals(plugin.sourced, 1)
|
||||
|
||||
call s:assert.equals(
|
||||
\ len(filter(dein#util#_split_rtp(&runtimepath),
|
||||
\ 'v:val ==# plugin.rtp')), 1)
|
||||
\ { _, val -> val ==# plugin.rtp })), 1)
|
||||
endfunction
|
||||
|
||||
function! s:suite.depends_error_lazy() abort
|
||||
@ -538,7 +458,7 @@ function! s:suite.depends_error_lazy() abort
|
||||
|
||||
call s:assert.equals(dein#end(), 0)
|
||||
|
||||
call s:assert.equals(dein#source(['deoplete.nvim']), 0)
|
||||
call s:assert.equals(len(dein#source(['deoplete.nvim'])), 0)
|
||||
|
||||
call dein#begin(s:path)
|
||||
|
||||
@ -550,7 +470,7 @@ function! s:suite.depends_error_lazy() abort
|
||||
|
||||
call s:assert.equals(dein#end(), 0)
|
||||
|
||||
call s:assert.equals(dein#source(['deoplete.nvim']), 0)
|
||||
call s:assert.equals(len(dein#source(['deoplete.nvim'])), 0)
|
||||
endfunction
|
||||
|
||||
function! s:suite.hooks() abort
|
||||
@ -683,15 +603,13 @@ function! s:suite.build() abort
|
||||
|
||||
call dein#add('Shougo/vimproc.vim', {
|
||||
\ 'build': 'make',
|
||||
\ 'hook_add':
|
||||
\ 'let g:foobar = 1',
|
||||
\ 'hook_post_update':
|
||||
\ 'let g:foobar = 4',
|
||||
\ })
|
||||
|
||||
call dein#end()
|
||||
|
||||
call s:assert.equals(g:foobar, 1)
|
||||
call s:assert.not_equals(g:foobar, 4)
|
||||
|
||||
call s:assert.true(dein#check_install())
|
||||
call s:assert.true(dein#check_install(['vimproc.vim']))
|
||||
|
@ -31,16 +31,3 @@ function! s:suite.copy_directories() abort
|
||||
call s:assert.true(filereadable(temp2.'/foo'))
|
||||
call s:assert.true(filereadable(temp2.'/bar'))
|
||||
endfunction
|
||||
|
||||
function! s:suite.args2string() abort
|
||||
call s:assert.equals(
|
||||
\ dein#install#_args2string_unix(['foo', 'bar']), "'foo' 'bar'")
|
||||
call s:assert.equals(
|
||||
\ dein#install#_args2string_windows([]), '')
|
||||
call s:assert.equals(
|
||||
\ dein#install#_args2string_windows(['foo']), 'foo')
|
||||
call s:assert.equals(
|
||||
\ dein#install#_args2string_windows(['foo', 'bar']), 'foo "bar"')
|
||||
call s:assert.equals(
|
||||
\ dein#install#_args2string_windows(['fo o', 'bar']), '"fo o" "bar"')
|
||||
endfunction
|
||||
|
@ -6,7 +6,7 @@ let s:assert = themis#helper('assert')
|
||||
let s:path = tempname()
|
||||
|
||||
function! s:suite.before_each() abort
|
||||
call dein#_init()
|
||||
call dein#min#_init()
|
||||
endfunction
|
||||
|
||||
function! s:suite.after_each() abort
|
||||
@ -41,7 +41,7 @@ function! s:suite.parse_dict() abort
|
||||
endfunction
|
||||
|
||||
function! s:suite.name_conversion() abort
|
||||
let g:dein#enable_name_conversion = 1
|
||||
let g:dein#enable_name_conversion = v:true
|
||||
|
||||
let plugin = dein#parse#_dict(
|
||||
\ {'repo': 'https://github.com/Shougo/dein.vim.git'})
|
||||
@ -60,7 +60,7 @@ function! s:suite.name_conversion() abort
|
||||
\ 'name': 'vim-qt-syntax'})
|
||||
call s:assert.equals(plugin.name, 'vim-qt-syntax')
|
||||
|
||||
let g:dein#enable_name_conversion = 0
|
||||
let g:dein#enable_name_conversion = v:false
|
||||
endfunction
|
||||
|
||||
function! s:suite.load_toml() abort
|
||||
@ -78,7 +78,6 @@ function! s:suite.load_toml() abort
|
||||
\ "on_map = '<Plug>'",
|
||||
\ '[[plugins]]',
|
||||
\ "repo = 'Shougo/neosnippet.vim'",
|
||||
\ 'on_i = 1',
|
||||
\ "on_ft = 'snippet'",
|
||||
\ "hook_add = '''",
|
||||
\ '"echo',
|
||||
@ -92,6 +91,9 @@ function! s:suite.load_toml() abort
|
||||
\ "'''",
|
||||
\ '[plugins.ftplugin]',
|
||||
\ 'c = "let g:bar = 0"',
|
||||
\ '[[multiple_plugins]]',
|
||||
\ "plugins = ['foo', 'bar']",
|
||||
\ "hook_add = 'foo'",
|
||||
\ ], toml)
|
||||
|
||||
call dein#begin(s:path)
|
||||
@ -101,11 +103,13 @@ function! s:suite.load_toml() abort
|
||||
call s:assert.equals(g:dein#_hook_add, "\nlet g:foo = 0")
|
||||
call s:assert.equals(g:dein#_ftplugin,
|
||||
\ {'c': "let g:bar = 0\nlet g:bar = 0"})
|
||||
call s:assert.equals(g:dein#_multiple_plugins, [
|
||||
\ {'plugins': ['foo', 'bar'], 'hook_add': 'foo'},
|
||||
\ ])
|
||||
call dein#end()
|
||||
|
||||
call s:assert.equals(dein#get('neosnippet.vim').on_i, 1)
|
||||
call s:assert.equals(dein#get('neosnippet.vim').hook_add,
|
||||
\ "\necho\n")
|
||||
\ "\"echo\n\"comment\necho\n")
|
||||
call s:assert.equals(dein#get('neosnippet.vim').hook_source,
|
||||
\ "echo\necho\n")
|
||||
endfunction
|
||||
@ -118,7 +122,6 @@ function! s:suite.error_toml() abort
|
||||
\ '# repository name is required.',
|
||||
\ "on_map = '<Plug>'",
|
||||
\ '[[plugins]]',
|
||||
\ 'on_i = 1',
|
||||
\ "on_ft = 'snippet'",
|
||||
\ ], toml)
|
||||
|
||||
@ -158,29 +161,29 @@ function! s:suite.config() abort
|
||||
\ 'Shougo/denite.nvim': {}
|
||||
\ })
|
||||
let g:dein#name = 'denite.nvim'
|
||||
call dein#config({'on_i': 1})
|
||||
call dein#config({'on_event': ['InsertEnter']})
|
||||
call dein#end()
|
||||
call dein#config('unite', {'on_i': 0})
|
||||
call dein#config('unite', {'on_event': ['InsertEnter']})
|
||||
|
||||
call s:assert.equals(dein#get('denite.nvim').on_i, 1)
|
||||
call s:assert.equals(dein#get('denite.nvim').on_event, ['InsertEnter'])
|
||||
endfunction
|
||||
|
||||
function! s:suite.skip_overwrite() abort
|
||||
call dein#begin(s:path)
|
||||
call dein#add('Shougo/denite.nvim', {'on_i': 0})
|
||||
call dein#add('Shougo/denite.nvim', {'on_i': 1})
|
||||
call dein#add('Shougo/denite.nvim', {'on_event': []})
|
||||
call dein#add('Shougo/denite.nvim', {'on_event': ['InsertEnter']})
|
||||
call dein#end()
|
||||
|
||||
call s:assert.equals(dein#get('denite.nvim').on_i, 0)
|
||||
call s:assert.equals(dein#get('denite.nvim').on_event, [])
|
||||
endfunction
|
||||
|
||||
function! s:suite.overwrite() abort
|
||||
call dein#begin(s:path)
|
||||
call dein#add('Shougo/denite.nvim', {'on_i': 0})
|
||||
call dein#add('Shougo/denite.nvim', {'on_i': 1, 'overwrite': 1})
|
||||
call dein#add('Shougo/denite.nvim', {'on_event': []})
|
||||
call dein#add('Shougo/denite.nvim', {'on_event': ['InsertEnter'], 'overwrite': 1})
|
||||
call dein#end()
|
||||
|
||||
call s:assert.equals(dein#get('denite.nvim').on_i, 1)
|
||||
call s:assert.equals(dein#get('denite.nvim').on_event, ['InsertEnter'])
|
||||
endfunction
|
||||
|
||||
function! s:suite.plugins2toml() abort
|
||||
|
@ -8,7 +8,7 @@ let s:path = fnamemodify('.cache', ':p') . '/'
|
||||
let s:filetype_save = &l:filetype
|
||||
|
||||
function! s:suite.before_each() abort
|
||||
call dein#_init()
|
||||
call dein#min#_init()
|
||||
let &runtimepath = s:runtimepath_save
|
||||
let &l:filetype = s:filetype_save
|
||||
let g:temp = tempname()
|
||||
|
Loading…
x
Reference in New Issue
Block a user