6 Commits

Author SHA1 Message Date
Daniel Hahler
35b92b509b Merge 00d3f0ada6 into d863d07832 2024-06-20 09:46:45 +00:00
Daniel Hahler
00d3f0ada6 Queue autocommands for VimEnter
This also uses `s:dobufread` for the `BufEnter` event (which enables
`<nomodeline>` for it).

Triggering `BufRead` during startup of Vim should be avoided, because it
will also trigger `FileType` events, which can have unexpected side
effects.

Ref: https://github.com/vim/vim/issues/2810
2018-04-17 10:02:25 +02:00
Daniel Hahler
a78b28a318 tests: trigger VimEnter for #112 test 2018-04-17 10:02:25 +02:00
Daniel Hahler
66e48daac3 adjust test "Filetype-based on-demand loading" 2018-04-17 10:02:25 +02:00
Daniel Hahler
fa165cd592 handle missing v:vim_did_enter / use s:vim_did_enter 2018-04-17 10:02:25 +02:00
Daniel Hahler
bd33a4337d Do not trigger filetypeindent/filetypeplugin autocmds by default
This is not necessary if `filetype plugin indent on` was not used before
`plug#end()`, since then the `FileType` autocmds from there will come
after vim-plug's.

This will issue a warning, and makes handling of this conditional.

This could use `filetype plugin/indent off` to work around this (similar
to the `filetype off` being used), but `runtime/indoff.vim` and
`runtime/ftplugof.vim` will only empty the augroups, and not remove
them.

Fixing the user's config is the best solution anyway, so I think a
warning is good.
2018-04-17 10:02:25 +02:00
4 changed files with 66 additions and 50 deletions

View File

@@ -315,7 +315,7 @@ vim.cmd('silent! colorscheme seoul256')
- `S` - `PlugStatus`
- `R` - Retry failed update or installation tasks
- `U` - Update plugins in the selected range
- `q` - Abort the running tasks or close the window
- `q` - Close the window
- `:PlugStatus`
- `L` - Load plugin
- `:PlugDiff`

108
plug.vim
View File

@@ -84,6 +84,9 @@ let s:TYPE = {
\ }
let s:loaded = get(s:, 'loaded', {})
let s:triggers = get(s:, 'triggers', {})
let s:need_filetypeplugin_au = 0
let s:need_filetypeindent_au = 0
let s:autocmd_queue_for_vimenter = []
function! s:is_powershell(shell)
return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$'
@@ -323,6 +326,21 @@ function! plug#end()
if get(g:, 'did_load_filetypes', 0)
filetype off
endif
let warn = []
if exists('g:did_load_ftplugin')
let warn += ['plugin']
let s:need_filetypeindent_au = 1
endif
if exists('g:did_indent_on')
let warn += ['indent']
let s:need_filetypeplugin_au = 1
endif
if !empty(warn)
redraw
call s:warn('echom', printf('[vim-plug] "filetype %s on" should not be used manually with vim-plug, please remove it from your vimrc.', join(warn)))
endif
for name in g:plugs_order
if !has_key(g:plugs, name)
continue
@@ -398,7 +416,21 @@ function! plug#end()
if has('syntax') && !exists('g:syntax_on')
syntax enable
end
" NOTE: v:vim_did_enter might not exist with older Vims, and handling it
" manually can be used in tests.
let s:vim_did_enter = 0
function! s:plug_on_vimenter()
let s:vim_did_enter = 1
for event in s:autocmd_queue_for_vimenter
call s:doautocmd(event)
endfor
endfunction
augroup PlugLOD
autocmd VimEnter * call s:plug_on_vimenter()
augroup END
else
let s:vim_did_enter = 1
call s:reload_plugins()
endif
endfunction
@@ -561,6 +593,12 @@ function! s:reorg_rtp()
endfunction
function! s:doautocmd(...)
if !s:vim_did_enter
if index(s:autocmd_queue_for_vimenter, a:000) == -1
call add(s:autocmd_queue_for_vimenter, a:000)
endif
return
endif
if exists('#'.join(a:000, '#'))
execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '<nomodeline>' : '') join(a:000)
endif
@@ -571,9 +609,7 @@ function! s:dobufread(names)
let path = s:rtp(g:plugs[name])
for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin']
if len(finddir(dir, path))
if exists('#BufRead')
doautocmd BufRead
endif
call s:doautocmd('BufRead')
return
endif
endfor
@@ -647,8 +683,17 @@ function! s:lod_ft(pat, names)
let syn = 'syntax/'.a:pat.'.vim'
call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn)
execute 'autocmd! PlugLOD FileType' a:pat
call s:doautocmd('filetypeplugin', 'FileType')
call s:doautocmd('filetypeindent', 'FileType')
" Executing this is only necessary if "filetype plugin indent on" was used
" before plug#end, and can be skipped when Vim has not entered always.
if s:vim_did_enter
if s:need_filetypeplugin_au
call s:doautocmd('filetypeplugin', 'FileType')
endif
if s:need_filetypeindent_au
call s:doautocmd('filetypeindent', 'FileType')
endif
endif
endfunction
function! s:lod_cmd(cmd, bang, l1, l2, args, names)
@@ -783,11 +828,10 @@ endfunction
function! s:syntax()
syntax clear
syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber
syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX,plugAbort
syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX
syn match plugNumber /[0-9]\+[0-9.]*/ contained
syn match plugBracket /[[\]]/ contained
syn match plugX /x/ contained
syn match plugAbort /\~/ contained
syn match plugDash /^-\{1}\ /
syn match plugPlus /^+/
syn match plugStar /^*/
@@ -812,7 +856,6 @@ function! s:syntax()
hi def link plug2 Repeat
hi def link plugH2 Type
hi def link plugX Exception
hi def link plugAbort Ignore
hi def link plugBracket Structure
hi def link plugNumber Number
@@ -910,7 +953,7 @@ function! s:prepare(...)
endif
endfor
call s:job_abort(0)
call s:job_abort()
if s:switch_in()
if b:plug_preview == 1
pc
@@ -946,8 +989,6 @@ function! s:close_pane()
if b:plug_preview == 1
pc
let b:plug_preview = -1
elseif exists('s:jobs') && !empty(s:jobs)
call s:job_abort(1)
else
bd
endif
@@ -1330,12 +1371,7 @@ function! s:update_finish()
endif
endfunction
function! s:mark_aborted(name, message)
let attrs = { 'running': 0, 'error': 1, 'abort': 1, 'lines': [a:message] }
let s:jobs[a:name] = extend(get(s:jobs, a:name, {}), attrs)
endfunction
function! s:job_abort(cancel)
function! s:job_abort()
if (!s:nvim && !s:vim8) || !exists('s:jobs')
return
endif
@@ -1349,18 +1385,8 @@ function! s:job_abort(cancel)
if j.new
call s:rm_rf(g:plugs[name].dir)
endif
if a:cancel
call s:mark_aborted(name, 'Aborted')
endif
endfor
if a:cancel
for todo in values(s:update.todo)
let todo.abort = 1
endfor
else
let s:jobs = {}
endif
let s:jobs = {}
endfunction
function! s:last_non_empty_line(lines)
@@ -1374,16 +1400,6 @@ function! s:last_non_empty_line(lines)
return ''
endfunction
function! s:bullet_for(job, ...)
if a:job.running
return a:job.new ? '+' : '*'
endif
if get(a:job, 'abort', 0)
return '~'
endif
return a:job.error ? 'x' : get(a:000, 0, '-')
endfunction
function! s:job_out_cb(self, data) abort
let self = a:self
let data = remove(self.lines, -1) . a:data
@@ -1392,9 +1408,10 @@ function! s:job_out_cb(self, data) abort
" To reduce the number of buffer updates
let self.tick = get(self, 'tick', -1) + 1
if !self.running || self.tick % len(s:jobs) == 0
let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-')
let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines)
if len(result)
call s:log(s:bullet_for(self), self.name, result)
call s:log(bullet, self.name, result)
endif
endif
endfunction
@@ -1408,7 +1425,7 @@ endfunction
function! s:job_cb(fn, job, ch, data)
if !s:plug_window_exists() " plug window closed
return s:job_abort(0)
return s:job_abort()
endif
call call(a:fn, [a:job, a:data])
endfunction
@@ -1480,16 +1497,17 @@ function! s:reap(name)
endif
let more = len(get(job, 'queue', []))
let bullet = job.error ? 'x' : more ? (job.new ? '+' : '*') : '-'
let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines)
if len(result)
call s:log(s:bullet_for(job), a:name, result)
call s:log(bullet, a:name, result)
endif
if !job.error && more
let job.spec.queue = job.queue
let s:update.todo[a:name] = job.spec
else
let s:update.bar .= s:bullet_for(job, '=')
let s:update.bar .= job.error ? 'x' : '='
call s:bar()
endif
endfunction
@@ -1568,12 +1586,6 @@ while 1 " Without TCO, Vim stack is bound to explode
let name = keys(s:update.todo)[0]
let spec = remove(s:update.todo, name)
if get(spec, 'abort', 0)
call s:mark_aborted(name, 'Skipped')
call s:reap(name)
continue
endif
let queue = get(spec, 'queue', [])
let new = empty(globpath(spec.dir, '.git', 1))

View File

@@ -5,6 +5,10 @@ Execute (#112 On-demand loading should not suppress messages from ftplugin):
Plug '$PLUG_FIXTURES/ftplugin-msg', { 'for': 'c' }
call plug#end()
" Trigger VimEnter (simulate Vim being started), so that s:lod handles
" filetypeindent/filetypeplugin."
doautocmd VimEnter
redir => out
tabnew a.c
redir END

View File

@@ -1230,7 +1230,7 @@ Execute (Filetype-based on-demand loading):
AssertEqual ['xxx/ftdetect', 'xxx/after/ftdetect'], g:xxx
setf xxx
AssertEqual ['xxx/ftdetect', 'xxx/after/ftdetect', 'xxx/plugin', 'xxx/after/plugin', 'xxx/syntax', 'xxx/after/syntax', 'xxx/ftplugin', 'xxx/after/ftplugin', 'xxx/indent', 'xxx/after/indent'], g:xxx
AssertEqual ['xxx/ftdetect', 'xxx/after/ftdetect', 'xxx/plugin', 'xxx/after/plugin', 'xxx/syntax', 'xxx/after/syntax'], g:xxx
" syntax/xxx.vim and after/syntax/xxx.vim should not be loaded (#410)
setf yyy