1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-24 09:20:06 +08:00
SpaceVim/bundle/deoplete.nvim/rplugin/python3/deoplete/source/buffer.py
2020-06-18 23:07:37 +08:00

71 lines
2.4 KiB
Python

# ============================================================================
# FILE: buffer.py
# AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
# License: MIT license
# ============================================================================
import typing
from deoplete.base.source import Base
from deoplete.util import parse_buffer_pattern, getlines
from deoplete.util import Nvim, UserContext, Candidates
class Source(Base):
def __init__(self, vim: Nvim) -> None:
super().__init__(vim)
self.name = 'buffer'
self.mark = '[B]'
self.events = ['Init', 'BufReadPost', 'BufWritePost', 'InsertLeave']
self.vars = {
'require_same_filetype': True,
}
self._limit = 1000000
self._buffers: typing.Dict[int, typing.Any] = {}
self._max_lines = 5000
def on_event(self, context: UserContext) -> None:
self._make_cache(context)
tab_bufnrs = self.vim.call('tabpagebuflist')
self._buffers = {
x['bufnr']: x for x in self._buffers.values()
if x['bufnr'] in tab_bufnrs or
self.vim.call('buflisted', x['bufnr'])
}
def gather_candidates(self, context: UserContext) -> Candidates:
tab_bufnrs = self.vim.call('tabpagebuflist')
same_filetype = self.get_var('require_same_filetype')
return {'sorted_candidates': [ # type: ignore
x['candidates'] for x in self._buffers.values()
if not same_filetype or
x['filetype'] in context['filetypes'] or
x['filetype'] in context['same_filetypes'] or
x['bufnr'] in tab_bufnrs
]}
def _make_cache(self, context: UserContext) -> None:
# Bufsize check
size = self.vim.call('line2byte',
self.vim.call('line', '$') + 1) - 1
if size > self._limit:
return
try:
self._buffers[context['bufnr']] = {
'bufnr': context['bufnr'],
'filetype': self.get_buf_option('filetype'),
'candidates': [
{'word': x} for x in
sorted(parse_buffer_pattern(getlines(self.vim),
context['keyword_pattern']),
key=str.lower)
]
}
except UnicodeDecodeError:
return