mirror of
1
0
Fork 0

Update Coc.nvim.

This commit is contained in:
Kurtis Moxley 2022-09-13 19:48:57 +08:00
parent 3fa5ed14bb
commit 53dd1894bb
21 changed files with 4802 additions and 2841 deletions

View File

@ -20,7 +20,7 @@ _Custom popup menu with snippet support_
## Why? ## Why?
- 🚀 **Fast**: separated NodeJS process that not block your vim most of the time. - 🚀 **Fast**: separated NodeJS process that does not block your vim most of the time.
- 💎 **Reliable**: typed language, tested with CI. - 💎 **Reliable**: typed language, tested with CI.
- 🌟 **Featured**: all LSP 3.16 features are supported, see `:h coc-lsp`. - 🌟 **Featured**: all LSP 3.16 features are supported, see `:h coc-lsp`.
- ❤️ **Flexible**: [configured like VSCode](https://github.com/neoclide/coc.nvim/wiki/Using-the-configuration-file), [extensions work like in VSCode](https://github.com/neoclide/coc.nvim/wiki/Using-coc-extensions) - ❤️ **Flexible**: [configured like VSCode](https://github.com/neoclide/coc.nvim/wiki/Using-the-configuration-file), [extensions work like in VSCode](https://github.com/neoclide/coc.nvim/wiki/Using-coc-extensions)
@ -107,10 +107,12 @@ set updatetime=300
set signcolumn=yes set signcolumn=yes
" Use tab for trigger completion with characters ahead and navigate. " Use tab for trigger completion with characters ahead and navigate.
" NOTE: There's always complete item selected by default, you may want to enable
" no select by `"suggest.noselect": true` in your configuration file.
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by " NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config. " other plugin before putting this into your config.
inoremap <silent><expr> <TAB> inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(1): \ coc#pum#visible() ? coc#pum#next(1) :
\ CheckBackspace() ? "\<Tab>" : \ CheckBackspace() ? "\<Tab>" :
\ coc#refresh() \ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>" inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"
@ -319,6 +321,10 @@ Try these steps when you have problem with coc.nvim.
<a href="https://opencollective.com/cocnvim/backer/43/website?requireActive=false" target="_blank"><img src="https://opencollective.com/cocnvim/backer/43/avatar.svg?requireActive=false"></a> <a href="https://opencollective.com/cocnvim/backer/43/website?requireActive=false" target="_blank"><img src="https://opencollective.com/cocnvim/backer/43/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/cocnvim/backer/44/website?requireActive=false" target="_blank"><img src="https://opencollective.com/cocnvim/backer/44/avatar.svg?requireActive=false"></a> <a href="https://opencollective.com/cocnvim/backer/44/website?requireActive=false" target="_blank"><img src="https://opencollective.com/cocnvim/backer/44/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/cocnvim/backer/45/website?requireActive=false" target="_blank"><img src="https://opencollective.com/cocnvim/backer/45/avatar.svg?requireActive=false"></a> <a href="https://opencollective.com/cocnvim/backer/45/website?requireActive=false" target="_blank"><img src="https://opencollective.com/cocnvim/backer/45/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/cocnvim/backer/46/website?requireActive=false" target="_blank"><img src="https://opencollective.com/cocnvim/backer/46/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/cocnvim/backer/47/website?requireActive=false" target="_blank"><img src="https://opencollective.com/cocnvim/backer/47/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/cocnvim/backer/48/website?requireActive=false" target="_blank"><img src="https://opencollective.com/cocnvim/backer/48/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/cocnvim/backer/49/website?requireActive=false" target="_blank"><img src="https://opencollective.com/cocnvim/backer/49/avatar.svg?requireActive=false"></a>
<a href="https://opencollective.com/cocnvim#backer" target="_blank"><img src="https://images.opencollective.com/static/images/become_backer.svg"></a> <a href="https://opencollective.com/cocnvim#backer" target="_blank"><img src="https://images.opencollective.com/static/images/become_backer.svg"></a>
@ -595,6 +601,13 @@ Try these steps when you have problem with coc.nvim.
<td align="center"><a href="http://bigshans.github.io"><img src="https://avatars.githubusercontent.com/u/26884666?v=4?s=50" width="50px;" alt=""/><br /><sub><b>bigshans</b></sub></a><br /><a href="https://github.com/neoclide/coc.nvim/commits?author=bigshans" title="Documentation">📖</a></td> <td align="center"><a href="http://bigshans.github.io"><img src="https://avatars.githubusercontent.com/u/26884666?v=4?s=50" width="50px;" alt=""/><br /><sub><b>bigshans</b></sub></a><br /><a href="https://github.com/neoclide/coc.nvim/commits?author=bigshans" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/rob-3"><img src="https://avatars.githubusercontent.com/u/24816247?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Robert Boyd III</b></sub></a><br /><a href="https://github.com/neoclide/coc.nvim/issues?q=author%3Arob-3" title="Bug reports">🐛</a></td> <td align="center"><a href="https://github.com/rob-3"><img src="https://avatars.githubusercontent.com/u/24816247?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Robert Boyd III</b></sub></a><br /><a href="https://github.com/neoclide/coc.nvim/issues?q=author%3Arob-3" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://creasty.com"><img src="https://avatars.githubusercontent.com/u/1695538?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Yuki Iwanaga</b></sub></a><br /><a href="https://github.com/neoclide/coc.nvim/commits?author=creasty" title="Code">💻</a></td> <td align="center"><a href="https://creasty.com"><img src="https://avatars.githubusercontent.com/u/1695538?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Yuki Iwanaga</b></sub></a><br /><a href="https://github.com/neoclide/coc.nvim/commits?author=creasty" title="Code">💻</a></td>
<td align="center"><a href="https://www.dosk.win/"><img src="https://avatars.githubusercontent.com/u/2389889?v=4?s=50" width="50px;" alt=""/><br /><sub><b>SpringHack</b></sub></a><br /><a href="https://github.com/neoclide/coc.nvim/issues?q=author%3Aspringhack" title="Bug reports">🐛</a></td>
<td align="center"><a href="http://git.lmburns.com"><img src="https://avatars.githubusercontent.com/u/44355502?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Lucas Burns</b></sub></a><br /><a href="https://github.com/neoclide/coc.nvim/commits?author=lmburns" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="http://qiqi.boy.im"><img src="https://avatars.githubusercontent.com/u/3774036?v=4?s=50" width="50px;" alt=""/><br /><sub><b>qiqiboy</b></sub></a><br /><a href="https://github.com/neoclide/coc.nvim/commits?author=qiqiboy" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/timsu92"><img src="https://avatars.githubusercontent.com/u/33785401?v=4?s=50" width="50px;" alt=""/><br /><sub><b>timsu92</b></sub></a><br /><a href="https://github.com/neoclide/coc.nvim/commits?author=timsu92" title="Documentation">📖</a></td>
<td align="center"><a href="https://sartak.org"><img src="https://avatars.githubusercontent.com/u/45430?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Shawn M Moore</b></sub></a><br /><a href="https://github.com/neoclide/coc.nvim/commits?author=sartak" title="Code">💻</a></td>
</tr> </tr>
</table> </table>

View File

@ -282,12 +282,14 @@ function! s:funcs.buf_add_highlight(bufnr, srcId, hlGroup, line, colStart, colEn
let srcId = a:srcId let srcId = a:srcId
endif endif
let bufnr = a:bufnr == 0 ? bufnr('%') : a:bufnr let bufnr = a:bufnr == 0 ? bufnr('%') : a:bufnr
let type = a:hlGroup.'_'.srcId let type = srcId == -1 ? a:hlGroup : a:hlGroup.'_'.srcId
let types = get(s:id_types, srcId, []) let types = get(s:id_types, srcId, [])
if index(types, type) == -1 if index(types, type) == -1
call add(types, type) call add(types, type)
let s:id_types[srcId] = types let s:id_types[srcId] = types
call prop_type_add(type, extend({'highlight': a:hlGroup}, get(a:, 1, {}))) if empty(prop_type_get(type))
call prop_type_add(type, extend({'highlight': a:hlGroup}, get(a:, 1, {})))
endif
endif endif
let end = a:colEnd == -1 ? strlen(getbufline(bufnr, a:line + 1)[0]) + 1 : a:colEnd + 1 let end = a:colEnd == -1 ? strlen(getbufline(bufnr, a:line + 1)[0]) + 1 : a:colEnd + 1
if end < a:colStart + 1 if end < a:colStart + 1
@ -648,6 +650,22 @@ function! coc#api#get_types(srcId) abort
return get(s:id_types, a:srcId, []) return get(s:id_types, a:srcId, [])
endfunction endfunction
function! coc#api#get_id_types() abort
return s:id_types
endfunction
function! coc#api#create_type(srcId, hlGroup, opts) abort
let type = a:hlGroup.'_'.a:srcId
let types = get(s:id_types, a:srcId, [])
if index(types, type) == -1
call add(types, type)
let s:id_types[a:srcId] = types
let combine = get(a:opts, 'hl_mode', 'combine') ==# 'combine'
call prop_type_add(type, {'highlight': a:hlGroup, 'combine': combine})
endif
return type
endfunction
function! coc#api#func_names() abort function! coc#api#func_names() abort
return keys(s:funcs) return keys(s:funcs)
endfunction endfunction

View File

@ -129,14 +129,45 @@ endfunction
function! s:on_stderr(name, msgs) function! s:on_stderr(name, msgs)
if get(g:, 'coc_vim_leaving', 0) | return | endif if get(g:, 'coc_vim_leaving', 0) | return | endif
if get(g:, 'coc_disable_uncaught_error', 0) | return | endif
let data = filter(copy(a:msgs), '!empty(v:val)') let data = filter(copy(a:msgs), '!empty(v:val)')
if empty(data) | return | endif if empty(data) | return | endif
let client = a:name ==# 'coc' ? '[coc.nvim]' : '['.a:name.']' let client = a:name ==# 'coc' ? '[coc.nvim]' : '['.a:name.']'
let data[0] = client.': '.data[0] let data[0] = client.': '.data[0]
if a:name ==# 'coc' && len(filter(copy(data), 'v:val =~# "SyntaxError: Unexpected token"'))
call coc#client#check_version()
endif
if get(g:, 'coc_disable_uncaught_error', 0) | return | endif
call coc#ui#echo_messages('Error', data) call coc#ui#echo_messages('Error', data)
endfunction endfunction
function! coc#client#check_version() abort
if (has_key(g:, 'coc_node_path'))
let node = expand(g:coc_node_path)
else
let node = $COC_NODE_PATH == '' ? 'node' : $COC_NODE_PATH
endif
let output = system(node . ' --version')
let msgs = []
if v:shell_error
let msgs = ['Unexpected result from node --version'] + split(output, '\n')
else
let ms = matchlist(output, 'v\(\d\+\).\(\d\+\).\(\d\+\)')
if empty(ms)
let msgs = ['Unable to detect version of node, make sure your node executable is http://nodejs.org/']
elseif str2nr(ms[1]) < 14 || (str2nr(ms[1]) == 14 && str2nr(ms[2]) < 14)
let msgs = ['Current Node.js version '.trim(output).' < 14.14.0 ', 'Please upgrade your node.js']
endif
endif
if !empty(msgs)
call coc#notify#create(msgs, {
\ 'borderhighlight': 'CocErrorSign',
\ 'highlight': 'Normal',
\ 'timeout': 50000,
\ 'kind': 'error',
\ })
endif
endfunction
function! s:on_exit(name, code) abort function! s:on_exit(name, code) abort
if get(g:, 'coc_vim_leaving', 0) | return | endif if get(g:, 'coc_vim_leaving', 0) | return | endif
let client = get(s:clients, a:name, v:null) let client = get(s:clients, a:name, v:null)

View File

@ -14,6 +14,237 @@ elseif has('mac')
let s:activate = 'activate' let s:activate = 'activate'
endif endif
let s:patterns = {}
let s:patterns['hex'] = '\v#?(\x{2})(\x{2})(\x{2})'
let s:patterns['shortHex'] = '\v#(\x{1})(\x{1})(\x{1})'
let s:xterm_colors = {
\ '0': '#000000', '1': '#800000', '2': '#008000', '3': '#808000', '4': '#000080',
\ '5': '#800080', '6': '#008080', '7': '#c0c0c0', '8': '#808080', '9': '#ff0000',
\ '10': '#00ff00', '11': '#ffff00', '12': '#0000ff', '13': '#ff00ff', '14': '#00ffff',
\ '15': '#ffffff', '16': '#000000', '17': '#00005f', '18': '#000087', '19': '#0000af',
\ '20': '#0000df', '21': '#0000ff', '22': '#005f00', '23': '#005f5f', '24': '#005f87',
\ '25': '#005faf', '26': '#005fdf', '27': '#005fff', '28': '#008700', '29': '#00875f',
\ '30': '#008787', '31': '#0087af', '32': '#0087df', '33': '#0087ff', '34': '#00af00',
\ '35': '#00af5f', '36': '#00af87', '37': '#00afaf', '38': '#00afdf', '39': '#00afff',
\ '40': '#00df00', '41': '#00df5f', '42': '#00df87', '43': '#00dfaf', '44': '#00dfdf',
\ '45': '#00dfff', '46': '#00ff00', '47': '#00ff5f', '48': '#00ff87', '49': '#00ffaf',
\ '50': '#00ffdf', '51': '#00ffff', '52': '#5f0000', '53': '#5f005f', '54': '#5f0087',
\ '55': '#5f00af', '56': '#5f00df', '57': '#5f00ff', '58': '#5f5f00', '59': '#5f5f5f',
\ '60': '#5f5f87', '61': '#5f5faf', '62': '#5f5fdf', '63': '#5f5fff', '64': '#5f8700',
\ '65': '#5f875f', '66': '#5f8787', '67': '#5f87af', '68': '#5f87df', '69': '#5f87ff',
\ '70': '#5faf00', '71': '#5faf5f', '72': '#5faf87', '73': '#5fafaf', '74': '#5fafdf',
\ '75': '#5fafff', '76': '#5fdf00', '77': '#5fdf5f', '78': '#5fdf87', '79': '#5fdfaf',
\ '80': '#5fdfdf', '81': '#5fdfff', '82': '#5fff00', '83': '#5fff5f', '84': '#5fff87',
\ '85': '#5fffaf', '86': '#5fffdf', '87': '#5fffff', '88': '#870000', '89': '#87005f',
\ '90': '#870087', '91': '#8700af', '92': '#8700df', '93': '#8700ff', '94': '#875f00',
\ '95': '#875f5f', '96': '#875f87', '97': '#875faf', '98': '#875fdf', '99': '#875fff',
\ '100': '#878700', '101': '#87875f', '102': '#878787', '103': '#8787af', '104': '#8787df',
\ '105': '#8787ff', '106': '#87af00', '107': '#87af5f', '108': '#87af87', '109': '#87afaf',
\ '110': '#87afdf', '111': '#87afff', '112': '#87df00', '113': '#87df5f', '114': '#87df87',
\ '115': '#87dfaf', '116': '#87dfdf', '117': '#87dfff', '118': '#87ff00', '119': '#87ff5f',
\ '120': '#87ff87', '121': '#87ffaf', '122': '#87ffdf', '123': '#87ffff', '124': '#af0000',
\ '125': '#af005f', '126': '#af0087', '127': '#af00af', '128': '#af00df', '129': '#af00ff',
\ '130': '#af5f00', '131': '#af5f5f', '132': '#af5f87', '133': '#af5faf', '134': '#af5fdf',
\ '135': '#af5fff', '136': '#af8700', '137': '#af875f', '138': '#af8787', '139': '#af87af',
\ '140': '#af87df', '141': '#af87ff', '142': '#afaf00', '143': '#afaf5f', '144': '#afaf87',
\ '145': '#afafaf', '146': '#afafdf', '147': '#afafff', '148': '#afdf00', '149': '#afdf5f',
\ '150': '#afdf87', '151': '#afdfaf', '152': '#afdfdf', '153': '#afdfff', '154': '#afff00',
\ '155': '#afff5f', '156': '#afff87', '157': '#afffaf', '158': '#afffdf', '159': '#afffff',
\ '160': '#df0000', '161': '#df005f', '162': '#df0087', '163': '#df00af', '164': '#df00df',
\ '165': '#df00ff', '166': '#df5f00', '167': '#df5f5f', '168': '#df5f87', '169': '#df5faf',
\ '170': '#df5fdf', '171': '#df5fff', '172': '#df8700', '173': '#df875f', '174': '#df8787',
\ '175': '#df87af', '176': '#df87df', '177': '#df87ff', '178': '#dfaf00', '179': '#dfaf5f',
\ '180': '#dfaf87', '181': '#dfafaf', '182': '#dfafdf', '183': '#dfafff', '184': '#dfdf00',
\ '185': '#dfdf5f', '186': '#dfdf87', '187': '#dfdfaf', '188': '#dfdfdf', '189': '#dfdfff',
\ '190': '#dfff00', '191': '#dfff5f', '192': '#dfff87', '193': '#dfffaf', '194': '#dfffdf',
\ '195': '#dfffff', '196': '#ff0000', '197': '#ff005f', '198': '#ff0087', '199': '#ff00af',
\ '200': '#ff00df', '201': '#ff00ff', '202': '#ff5f00', '203': '#ff5f5f', '204': '#ff5f87',
\ '205': '#ff5faf', '206': '#ff5fdf', '207': '#ff5fff', '208': '#ff8700', '209': '#ff875f',
\ '210': '#ff8787', '211': '#ff87af', '212': '#ff87df', '213': '#ff87ff', '214': '#ffaf00',
\ '215': '#ffaf5f', '216': '#ffaf87', '217': '#ffafaf', '218': '#ffafdf', '219': '#ffafff',
\ '220': '#ffdf00', '221': '#ffdf5f', '222': '#ffdf87', '223': '#ffdfaf', '224': '#ffdfdf',
\ '225': '#ffdfff', '226': '#ffff00', '227': '#ffff5f', '228': '#ffff87', '229': '#ffffaf',
\ '230': '#ffffdf', '231': '#ffffff', '232': '#080808', '233': '#121212', '234': '#1c1c1c',
\ '235': '#262626', '236': '#303030', '237': '#3a3a3a', '238': '#444444', '239': '#4e4e4e',
\ '240': '#585858', '241': '#606060', '242': '#666666', '243': '#767676', '244': '#808080',
\ '245': '#8a8a8a', '246': '#949494', '247': '#9e9e9e', '248': '#a8a8a8', '249': '#b2b2b2',
\ '250': '#bcbcbc', '251': '#c6c6c6', '252': '#d0d0d0', '253': '#dadada', '254': '#e4e4e4',
\ '255': '#eeeeee'}
let s:xterm_16colors = {
\ 'black': '#000000',
\ 'darkblue': '#00008B',
\ 'darkgreen': '#00CD00',
\ 'darkcyan': '#00CDCD',
\ 'darkred': '#CD0000',
\ 'darkmagenta': '#8B008B',
\ 'brown': '#CDCD00',
\ 'darkyellow': '#CDCD00',
\ 'lightgrey': '#E5E5E5',
\ 'lightgray': '#E5E5E5',
\ 'gray': '#E5E5E5',
\ 'grey': '#E5E5E5',
\ 'darkgrey': '#7F7F7F',
\ 'darkgray': '#7F7F7F',
\ 'blue': '#5C5CFF',
\ 'lightblue': '#5C5CFF',
\ 'green': '#00FF00',
\ 'lightgreen': '#00FF00',
\ 'cyan': '#00FFFF',
\ 'lightcyan': '#00FFFF',
\ 'red': '#FF0000',
\ 'lightred': '#FF0000',
\ 'magenta': '#FF00FF',
\ 'lightmagenta': '#FF00FF',
\ 'yellow': '#FFFF00',
\ 'lightyellow': '#FFFF00',
\ 'white': '#FFFFFF',
\ }
let s:w3c_color_names = {
\ 'aliceblue': '#F0F8FF',
\ 'antiquewhite': '#FAEBD7',
\ 'aqua': '#00FFFF',
\ 'aquamarine': '#7FFFD4',
\ 'azure': '#F0FFFF',
\ 'beige': '#F5F5DC',
\ 'bisque': '#FFE4C4',
\ 'black': '#000000',
\ 'blanchedalmond': '#FFEBCD',
\ 'blue': '#0000FF',
\ 'blueviolet': '#8A2BE2',
\ 'brown': '#A52A2A',
\ 'burlywood': '#DEB887',
\ 'cadetblue': '#5F9EA0',
\ 'chartreuse': '#7FFF00',
\ 'chocolate': '#D2691E',
\ 'coral': '#FF7F50',
\ 'cornflowerblue': '#6495ED',
\ 'cornsilk': '#FFF8DC',
\ 'crimson': '#DC143C',
\ 'cyan': '#00FFFF',
\ 'darkblue': '#00008B',
\ 'darkcyan': '#008B8B',
\ 'darkgoldenrod': '#B8860B',
\ 'darkgray': '#A9A9A9',
\ 'darkgreen': '#006400',
\ 'darkkhaki': '#BDB76B',
\ 'darkmagenta': '#8B008B',
\ 'darkolivegreen': '#556B2F',
\ 'darkorange': '#FF8C00',
\ 'darkorchid': '#9932CC',
\ 'darkred': '#8B0000',
\ 'darksalmon': '#E9967A',
\ 'darkseagreen': '#8FBC8F',
\ 'darkslateblue': '#483D8B',
\ 'darkslategray': '#2F4F4F',
\ 'darkturquoise': '#00CED1',
\ 'darkviolet': '#9400D3',
\ 'deeppink': '#FF1493',
\ 'deepskyblue': '#00BFFF',
\ 'dimgray': '#696969',
\ 'dodgerblue': '#1E90FF',
\ 'firebrick': '#B22222',
\ 'floralwhite': '#FFFAF0',
\ 'forestgreen': '#228B22',
\ 'fuchsia': '#FF00FF',
\ 'gainsboro': '#DCDCDC',
\ 'ghostwhite': '#F8F8FF',
\ 'gold': '#FFD700',
\ 'goldenrod': '#DAA520',
\ 'gray': '#808080',
\ 'green': '#008000',
\ 'greenyellow': '#ADFF2F',
\ 'honeydew': '#F0FFF0',
\ 'hotpink': '#FF69B4',
\ 'indianred': '#CD5C5C',
\ 'indigo': '#4B0082',
\ 'ivory': '#FFFFF0',
\ 'khaki': '#F0E68C',
\ 'lavender': '#E6E6FA',
\ 'lavenderblush': '#FFF0F5',
\ 'lawngreen': '#7CFC00',
\ 'lemonchiffon': '#FFFACD',
\ 'lightblue': '#ADD8E6',
\ 'lightcoral': '#F08080',
\ 'lightcyan': '#E0FFFF',
\ 'lightgoldenrodyellow': '#FAFAD2',
\ 'lightgray': '#D3D3D3',
\ 'lightgreen': '#90EE90',
\ 'lightpink': '#FFB6C1',
\ 'lightsalmon': '#FFA07A',
\ 'lightseagreen': '#20B2AA',
\ 'lightskyblue': '#87CEFA',
\ 'lightslategray': '#778899',
\ 'lightsteelblue': '#B0C4DE',
\ 'lightyellow': '#FFFFE0',
\ 'lime': '#00FF00',
\ 'limegreen': '#32CD32',
\ 'linen': '#FAF0E6',
\ 'magenta': '#FF00FF',
\ 'maroon': '#800000',
\ 'mediumaquamarine': '#66CDAA',
\ 'mediumblue': '#0000CD',
\ 'mediumorchid': '#BA55D3',
\ 'mediumpurple': '#9370D8',
\ 'mediumseagreen': '#3CB371',
\ 'mediumslateblue': '#7B68EE',
\ 'mediumspringgreen': '#00FA9A',
\ 'mediumturquoise': '#48D1CC',
\ 'mediumvioletred': '#C71585',
\ 'midnightblue': '#191970',
\ 'mintcream': '#F5FFFA',
\ 'mistyrose': '#FFE4E1',
\ 'moccasin': '#FFE4B5',
\ 'navajowhite': '#FFDEAD',
\ 'navy': '#000080',
\ 'oldlace': '#FDF5E6',
\ 'olive': '#808000',
\ 'olivedrab': '#6B8E23',
\ 'orange': '#FFA500',
\ 'orangered': '#FF4500',
\ 'orchid': '#DA70D6',
\ 'palegoldenrod': '#EEE8AA',
\ 'palegreen': '#98FB98',
\ 'paleturquoise': '#AFEEEE',
\ 'palevioletred': '#D87093',
\ 'papayawhip': '#FFEFD5',
\ 'peachpuff': '#FFDAB9',
\ 'peru': '#CD853F',
\ 'pink': '#FFC0CB',
\ 'plum': '#DDA0DD',
\ 'powderblue': '#B0E0E6',
\ 'purple': '#800080',
\ 'red': '#FF0000',
\ 'rosybrown': '#BC8F8F',
\ 'royalblue': '#4169E1',
\ 'saddlebrown': '#8B4513',
\ 'salmon': '#FA8072',
\ 'sandybrown': '#F4A460',
\ 'seagreen': '#2E8B57',
\ 'seashell': '#FFF5EE',
\ 'sienna': '#A0522D',
\ 'silver': '#C0C0C0',
\ 'skyblue': '#87CEEB',
\ 'slateblue': '#6A5ACD',
\ 'slategray': '#708090',
\ 'snow': '#FFFAFA',
\ 'springgreen': '#00FF7F',
\ 'steelblue': '#4682B4',
\ 'tan': '#D2B48C',
\ 'teal': '#008080',
\ 'thistle': '#D8BFD8',
\ 'tomato': '#FF6347',
\ 'turquoise': '#40E0D0',
\ 'violet': '#EE82EE',
\ 'wheat': '#F5DEB3',
\ 'white': '#FFFFFF',
\ 'whitesmoke': '#F5F5F5',
\ 'yellow': '#FFFF00',
\ 'yellowgreen': '#9ACD32'
\ }
" Returns an approximate grey index for the given grey level " Returns an approximate grey index for the given grey level
fun! s:grey_number(x) fun! s:grey_number(x)
if &t_Co == 88 if &t_Co == 88
@ -199,12 +430,125 @@ fun! s:colour(r, g, b)
endif endif
endfun endfun
function! coc#color#term2rgb(term) abort
if a:term < 0 || a:term > 255
return '#000000'
endif
return s:xterm_colors[a:term]
endfunction
function! coc#color#rgb2term(rgb) function! coc#color#rgb2term(rgb)
let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0
let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0
let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0
return s:colour(l:r, l:g, l:b) return s:colour(l:r, l:g, l:b)
endfun endfunction
function! coc#color#rgbToHex(...)
let [r, g, b] = ( a:0==1 ? a:1 : a:000 )
let num = printf('%02x', float2nr(r)) . ''
\ . printf('%02x', float2nr(g)) . ''
\ . printf('%02x', float2nr(b)) . ''
return '#' . num
endfunction
function! coc#color#hexToRgb(color)
if type(a:color) == 2
let color = printf('%x', a:color)
else
let color = a:color
end
let matches = matchlist(color, s:patterns['hex'])
let factor = 0x1
if empty(matches)
let matches = matchlist(color, s:patterns['shortHex'])
let factor = 0x10
end
if len(matches) < 4
echohl Error
echom 'Couldnt parse ' . string(color) . ' ' . string(matches)
echohl None
return
end
let r = str2nr(matches[1], 16) * factor
let g = str2nr(matches[2], 16) * factor
let b = str2nr(matches[3], 16) * factor
return [r, g, b]
endfunction
" @params String color The color
" @params {Number|String|Float} [amount=5] The percentage of light
function! coc#color#lighten(color, ...)
let amount = a:0 ?
\(type(a:1) < 2 ?
\str2float(a:1) : a:1 )
\: 5.0
if(amount < 1.0)
let amount = 1.0 + amount
else
let amount = 1.0 + (amount / 100.0)
end
let rgb = coc#color#hexToRgb(a:color)
let rgb = map(rgb, 'v:val * amount')
let rgb = map(rgb, 'v:val > 255.0 ? 255.0 : v:val')
let rgb = map(rgb, 'float2nr(v:val)')
let hex = coc#color#rgbToHex(rgb)
return hex
endfunction
" @params String color The color
" @params {Number|String|Float} [amount=5] The percentage of darkness
function! coc#color#darken(color, ...)
let amount = a:0 ?
\(type(a:1) < 2 ?
\str2float(a:1) : a:1 )
\: 5.0
if(amount < 1.0)
let amount = 1.0 - amount
else
let amount = 1.0 - (amount / 100.0)
end
if(amount < 0.0)
let amount = 0.0 | end
let rgb = coc#color#hexToRgb(a:color)
let rgb = map(rgb, 'v:val * amount')
let rgb = map(rgb, 'v:val > 255.0 ? 255.0 : v:val')
let rgb = map(rgb, 'float2nr(v:val)')
let hex = coc#color#rgbToHex(rgb)
return hex
endfu
function! coc#color#luminance(rgb) abort
let vals = []
for val in a:rgb
let val = (val + 0.0)/255
if val <= 0.03928
call add(vals, val/12.92)
else
call add(vals, pow((val + 0.055)/1.055, 2.4))
endif
endfor
return vals[0] * 0.2126 + vals[1] * 0.7152 + vals[2] * 0.0722
endfunction
function! coc#color#contrast(rgb1, rgb2) abort
let lnum1 = coc#color#luminance(a:rgb1)
let lnum2 = coc#color#luminance(a:rgb2)
let brightest = lnum1 > lnum2 ? lnum1 : lnum2
let darkest = lnum1 < lnum2 ? lnum1 : lnum2
return (brightest + 0.05) / (darkest + 0.05)
endfunction
function! coc#color#hex_contrast(hex1, hex2) abort
return coc#color#contrast(coc#color#hexToRgb(a:hex1), coc#color#hexToRgb(a:hex2))
endfunction
function! coc#color#nameToHex(name, term) abort
if a:term
return has_key(s:xterm_16colors, a:name) ? s:xterm_16colors[a:name] : v:null
endif
return has_key(s:w3c_color_names, a:name) ? s:w3c_color_names[a:name] : v:null
endfunction
" [r, g, b] ['255', '255', '255'] " [r, g, b] ['255', '255', '255']
" return ['65535', '65535', '65535'] or return v:false to cancel " return ['65535', '65535', '65535'] or return v:false to cancel
@ -280,4 +624,3 @@ csd.destroy()
endpython endpython
return rgb return rgb
endfunction endfunction

View File

@ -145,7 +145,7 @@ function! coc#dialog#create_prompt_win(title, default, opts) abort
let bufnr = res[1] let bufnr = res[1]
if has('nvim') if has('nvim')
let s:prompt_win_bufnr = res[1] let s:prompt_win_bufnr = res[1]
execute 'sign unplace 6 buffer='.s:prompt_win_bufnr call sign_unplace(s:sign_group, { 'buffer': s:prompt_win_bufnr })
call nvim_set_current_win(winid) call nvim_set_current_win(winid)
inoremap <buffer> <C-a> <Home> inoremap <buffer> <C-a> <Home>
inoremap <buffer><expr><C-e> pumvisible() ? "\<C-e>" : "\<End>" inoremap <buffer><expr><C-e> pumvisible() ? "\<C-e>" : "\<End>"
@ -312,66 +312,49 @@ function! coc#dialog#prompt_confirm(title, cb) abort
endtry endtry
return return
endif endif
if has('nvim-0.4.0') let text = ' '. a:title . ' (y/n)? '
let text = ' '. a:title . ' (y/n)? ' let maxWidth = coc#math#min(78, &columns - 2)
let maxWidth = coc#math#min(78, &columns - 2) let width = coc#math#min(maxWidth, strdisplaywidth(text))
let width = coc#math#min(maxWidth, strdisplaywidth(text)) let maxHeight = &lines - &cmdheight - 1
let maxHeight = &lines - &cmdheight - 1 let height = coc#math#min(maxHeight, float2nr(ceil(str2float(string(strdisplaywidth(text)))/width)))
let height = coc#math#min(maxHeight, float2nr(ceil(str2float(string(strdisplaywidth(text)))/width))) let arr = coc#float#create_float_win(0, s:prompt_win_bufnr, {
let arr = coc#float#create_float_win(0, s:prompt_win_bufnr, { \ 'col': &columns/2 - width/2 - 1,
\ 'col': &columns/2 - width/2 - 1, \ 'row': maxHeight/2 - height/2 - 1,
\ 'row': maxHeight/2 - height/2 - 1, \ 'width': width,
\ 'width': width, \ 'height': height,
\ 'height': height, \ 'border': [1,1,1,1],
\ 'border': [1,1,1,1], \ 'focusable': v:false,
\ 'focusable': v:false, \ 'relative': 'editor',
\ 'relative': 'editor', \ 'highlight': 'Normal',
\ 'highlight': 'Normal', \ 'borderhighlight': 'MoreMsg',
\ 'borderhighlight': 'MoreMsg', \ 'style': 'minimal',
\ 'style': 'minimal', \ 'lines': [text],
\ 'lines': [text], \ })
\ }) if empty(arr)
if empty(arr) call a:cb('Window create failed!')
call a:cb('Window create failed!') return
return
endif
let winid = arr[0]
let s:prompt_win_bufnr = arr[1]
let res = 0
redraw
" same result as vim
while 1
let key = nr2char(getchar())
if key == "\<C-c>"
let res = -1
break
elseif key == "\<esc>" || key == 'n' || key == 'N'
let res = 0
break
elseif key == 'y' || key == 'Y'
let res = 1
break
endif
endw
call coc#float#close(winid)
call a:cb(v:null, res)
" use relative editor since neovim doesn't support center position
elseif exists('*confirm')
let choice = confirm(a:title, "&Yes\n&No")
call a:cb(v:null, choice == 1)
else
echohl MoreMsg
echom a:title.' (y/n)'
echohl None
let confirm = nr2char(getchar())
redraw!
if !(confirm ==? "y" || confirm ==? "\r")
echohl Moremsg | echo 'Cancelled.' | echohl None
return 0
call a:cb(v:null, 0)
end
call a:cb(v:null, 1)
endif endif
let winid = arr[0]
let s:prompt_win_bufnr = arr[1]
call sign_unplace(s:sign_group, { 'buffer': s:prompt_win_bufnr })
let res = 0
redraw
" same result as vim
while 1
let key = nr2char(getchar())
if key == "\<C-c>"
let res = -1
break
elseif key == "\<esc>" || key == 'n' || key == 'N'
let res = 0
break
elseif key == 'y' || key == 'Y'
let res = 1
break
endif
endw
call coc#float#close(winid)
call a:cb(v:null, res)
endfunction endfunction
function! coc#dialog#get_config_editor(lines, config) abort function! coc#dialog#get_config_editor(lines, config) abort
@ -469,7 +452,7 @@ function! coc#dialog#change_border_hl(winid, hlgroup) abort
else else
let winid = coc#float#get_related(a:winid, 'border') let winid = coc#float#get_related(a:winid, 'border')
if winid > 0 if winid > 0
call setwinvar(winid, '&winhl', 'Normal:'.a:hlgroup.',NormalNC:'.a:hlgroup) call setwinvar(winid, '&winhl', 'Normal:'.a:hlgroup)
endif endif
endif endif
endfunction endfunction

View File

@ -154,7 +154,7 @@ function! coc#float#create_float_win(winid, bufnr, config) abort
let config = s:convert_config_nvim(a:config, 0) let config = s:convert_config_nvim(a:config, 0)
let hlgroup = get(a:config, 'highlight', 'CocFloating') let hlgroup = get(a:config, 'highlight', 'CocFloating')
let current = getwinvar(a:winid, '&winhl', '') let current = getwinvar(a:winid, '&winhl', '')
let winhl = coc#util#merge_winhl(current, [['Normal', hlgroup], ['NormalNC', hlgroup], ['FoldColumn', hlgroup]]) let winhl = coc#util#merge_winhl(current, [['Normal', hlgroup], ['FoldColumn', hlgroup], ['Search', '']])
if winhl !=# current if winhl !=# current
call setwinvar(a:winid, '&winhl', winhl) call setwinvar(a:winid, '&winhl', winhl)
endif endif
@ -190,6 +190,8 @@ function! coc#float#create_float_win(winid, bufnr, config) abort
\ 'border': border, \ 'border': border,
\ 'callback': { -> coc#float#on_close(winid)}, \ 'callback': { -> coc#float#on_close(winid)},
\ 'borderhighlight': [s:get_borderhighlight(a:config)], \ 'borderhighlight': [s:get_borderhighlight(a:config)],
\ 'scrollbarhighlight': 'CocFloatSbar',
\ 'thumbhighlight': 'CocFloatThumb',
\ } \ }
let winid = popup_create(bufnr, opts) let winid = popup_create(bufnr, opts)
if !s:popup_list_api if !s:popup_list_api
@ -277,11 +279,11 @@ function! coc#float#nvim_border_win(config, borderchars, winid, border, title, h
endif endif
if winid if winid
call nvim_win_set_config(winid, opt) call nvim_win_set_config(winid, opt)
call setwinvar(winid, '&winhl', 'Normal:'.a:hlgroup.',NormalNC:'.a:hlgroup.',Search:') call setwinvar(winid, '&winhl', 'Normal:'.a:hlgroup.',Search:')
else else
noa let winid = nvim_open_win(bufnr, 0, opt) noa let winid = nvim_open_win(bufnr, 0, opt)
call setwinvar(winid, 'delta', -1) call setwinvar(winid, 'delta', -1)
let winhl = 'Normal:'.a:hlgroup.',NormalNC:'.a:hlgroup.',Search:' let winhl = 'Normal:'.a:hlgroup.',Search:'
call s:nvim_add_related(winid, a:winid, 'border', winhl, a:related) call s:nvim_add_related(winid, a:winid, 'border', winhl, a:related)
endif endif
endfunction endfunction
@ -306,7 +308,7 @@ function! coc#float#nvim_close_btn(config, winid, border, hlgroup, related) abor
else else
let bufnr = coc#float#create_buf(0, ['X']) let bufnr = coc#float#create_buf(0, ['X'])
noa let winid = nvim_open_win(bufnr, 0, config) noa let winid = nvim_open_win(bufnr, 0, config)
let winhl = 'Normal:'.a:hlgroup.',NormalNC:'.a:hlgroup let winhl = 'Normal:'.a:hlgroup.',Search:'
call s:nvim_add_related(winid, a:winid, 'close', winhl, a:related) call s:nvim_add_related(winid, a:winid, 'close', winhl, a:related)
endif endif
endfunction endfunction
@ -511,9 +513,9 @@ function! coc#float#nvim_scrollbar(winid) abort
call nvim_buf_clear_namespace(sbuf, -1, 0, -1) call nvim_buf_clear_namespace(sbuf, -1, 0, -1)
for idx in range(0, height - 1) for idx in range(0, height - 1)
if idx >= start && idx < start + thumb_height if idx >= start && idx < start + thumb_height
call nvim_buf_add_highlight(sbuf, -1, 'PmenuThumb', idx, 0, 1) call nvim_buf_add_highlight(sbuf, -1, 'CocFloatThumb', idx, 0, 1)
else else
call nvim_buf_add_highlight(sbuf, -1, 'PmenuSbar', idx, 0, 1) call nvim_buf_add_highlight(sbuf, -1, 'CocFloatSbar', idx, 0, 1)
endif endif
endfor endfor
endfunction endfunction
@ -610,8 +612,8 @@ function! coc#float#scrollable(winid) abort
endif endif
if s:is_vim if s:is_vim
let pos = popup_getpos(a:winid) let pos = popup_getpos(a:winid)
if get(popup_getoptions(a:winid), 'scrollbar', 0) if get(pos, 'scrollbar', 0)
return get(pos, 'scrollbar', 0) return 1
endif endif
let ch = coc#float#content_height(bufnr, pos['core_width'], getwinvar(a:winid, '&wrap')) let ch = coc#float#content_height(bufnr, pos['core_width'], getwinvar(a:winid, '&wrap'))
return ch > pos['core_height'] return ch > pos['core_height']
@ -685,15 +687,10 @@ function! coc#float#content_height(bufnr, width, wrap) abort
return 0 return 0
endif endif
if !a:wrap if !a:wrap
return has('nvim') ? nvim_buf_line_count(a:bufnr) : len(getbufline(a:bufnr, 1, '$')) return coc#compat#buf_line_count(a:bufnr)
endif endif
let lines = has('nvim') ? nvim_buf_get_lines(a:bufnr, 0, -1, 0) : getbufline(a:bufnr, 1, '$') let lines = has('nvim') ? nvim_buf_get_lines(a:bufnr, 0, -1, 0) : getbufline(a:bufnr, 1, '$')
let total = 0 return coc#string#content_height(lines, a:width)
for line in lines
let dw = max([1, strdisplaywidth(line)])
let total += float2nr(ceil(str2float(string(dw))/a:width))
endfor
return total
endfunction endfunction
function! coc#float#nvim_refresh_scrollbar(winid) abort function! coc#float#nvim_refresh_scrollbar(winid) abort
@ -1312,7 +1309,7 @@ endfunction
function! s:set_float_defaults(winid, config) abort function! s:set_float_defaults(winid, config) abort
if !s:is_vim if !s:is_vim
let hlgroup = get(a:config, 'highlight', 'CocFloating') let hlgroup = get(a:config, 'highlight', 'CocFloating')
call setwinvar(a:winid, '&winhl', 'Normal:'.hlgroup.',NormalNC:'.hlgroup.',FoldColumn:'.hlgroup.',Search:') call setwinvar(a:winid, '&winhl', 'Normal:'.hlgroup.',FoldColumn:'.hlgroup.',Search:')
call setwinvar(a:winid, 'border', get(a:config, 'border', [])) call setwinvar(a:winid, 'border', get(a:config, 'border', []))
call setwinvar(a:winid, 'scrollinside', get(a:config, 'scrollinside', 0)) call setwinvar(a:winid, 'scrollinside', get(a:config, 'scrollinside', 0))
if !get(a:config, 'nopad', 0) if !get(a:config, 'nopad', 0)
@ -1356,7 +1353,7 @@ function! s:nvim_add_related(winid, target, kind, winhl, related) abort
endif endif
" minimal not work " minimal not work
if !has('nvim-0.4.3') if !has('nvim-0.4.3')
call setwinvar(a:winid, '&colorcolumn', 0) call setwinvar(a:winid, '&colorcolumn', '')
call setwinvar(a:winid, '&number', 0) call setwinvar(a:winid, '&number', 0)
call setwinvar(a:winid, '&relativenumber', 0) call setwinvar(a:winid, '&relativenumber', 0)
call setwinvar(a:winid, '&foldcolumn', 0) call setwinvar(a:winid, '&foldcolumn', 0)

View File

@ -8,6 +8,7 @@ let s:ns_id = 1
let s:diagnostic_hlgroups = ['CocErrorHighlight', 'CocWarningHighlight', 'CocInfoHighlight', 'CocHintHighlight', 'CocDeprecatedHighlight', 'CocUnusedHighlight'] let s:diagnostic_hlgroups = ['CocErrorHighlight', 'CocWarningHighlight', 'CocInfoHighlight', 'CocHintHighlight', 'CocDeprecatedHighlight', 'CocUnusedHighlight']
" Maximum count to highlight each time. " Maximum count to highlight each time.
let g:coc_highlight_maximum_count = get(g:, 'coc_highlight_maximum_count', 100) let g:coc_highlight_maximum_count = get(g:, 'coc_highlight_maximum_count', 100)
let s:term = &termguicolors == 0 && !has('gui_running')
if has('nvim-0.5.0') && s:clear_match_by_window == 0 if has('nvim-0.5.0') && s:clear_match_by_window == 0
try try
@ -417,17 +418,9 @@ function! coc#highlight#highlight_lines(winid, blocks) abort
endif endif
endfunction endfunction
" Compose hlGroups with foreground and background colors. function! coc#highlight#compose(fg, bg) abort
function! coc#highlight#compose_hlgroup(fgGroup, bgGroup) abort let fgId = synIDtrans(hlID(a:fg))
let hlGroup = 'Fg'.a:fgGroup.'Bg'.a:bgGroup let bgId = synIDtrans(hlID(a:bg))
if a:fgGroup ==# a:bgGroup
return a:fgGroup
endif
if hlexists(hlGroup) && match(execute('hi '.hlGroup, 'silent!'), 'cleared') == -1
return hlGroup
endif
let fgId = synIDtrans(hlID(a:fgGroup))
let bgId = synIDtrans(hlID(a:bgGroup))
let isGuiReversed = synIDattr(fgId, 'reverse', 'gui') !=# '1' || synIDattr(bgId, 'reverse', 'gui') !=# '1' let isGuiReversed = synIDattr(fgId, 'reverse', 'gui') !=# '1' || synIDattr(bgId, 'reverse', 'gui') !=# '1'
let guifg = isGuiReversed ? synIDattr(fgId, 'fg', 'gui') : synIDattr(fgId, 'bg', 'gui') let guifg = isGuiReversed ? synIDattr(fgId, 'fg', 'gui') : synIDattr(fgId, 'bg', 'gui')
let guibg = isGuiReversed ? synIDattr(bgId, 'bg', 'gui') : synIDattr(bgId, 'fg', 'gui') let guibg = isGuiReversed ? synIDattr(bgId, 'bg', 'gui') : synIDattr(bgId, 'fg', 'gui')
@ -437,7 +430,7 @@ function! coc#highlight#compose_hlgroup(fgGroup, bgGroup) abort
let bold = synIDattr(fgId, 'bold') ==# '1' let bold = synIDattr(fgId, 'bold') ==# '1'
let italic = synIDattr(fgId, 'italic') ==# '1' let italic = synIDattr(fgId, 'italic') ==# '1'
let underline = synIDattr(fgId, 'underline') ==# '1' let underline = synIDattr(fgId, 'underline') ==# '1'
let cmd = 'silent hi ' . hlGroup let cmd = ''
if !empty(guifg) if !empty(guifg)
let cmd .= ' guifg=' . guifg let cmd .= ' guifg=' . guifg
endif endif
@ -461,13 +454,88 @@ function! coc#highlight#compose_hlgroup(fgGroup, bgGroup) abort
elseif underline elseif underline
let cmd .= ' cterm=underline gui=underline' let cmd .= ' cterm=underline gui=underline'
endif endif
if cmd ==# 'silent hi ' . hlGroup return cmd
endfunction
" Compose hlGroups with foreground and background colors.
function! coc#highlight#compose_hlgroup(fgGroup, bgGroup) abort
let hlGroup = 'Fg'.a:fgGroup.'Bg'.a:bgGroup
if a:fgGroup ==# a:bgGroup
return a:fgGroup
endif
if hlexists(hlGroup) && match(execute('hi '.hlGroup, 'silent!'), 'cleared') == -1
return hlGroup
endif
let cmd = coc#highlight#compose(a:fgGroup, a:bgGroup)
if empty(cmd)
return 'Normal' return 'Normal'
endif endif
execute cmd execute 'silent hi ' . hlGroup . cmd
return hlGroup return hlGroup
endfunction endfunction
" hlGroup id, key => 'fg' | 'bg', kind => 'cterm' | 'gui'
function! coc#highlight#get_color(id, key, kind) abort
if synIDattr(a:id, 'reverse', a:kind) !=# '1'
return synIDattr(a:id, a:key, a:kind)
endif
return synIDattr(a:id, a:key ==# 'bg' ? 'fg' : 'bg', a:kind)
endfunction
function! coc#highlight#get_hl_command(id, key, cterm, gui) abort
let cterm = coc#highlight#get_color(a:id, a:key, 'cterm')
let gui = coc#highlight#get_color(a:id, a:key, 'gui')
let cmd = ' cterm'.a:key.'=' . (empty(cterm) ? a:cterm : cterm)
let cmd .= ' gui'.a:key.'=' . (empty(gui) ? a:gui : gui)
return cmd
endfunction
function! coc#highlight#reversed(id) abort
let gui = has('gui_running') || &termguicolors == 1
if synIDattr(synIDtrans(a:id), 'reverse', gui ? 'gui' : 'cterm') == '1'
return 1
endif
return 0
endfunction
function! coc#highlight#get_contrast(group1, group2) abort
let bg1 = coc#highlight#get_hex_color(synIDtrans(hlID(a:group1)), 'bg', '#000000')
let bg2 = coc#highlight#get_hex_color(synIDtrans(hlID(a:group2)), 'bg', '#000000')
return coc#color#hex_contrast(bg1, bg2)
endfunction
" Darken or lighten background
function! coc#highlight#create_bg_command(group, amount) abort
let id = synIDtrans(hlID(a:group))
let bg = coc#highlight#get_hex_color(id, 'bg', &background ==# 'dark' ? '#282828' : '#fefefe')
let hex = a:amount > 0 ? coc#color#darken(bg, a:amount) : coc#color#lighten(bg, -a:amount)
return 'ctermbg=' . coc#color#rgb2term(strpart(hex, 1)).' guibg=' . hex
endfunction
function! coc#highlight#get_hex_color(id, kind, fallback) abort
let attr = coc#highlight#get_color(a:id, a:kind, s:term ? 'cterm' : 'gui')
let hex = s:to_hex_color(attr, s:term)
if empty(hex) && !s:term
let attr = coc#highlight#get_color(a:id, a:kind, 'cterm')
let hex = s:to_hex_color(attr, 1)
endif
return empty(hex) ? a:fallback : hex
endfunction
function! s:to_hex_color(color, term) abort
if empty(a:color)
return ''
endif
if a:color =~# '^#\x\+$'
return a:color
endif
if a:term && a:color =~# '^\d\+$'
return coc#color#term2rgb(a:color)
endif
let hex = coc#color#nameToHex(tolower(a:color), a:term)
return empty(hex) ? '' : hex
endfunction
" add matches for winid, use 0 for current window. " add matches for winid, use 0 for current window.
function! coc#highlight#match_ranges(winid, bufnr, ranges, hlGroup, priority) abort function! coc#highlight#match_ranges(winid, bufnr, ranges, hlGroup, priority) abort
let winid = a:winid == 0 ? win_getid() : a:winid let winid = a:winid == 0 ? win_getid() : a:winid
@ -694,6 +762,9 @@ function! s:to_group(items) abort
endfunction endfunction
function! s:get_priority(key, hlGroup, priority) abort function! s:get_priority(key, hlGroup, priority) abort
if a:hlGroup ==# 'CocListSearch'
return 2048
endif
if a:hlGroup ==# 'CocSearch' if a:hlGroup ==# 'CocSearch'
return 999 return 999
endif endif

View File

@ -192,6 +192,7 @@ function! coc#list#preview(lines, config) abort
let filetype = get(s:filetype_map, extname, '') let filetype = get(s:filetype_map, extname, '')
endif endif
let range = get(a:config, 'range', v:null) let range = get(a:config, 'range', v:null)
let targetRange = get(a:config, 'targetRange', v:null)
let hlGroup = get(a:config, 'hlGroup', 'Search') let hlGroup = get(a:config, 'hlGroup', 'Search')
let lnum = get(a:config, 'lnum', 1) let lnum = get(a:config, 'lnum', 1)
let position = get(a:config, 'position', 'below') let position = get(a:config, 'position', 'below')
@ -261,7 +262,13 @@ function! coc#list#preview(lines, config) abort
call coc#compat#execute(winid, 'nnoremap <silent><nowait><buffer> <esc> :call CocActionAsync("listCancel")<CR>') call coc#compat#execute(winid, 'nnoremap <silent><nowait><buffer> <esc> :call CocActionAsync("listCancel")<CR>')
endif endif
if !empty(range) if !empty(range)
call sign_place(1, 'CocCursorLine', 'CocCurrentLine', bufnr, {'lnum': lnum}) if !empty(targetRange)
for lnum in range(targetRange['start']['line'] + 1, targetRange['end']['line'] + 1)
call sign_place(0, 'CocCursorLine', 'CocListCurrent', bufnr, {'lnum': lnum})
endfor
else
call sign_place(0, 'CocCursorLine', 'CocCurrentLine', bufnr, {'lnum': lnum})
endif
call coc#highlight#match_ranges(winid, bufnr, [range], hlGroup, 10) call coc#highlight#match_ranges(winid, bufnr, [range], hlGroup, 10)
endif endif
endfunction endfunction

View File

@ -3,11 +3,22 @@ let s:is_vim = !has('nvim')
let s:pum_bufnr = 0 let s:pum_bufnr = 0
let s:pum_winid = 0 let s:pum_winid = 0
let s:pum_index = -1 let s:pum_index = -1
let s:pum_size = 0
let s:inserted = 0 let s:inserted = 0
let s:virtual_text = 0 let s:virtual_text = 0
let s:virtual_text_ns = 0 let s:virtual_text_ns = coc#highlight#create_namespace('pum-virtual')
let s:ignore = s:is_vim || has('nvim-0.5.0') ? "\<Ignore>" : "\<space>\<bs>" let s:ignore = s:is_vim || has('nvim-0.5.0') ? "\<Ignore>" : "\<space>\<bs>"
let s:hide_pum = has('nvim-0.6.1') || has('patch-8.2.3389') let s:hide_pum = has('nvim-0.6.1') || has('patch-8.2.3389')
let s:virtual_text_support = has('nvim-0.5.0') || has('patch-9.0.0067')
let s:prop_id = 0
let s:reversed = 0
let s:check_hl_group = 0
if s:is_vim && s:virtual_text_support
if empty(prop_type_get('CocPumVirtualText'))
call prop_type_add('CocPumVirtualText', {'highlight': 'CocPumVirtualText'})
endif
endif
function! coc#pum#visible() abort function! coc#pum#visible() abort
if !s:pum_winid if !s:pum_winid
@ -94,6 +105,7 @@ function! s:close_pum() abort
call s:clear_virtual_text() call s:clear_virtual_text()
call coc#float#close(s:pum_winid) call coc#float#close(s:pum_winid)
let s:pum_winid = 0 let s:pum_winid = 0
let s:pum_size = 0
let winid = coc#float#get_float_by_kind('pumdetail') let winid = coc#float#get_float_by_kind('pumdetail')
if winid if winid
call coc#float#close(winid) call coc#float#close(winid)
@ -133,8 +145,7 @@ function! coc#pum#select(index, insert, confirm) abort
call coc#pum#close('cancel') call coc#pum#close('cancel')
return '' return ''
endif endif
let total = coc#compat#buf_line_count(s:pum_bufnr) if a:index < 0 || a:index >= s:pum_size
if a:index < 0 || a:index >= total
throw 'index out of range ' . a:index throw 'index out of range ' . a:index
endif endif
call s:select_by_index(a:index, a:insert) call s:select_by_index(a:index, a:insert)
@ -146,7 +157,6 @@ endfunction
function! coc#pum#info() abort function! coc#pum#info() abort
let bufnr = winbufnr(s:pum_winid) let bufnr = winbufnr(s:pum_winid)
let size = coc#compat#buf_line_count(bufnr)
let words = getwinvar(s:pum_winid, 'words', []) let words = getwinvar(s:pum_winid, 'words', [])
let word = s:pum_index < 0 ? '' : get(words, s:pum_index, '') let word = s:pum_index < 0 ? '' : get(words, s:pum_index, '')
if s:is_vim if s:is_vim
@ -161,9 +171,10 @@ function! coc#pum#info() abort
\ 'col': pos['col'] - 1, \ 'col': pos['col'] - 1,
\ 'width': pos['width'] + add, \ 'width': pos['width'] + add,
\ 'height': pos['height'], \ 'height': pos['height'],
\ 'size': size, \ 'size': s:pum_size,
\ 'border': border, \ 'border': border,
\ 'inserted': s:inserted ? v:true : v:false, \ 'inserted': s:inserted ? v:true : v:false,
\ 'reversed': s:reversed ? v:true : v:false,
\ } \ }
else else
let scrollbar = coc#float#get_related(s:pum_winid, 'scrollbar') let scrollbar = coc#float#get_related(s:pum_winid, 'scrollbar')
@ -177,19 +188,19 @@ function! coc#pum#info() abort
\ 'col': pos[1], \ 'col': pos[1],
\ 'width': nvim_win_get_width(winid), \ 'width': nvim_win_get_width(winid),
\ 'height': nvim_win_get_height(winid), \ 'height': nvim_win_get_height(winid),
\ 'size': size, \ 'size': s:pum_size,
\ 'border': winid != s:pum_winid, \ 'border': winid != s:pum_winid,
\ 'inserted': s:inserted ? v:true : v:false, \ 'inserted': s:inserted ? v:true : v:false,
\ 'reversed': s:reversed ? v:true : v:false,
\ } \ }
endif endif
endfunction endfunction
function! coc#pum#scroll(forward) abort function! coc#pum#scroll(forward) abort
if coc#pum#visible() if coc#pum#visible()
let size = coc#compat#buf_line_count(s:pum_bufnr)
let height = s:get_height(s:pum_winid) let height = s:get_height(s:pum_winid)
if size > height if s:pum_size > height
call timer_start(10, { -> s:scroll_pum(a:forward, height, size)}) call timer_start(10, { -> s:scroll_pum(a:forward, height, s:pum_size)})
endif endif
endif endif
return s:ignore return s:ignore
@ -249,7 +260,8 @@ function! s:navigate(next, insert) abort
endfunction endfunction
function! s:select_by_index(index, insert) abort function! s:select_by_index(index, insert) abort
call s:set_cursor(s:pum_winid, a:index + 1) let lnum = a:index == -1 ? 0 : s:index_to_lnum(a:index)
call s:set_cursor(s:pum_winid, lnum)
if !s:is_vim if !s:is_vim
call coc#float#nvim_scrollbar(s:pum_winid) call coc#float#nvim_scrollbar(s:pum_winid)
endif endif
@ -270,11 +282,10 @@ function! s:select_by_index(index, insert) abort
endfunction endfunction
function! s:get_index(next) abort function! s:get_index(next) abort
let size = coc#compat#buf_line_count(s:pum_bufnr)
if a:next if a:next
let index = s:pum_index + 1 == size ? -1 : s:pum_index + 1 let index = s:pum_index + 1 == s:pum_size ? -1 : s:pum_index + 1
else else
let index = s:pum_index == -1 ? size - 1 : s:pum_index - 1 let index = s:pum_index == -1 ? s:pum_size - 1 : s:pum_index - 1
endif endif
return index return index
endfunction endfunction
@ -290,9 +301,9 @@ function! s:insert_word(word) abort
if saved_completeopt =~ 'menuone' if saved_completeopt =~ 'menuone'
noa set completeopt=menu noa set completeopt=menu
endif endif
noa call complete(strlen(parts[0]) + 1, [a:word]) noa call complete(strlen(parts[0]) + 1, [{ 'empty': v:true, 'word': a:word }])
" exit complete state
if s:hide_pum if s:hide_pum
" exit complete state
call feedkeys("\<C-x>\<C-z>", 'in') call feedkeys("\<C-x>\<C-z>", 'in')
else else
let g:coc_disable_space_report = 1 let g:coc_disable_space_report = 1
@ -320,20 +331,25 @@ function! coc#pum#create(lines, opt, config) abort
if empty(config) if empty(config)
return return
endif endif
let s:virtual_text = has('nvim-0.5.0') && a:opt['virtualText'] let s:reversed = get(a:config, 'reverse', 0) && config['row'] < 0
if s:virtual_text && !s:virtual_text_ns let s:virtual_text = s:virtual_text_support && a:opt['virtualText']
let s:virtual_text_ns = coc#highlight#create_namespace('pum-virtual') let s:pum_size = len(a:lines)
endif let s:pum_index = a:opt['index']
let selected = a:opt['index'] + 1 let lnum = s:index_to_lnum(s:pum_index)
call extend(config, { call extend(config, {
\ 'lines': a:lines, \ 'lines': s:reversed ? reverse(copy(a:lines)) : a:lines,
\ 'relative': 'cursor', \ 'relative': 'cursor',
\ 'nopad': 1, \ 'nopad': 1,
\ 'cursorline': 1, \ 'cursorline': 1,
\ 'index': a:opt['index'], \ 'index': lnum - 1,
\ 'focusable': v:false \ 'focusable': v:false
\ }) \ })
call extend(config, coc#dict#pick(a:config, ['highlight', 'rounded', 'highlights', 'winblend', 'shadow', 'border', 'borderhighlight'])) call extend(config, coc#dict#pick(a:config, ['highlight', 'rounded', 'highlights', 'winblend', 'shadow', 'border', 'borderhighlight']))
if s:reversed
for item in config['highlights']
let item['lnum'] = s:pum_size - item['lnum'] - 1
endfor
endif
if empty(get(config, 'winblend', 0)) && exists('&pumblend') if empty(get(config, 'winblend', 0)) && exists('&pumblend')
let config['winblend'] = &pumblend let config['winblend'] = &pumblend
endif endif
@ -345,26 +361,22 @@ function! coc#pum#create(lines, opt, config) abort
let s:pum_winid = result[0] let s:pum_winid = result[0]
let s:pum_bufnr = result[1] let s:pum_bufnr = result[1]
call setwinvar(s:pum_winid, 'above', config['row'] < 0) call setwinvar(s:pum_winid, 'above', config['row'] < 0)
let lnum = max([1, a:opt['index'] + 1]) let firstline = s:get_firstline(lnum, s:pum_size, config['height'])
if s:is_vim if s:is_vim
call popup_setoptions(s:pum_winid, { call popup_setoptions(s:pum_winid, { 'firstline': firstline })
\ 'firstline': s:get_firstline(lnum, len(a:lines), config['height'])
\ })
else else
let firstline = s:get_firstline(lnum, len(a:lines), config['height'])
call coc#compat#execute(s:pum_winid, 'call winrestview({"lnum":'.lnum.',"topline":'.firstline.'})') call coc#compat#execute(s:pum_winid, 'call winrestview({"lnum":'.lnum.',"topline":'.firstline.'})')
endif endif
let s:pum_index = get(config, 'index', -1) call coc#dialog#place_sign(s:pum_bufnr, s:pum_index == -1 ? 0 : lnum)
call coc#dialog#place_sign(s:pum_bufnr, s:pum_index + 1)
call setwinvar(s:pum_winid, 'kind', 'pum')
" content before col and content after cursor " content before col and content after cursor
let linetext = getline('.') let linetext = getline('.')
let parts = [strpart(linetext, 0, a:opt['col']), strpart(linetext, col('.') - 1)] let parts = [strpart(linetext, 0, a:opt['col']), strpart(linetext, col('.') - 1)]
call setwinvar(s:pum_winid, 'input', input) call setwinvar(s:pum_winid, 'input', input)
call setwinvar(s:pum_winid, 'parts', parts) call setwinvar(s:pum_winid, 'parts', parts)
call setwinvar(s:pum_winid, 'words', a:opt['words']) call setwinvar(s:pum_winid, 'words', a:opt['words'])
call setwinvar(s:pum_winid, 'kind', 'pum')
if !s:is_vim if !s:is_vim
if len(a:lines) > config['height'] if s:pum_size > config['height']
redraw redraw
call coc#float#nvim_scrollbar(s:pum_winid) call coc#float#nvim_scrollbar(s:pum_winid)
else else
@ -383,7 +395,7 @@ endfunction
function! s:on_pum_change(move) abort function! s:on_pum_change(move) abort
if coc#float#valid(s:pum_winid) if coc#float#valid(s:pum_winid)
if s:virtual_text_ns if s:virtual_text
call s:insert_virtual_text() call s:insert_virtual_text()
endif endif
let ev = extend(coc#pum#info(), {'move': a:move ? v:true : v:false}) let ev = extend(coc#pum#info(), {'move': a:move ? v:true : v:false})
@ -391,6 +403,16 @@ function! s:on_pum_change(move) abort
endif endif
endfunction endfunction
function! s:index_to_lnum(index) abort
if s:reversed
if a:index <= 0
return s:pum_size
endif
return s:pum_size - a:index
endif
return max([1, a:index + 1])
endfunction
function! s:get_pum_dimension(lines, col, config) abort function! s:get_pum_dimension(lines, col, config) abort
let linecount = len(a:lines) let linecount = len(a:lines)
let [lineIdx, colIdx] = coc#cursor#screen_pos() let [lineIdx, colIdx] = coc#cursor#screen_pos()
@ -403,7 +425,7 @@ function! s:get_pum_dimension(lines, col, config) abort
let pumheight = empty(&pumheight) ? vh : &pumheight let pumheight = empty(&pumheight) ? vh : &pumheight
let showTop = getwinvar(s:pum_winid, 'above', v:null) let showTop = getwinvar(s:pum_winid, 'above', v:null)
if type(showTop) != v:t_number if type(showTop) != v:t_number
if vh - lineIdx - bh - 1 < min([pumheight, linecount]) && lineIdx > vh - lineIdx if vh - lineIdx - bh - 1 < min([pumheight, linecount]) && vh - lineIdx < min([10, vh/2])
let showTop = 1 let showTop = 1
else else
let showTop = 0 let showTop = 0
@ -433,63 +455,87 @@ endfunction
function! s:set_cursor(winid, line) abort function! s:set_cursor(winid, line) abort
if s:is_vim if s:is_vim
let pos = popup_getpos(a:winid) let pos = popup_getpos(a:winid)
let lastline = pos['firstline'] + pos['core_height'] - 1 let core_height = pos['core_height']
let lastline = pos['firstline'] + core_height - 1
if a:line > lastline if a:line > lastline
call popup_setoptions(a:winid, { call popup_setoptions(a:winid, {
\ 'firstline': pos['firstline'] + a:line - lastline, \ 'firstline': pos['firstline'] + a:line - lastline,
\ }) \ })
elseif a:line < pos['firstline'] elseif a:line < pos['firstline']
call popup_setoptions(a:winid, { if s:reversed
\ 'firstline': max([1, a:line]), call popup_setoptions(a:winid, {
\ }) \ 'firstline': a:line == 0 ? s:pum_size - core_height + 1 : a:line - core_height + 1,
\ })
else
call popup_setoptions(a:winid, {
\ 'firstline': max([1, a:line]),
\ })
endif
endif endif
endif endif
call s:select_line(a:winid, a:line) call s:select_line(a:winid, a:line)
endfunction endfunction
function! s:select_line(winid, line) abort function! s:select_line(winid, line) abort
let s:pum_index = a:line - 1 let s:pum_index = s:reversed ? (a:line == 0 ? -1 : s:pum_size - a:line) : a:line - 1
let lnum = max([1, a:line]) let lnum = s:reversed ? (a:line == 0 ? s:pum_size : a:line) : max([1, a:line])
if s:is_vim if s:is_vim
call coc#compat#execute(a:winid, 'exe '.lnum) call coc#compat#execute(a:winid, 'exe '.lnum)
else else
call nvim_win_set_cursor(a:winid, [lnum, 0]) call nvim_win_set_cursor(a:winid, [lnum, 0])
endif endif
call coc#dialog#place_sign(winbufnr(a:winid), a:line) call coc#dialog#place_sign(s:pum_bufnr, a:line == 0 ? 0 : lnum)
endfunction endfunction
function! s:insert_virtual_text() abort function! s:insert_virtual_text() abort
if !s:virtual_text_ns
return
endif
let bufnr = bufnr('%') let bufnr = bufnr('%')
if !s:virtual_text || !coc#pum#visible() || s:pum_index < 0 if !s:virtual_text || s:pum_index < 0
call nvim_buf_clear_namespace(bufnr, s:virtual_text_ns, 0, -1) call s:clear_virtual_text()
else else
" Check if could create " Check if could create
let insert = '' let insert = ''
let line = line('.') - 1
let words = getwinvar(s:pum_winid, 'words', []) let words = getwinvar(s:pum_winid, 'words', [])
let word = get(words, s:pum_index, '') let word = get(words, s:pum_index, '')
let parts = getwinvar(s:pum_winid, 'parts', []) let parts = getwinvar(s:pum_winid, 'parts', [])
let input = strpart(getline('.'), strlen(parts[0]), col('.') - 1) let start = strlen(parts[0])
let input = strpart(getline('.'), start, col('.') - 1 - start)
if strchars(word) > strchars(input) && strcharpart(word, 0, strchars(input)) ==# input if strchars(word) > strchars(input) && strcharpart(word, 0, strchars(input)) ==# input
let insert = strcharpart(word, strchars(input)) let insert = strcharpart(word, strchars(input))
endif endif
call nvim_buf_clear_namespace(bufnr, s:virtual_text_ns, 0, -1) if s:is_vim
if !empty(insert) if s:prop_id != 0
let opts = { call prop_remove({'id': s:prop_id}, line + 1, line + 1)
\ 'hl_mode': 'combine', endif
\ 'virt_text': [[insert, 'CocPumVirtualText']], if !empty(insert)
\ 'virt_text_pos': 'overlay', let s:prop_id = prop_add(line + 1, col('.'), {
\ 'virt_text_win_col': virtcol('.') - 1, \ 'text': insert,
\ } \ 'type': 'CocPumVirtualText'
call nvim_buf_set_extmark(bufnr, s:virtual_text_ns, line('.') - 1, col('.') - 1, opts) \ })
endif
else
call nvim_buf_clear_namespace(bufnr, s:virtual_text_ns, line, line + 1)
if !empty(insert)
let opts = {
\ 'hl_mode': 'combine',
\ 'virt_text': [[insert, 'CocPumVirtualText']],
\ 'virt_text_pos': 'overlay',
\ 'virt_text_win_col': virtcol('.') - 1,
\ }
call nvim_buf_set_extmark(bufnr, s:virtual_text_ns, line, col('.') - 1, opts)
endif
endif endif
endif endif
endfunction endfunction
function! s:clear_virtual_text() abort function! s:clear_virtual_text() abort
if s:virtual_text_ns if s:virtual_text_support
call nvim_buf_clear_namespace(bufnr('%'), s:virtual_text_ns, 0, -1) if s:is_vim
if s:prop_id != 0
call prop_remove({'id': s:prop_id})
endif
else
call nvim_buf_clear_namespace(bufnr('%'), s:virtual_text_ns, 0, -1)
endif
endif endif
endfunction endfunction

View File

@ -27,12 +27,16 @@ function! coc#snippet#_select_mappings()
snoremap <c-r> <c-g>"_c<c-r> snoremap <c-r> <c-g>"_c<c-r>
endfunction endfunction
function! coc#snippet#show_choices(lnum, col, len, values) abort function! coc#snippet#cursor(lnum, col) abort
let m = mode() let m = mode()
call cursor(a:lnum, a:col + a:len) call cursor(a:lnum, a:col)
if m !=# 'i' if m !=# 'i'
call feedkeys("\<Esc>i", 'in') call feedkeys("\<Esc>i", 'in')
endif endif
endfunction
function! coc#snippet#show_choices(lnum, col, len, values) abort
call coc#snippet#cursor(a:lnum, a:col + a:len)
let changedtick = b:changedtick let changedtick = b:changedtick
call timer_start(20, { -> coc#_do_complete(a:col - 1, a:values, 0, changedtick)}) call timer_start(20, { -> coc#_do_complete(a:col - 1, a:values, 0, changedtick)})
redraw redraw

View File

@ -39,33 +39,35 @@ function! coc#string#reflow(lines, width) abort
return empty(lines) ? [''] : lines return empty(lines) ? [''] : lines
endfunction endfunction
" Used when 'wrap' and 'linebreak' is enabled
function! coc#string#content_height(lines, width) abort function! coc#string#content_height(lines, width) abort
let len = 0 let len = 0
let pattern = empty(&breakat) ? '.\zs' : '['.substitute(&breakat, '\([\[\]]\)', '\\\1', 'g').']\zs'
for line in a:lines for line in a:lines
if strwidth(line) <= a:width if strwidth(line) <= a:width
let len = len + 1 let len += 1
else else
let currlen = 0 let currlen = 0
for part in split(line, '\<\|\>\|\ze\s') for part in split(line, pattern)
let w = strwidth(part) let wl = strwidth(part)
if currlen + w >= a:width if currlen == 0 && wl > 0
if currlen + w == a:width let len += 1
let len = len + 1 endif
let currlen = 0 let delta = currlen + wl - a:width
else if delta >= 0
let len = len + (a:width + w)/a:width let len = len + (delta > 0)
let currlen = w%a:width let currlen = delta == 0 ? 0 : wl
if wl >= a:width
let currlen = wl%a:width
let len += float2nr(ceil(wl/(a:width + 0.0))) - (currlen == 0)
endif endif
else else
let currlen = currlen + w let currlen = currlen + wl
endif endif
endfor endfor
if currlen > 0
let len = len + 1
endif
endif endif
endfor endfor
return len == 0 ? 1 : len return len
endfunction endfunction
" get change between two lines " get change between two lines

View File

@ -3,22 +3,21 @@ let s:is_win = has('win32') || has('win64')
let s:is_mac = has('mac') let s:is_mac = has('mac')
let s:sign_api = exists('*sign_getplaced') && exists('*sign_place') let s:sign_api = exists('*sign_getplaced') && exists('*sign_place')
let s:sign_groups = [] let s:sign_groups = []
let s:outline_preview_bufnr = 0
" Check <Tab> and <CR> " Check <Tab> and <CR>
function! coc#ui#check_pum_keymappings() abort function! coc#ui#check_pum_keymappings() abort
for key in ['<cr>', '<tab>', '<c-y>'] for key in ['<cr>', '<tab>', '<c-y>', '<s-tab>']
let lhs = maparg(key, 'i') let arg = maparg(key, 'i', 0, 1)
if lhs =~# '\<pumvisible()' && lhs !~# '\<coc#pum#visible()' if get(arg, 'expr', 0)
let lines = [ let rhs = get(arg, 'rhs', '')
\ 'coc.nvim switched to custom popup menu from 0.0.82', if rhs =~# '\<pumvisible()' && rhs !~# '\<coc#pum#visible()'
\ 'you have to change key-mapping of '.key.' to make it work.', let rhs = substitute(rhs, '\Cpumvisible()', 'coc#pum#visible()', 'g')
\ 'checkout current key-mapping by ":verbose imap '.key.'"', let rhs = substitute(rhs, '\c"\\<C-n>"', 'coc#pum#next(1)', '')
\ 'checkout documentation by ":h coc-completion"'] let rhs = substitute(rhs, '\c"\\<C-p>"', 'coc#pum#prev(1)', '')
call coc#notify#create(lines, { let rhs = substitute(rhs, '\c"\\<C-y>"', 'coc#pum#confirm()', '')
\ 'borderhighlight': 'CocInfoSign', execute 'inoremap <silent><nowait><expr> '.arg['lhs'].' '.rhs
\ 'timeout': 30000, endif
\ 'kind': 'warning',
\ })
endif endif
endfor endfor
endfunction endfunction
@ -407,38 +406,66 @@ function! coc#ui#update_signs(bufnr, group, signs) abort
if !s:sign_api || !bufloaded(a:bufnr) if !s:sign_api || !bufloaded(a:bufnr)
return return
endif endif
if len(a:signs) call sign_unplace(a:group, {'buffer': a:bufnr})
call add(s:sign_groups, a:group) for def in a:signs
endif let opts = {'lnum': def['lnum']}
let current = get(get(sign_getplaced(a:bufnr, {'group': a:group}), 0, {}), 'signs', []) if has_key(def, 'priority')
let exists = [] let opts['priority'] = def['priority']
let unplaceList = []
for item in current
let index = 0
let placed = 0
for def in a:signs
if def['name'] ==# item['name'] && def['lnum'] == item['lnum']
let placed = 1
call add(exists, index)
break
endif
let index = index + 1
endfor
if !placed
call add(unplaceList, item['id'])
endif endif
endfor call sign_place(0, a:group, def['name'], a:bufnr, opts)
for idx in range(0, len(a:signs) - 1)
if index(exists, idx) == -1
let def = a:signs[idx]
let opts = {'lnum': def['lnum']}
if has_key(def, 'priority')
let opts['priority'] = def['priority']
endif
call sign_place(0, a:group, def['name'], a:bufnr, opts)
endif
endfor
for id in unplaceList
call sign_unplace(a:group, {'buffer': a:bufnr, 'id': id})
endfor endfor
endfunction endfunction
function! coc#ui#outline_preview(config) abort
let view_id = get(w:, 'cocViewId', '')
if view_id !=# 'OUTLINE'
return
endif
let wininfo = get(getwininfo(win_getid()), 0, v:null)
if empty(wininfo)
return
endif
let border = get(a:config, 'border', v:true)
let th = &lines - &cmdheight - 2
let range = a:config['range']
let height = min([range['end']['line'] - range['start']['line'] + 1, th - 4])
let to_left = &columns - wininfo['wincol'] - wininfo['width'] < wininfo['wincol']
let start_lnum = range['start']['line'] + 1
let end_lnum = range['end']['line'] + 1 - start_lnum > &lines ? start_lnum + &lines : range['end']['line'] + 1
let lines = getbufline(a:config['bufnr'], start_lnum, end_lnum)
let content_width = max(map(copy(lines), 'strdisplaywidth(v:val)'))
let width = min([content_width, a:config['maxWidth'], to_left ? wininfo['wincol'] - 3 : &columns - wininfo['wincol'] - wininfo['width']])
let filetype = getbufvar(a:config['bufnr'], '&filetype')
let cursor_row = coc#cursor#screen_pos()[0]
let config = {
\ 'relative': 'editor',
\ 'row': cursor_row - 1 + height < th ? cursor_row - (border ? 1 : 0) : th - height - (border ? 1 : -1),
\ 'col': to_left ? wininfo['wincol'] - 4 - width : wininfo['wincol'] + wininfo['width'],
\ 'width': width,
\ 'height': height,
\ 'lines': lines,
\ 'border': border ? [1,1,1,1] : v:null,
\ 'rounded': get(a:config, 'rounded', 1) ? 1 : 0,
\ 'winblend': a:config['winblend'],
\ 'highlight': a:config['highlight'],
\ 'borderhighlight': a:config['borderhighlight'],
\ }
let winid = coc#float#get_float_by_kind('outline-preview')
let result = coc#float#create_float_win(winid, s:outline_preview_bufnr, config)
if empty(result)
return v:null
endif
call setwinvar(result[0], 'kind', 'outline-preview')
let s:outline_preview_bufnr = result[1]
if !empty(filetype)
call coc#compat#execute(result[0], 'setfiletype '.filetype)
endif
return result[1]
endfunction
function! coc#ui#outline_close_preview() abort
let winid = coc#float#get_float_by_kind('outline-preview')
if winid
call coc#float#close(winid)
endif
endfunction

View File

@ -2,7 +2,7 @@ scriptencoding utf-8
let s:root = expand('<sfile>:h:h:h') let s:root = expand('<sfile>:h:h:h')
let s:is_win = has('win32') || has('win64') let s:is_win = has('win32') || has('win64')
let s:is_vim = !has('nvim') let s:is_vim = !has('nvim')
let s:vim_api_version = 31 let s:vim_api_version = 32
function! coc#util#remote_fns(name) function! coc#util#remote_fns(name)
let fns = ['init', 'complete', 'should_complete', 'refresh', 'get_startcol', 'on_complete', 'on_enter'] let fns = ['init', 'complete', 'should_complete', 'refresh', 'get_startcol', 'on_complete', 'on_enter']
@ -116,9 +116,6 @@ function! coc#util#check_refresh(bufnr)
if getbufvar(a:bufnr, 'coc_diagnostic_disable', 0) if getbufvar(a:bufnr, 'coc_diagnostic_disable', 0)
return 0 return 0
endif endif
if get(g: , 'EasyMotion_loaded', 0)
return EasyMotion#is_active() != 1
endif
return 1 return 1
endfunction endfunction
@ -294,7 +291,6 @@ function! coc#util#vim_info()
\ 'pid': coc#util#getpid(), \ 'pid': coc#util#getpid(),
\ 'filetypeMap': get(g:, 'coc_filetype_map', {}), \ 'filetypeMap': get(g:, 'coc_filetype_map', {}),
\ 'version': coc#util#version(), \ 'version': coc#util#version(),
\ 'completeOpt': &completeopt,
\ 'pumevent': 1, \ 'pumevent': 1,
\ 'isVim': has('nvim') ? v:false : v:true, \ 'isVim': has('nvim') ? v:false : v:true,
\ 'isCygwin': has('win32unix') ? v:true : v:false, \ 'isCygwin': has('win32unix') ? v:true : v:false,
@ -309,12 +305,13 @@ function! coc#util#vim_info()
\ 'guicursor': &guicursor, \ 'guicursor': &guicursor,
\ 'pumwidth': exists('&pumwidth') ? &pumwidth : 15, \ 'pumwidth': exists('&pumwidth') ? &pumwidth : 15,
\ 'tabCount': tabpagenr('$'), \ 'tabCount': tabpagenr('$'),
\ 'updateHighlight': has('nvim-0.5.0') || has('patch-8.1.1719') ? v:true : v:false, \ 'updateHighlight': has('nvim-0.5.0') || has('textprop') ? v:true : v:false,
\ 'vimCommands': get(g:, 'coc_vim_commands', []), \ 'vimCommands': get(g:, 'coc_vim_commands', []),
\ 'sign': exists('*sign_place') && exists('*sign_unplace'), \ 'sign': exists('*sign_place') && exists('*sign_unplace'),
\ 'ambiguousIsNarrow': &ambiwidth ==# 'single' ? v:true : v:false, \ 'ambiguousIsNarrow': &ambiwidth ==# 'single' ? v:true : v:false,
\ 'textprop': has('textprop') && has('patch-8.1.1719') && !has('nvim') ? v:true : v:false, \ 'textprop': has('textprop') ? v:true : v:false,
\ 'dialog': has('nvim-0.4.0') || has('patch-8.2.0750') ? v:true : v:false, \ 'virtualText': has('nvim-0.5.0') || has('patch-9.0.0067') ? v:true : v:false,
\ 'dialog': has('nvim-0.4.0') || has('popupwin') ? v:true : v:false,
\ 'semanticHighlights': coc#util#semantic_hlgroups() \ 'semanticHighlights': coc#util#semantic_hlgroups()
\} \}
endfunction endfunction
@ -475,26 +472,23 @@ function! coc#util#get_indentkeys() abort
return &indentkeys return &indentkeys
endfunction endfunction
function! coc#util#get_bufoptions(bufnr) abort function! coc#util#get_bufoptions(bufnr, max) abort
if !bufloaded(a:bufnr) | return v:null | endif if !bufloaded(a:bufnr) | return v:null | endif
let bufname = bufname(a:bufnr) let bufname = bufname(a:bufnr)
let buftype = getbufvar(a:bufnr, '&buftype') let buftype = getbufvar(a:bufnr, '&buftype')
let winid = bufwinid(a:bufnr) let size = coc#util#bufsize(a:bufnr)
let size = -1
if bufnr('%') == a:bufnr
let size = line2byte(line("$") + 1)
elseif !empty(bufname)
let size = getfsize(bufname)
endif
let lines = v:null let lines = v:null
if getbufvar(a:bufnr, 'coc_enabled', 1) && (buftype == '' || buftype == 'acwrite') && size < get(g:, 'coc_max_filesize', 2097152) if getbufvar(a:bufnr, 'coc_enabled', 1)
\ && (buftype == '' || buftype == 'acwrite' || getbufvar(a:bufnr, 'coc_force_attach', 0))
\ && size != -2
\ && size < a:max
let lines = getbufline(a:bufnr, 1, '$') let lines = getbufline(a:bufnr, 1, '$')
endif endif
return { return {
\ 'bufnr': a:bufnr, \ 'bufnr': a:bufnr,
\ 'size': size, \ 'size': size,
\ 'lines': lines, \ 'lines': lines,
\ 'winid': winid, \ 'winid': bufwinid(a:bufnr),
\ 'bufname': bufname, \ 'bufname': bufname,
\ 'buftype': buftype, \ 'buftype': buftype,
\ 'previewwindow': v:false, \ 'previewwindow': v:false,
@ -508,6 +502,17 @@ function! coc#util#get_bufoptions(bufnr) abort
\} \}
endfunction endfunction
function! coc#util#bufsize(bufnr) abort
if bufnr('%') == a:bufnr
return line2byte(line("$") + 1)
endif
let bufname = bufname(a:bufnr)
if !getbufvar(a:bufnr, '&modified') && filereadable(bufname)
return getfsize(bufname)
endif
return strlen(join(getbufline(a:bufnr, 1, '$'), '\n'))
endfunction
function! coc#util#get_config_home() function! coc#util#get_config_home()
if !empty(get(g:, 'coc_config_home', '')) if !empty(get(g:, 'coc_config_home', ''))
return resolve(expand(g:coc_config_home)) return resolve(expand(g:coc_config_home))
@ -564,8 +569,13 @@ function! coc#util#get_complete_option()
let line = getline(pos[1]) let line = getline(pos[1])
let input = matchstr(strpart(line, 0, pos[2] - 1), '\k*$') let input = matchstr(strpart(line, 0, pos[2] - 1), '\k*$')
let col = pos[2] - strlen(input) let col = pos[2] - strlen(input)
let position = {
\ 'line': line('.')-1,
\ 'character': strchars(strpart(getline('.'), 0, col('.') - 1))
\ }
return { return {
\ 'word': matchstr(strpart(line, col - 1), '^\k\+'), \ 'word': matchstr(strpart(line, col - 1), '^\k\+'),
\ 'position': position,
\ 'input': empty(input) ? '' : input, \ 'input': empty(input) ? '' : input,
\ 'line': line, \ 'line': line,
\ 'filetype': &filetype, \ 'filetype': &filetype,

View File

@ -0,0 +1,36 @@
let s:is_vim = !has('nvim')
let s:virtual_text_support = has('nvim-0.5.0') || has('patch-9.0.0067')
let s:text_options = has('patch-9.0.0121')
" opts.hl_mode default to 'combine'.
" opts.col not used on neovim.
" opts.virt_text_win_col neovim only.
" opts.text_align could be 'after' 'right' 'below', vim9 only.
" opts.text_wrap could be 'wrap' and 'truncate', vim9 only.
function! coc#vtext#add(bufnr, src_id, line, blocks, opts) abort
if !s:virtual_text_support
return
endif
if s:is_vim
for [text, hl] in a:blocks
let type = coc#api#create_type(a:src_id, hl, a:opts)
let column = get(a:opts, 'col', 0)
let opts = { 'text': text, 'type': type }
if s:text_options && column == 0
let opts['text_align'] = get(a:opts, 'text_align', 'after')
let opts['text_wrap'] = get(a:opts, 'text_wrap', 'truncate')
endif
call prop_add(a:line + 1, column, opts)
endfor
else
let opts = {
\ 'virt_text': a:blocks,
\ 'hl_mode': get(a:opts, 'hl_mode', 'combine'),
\ }
if has('nvim-0.5.1') && has_key(a:opts, 'virt_text_win_col')
let opts['virt_text_win_col'] = a:opts['virt_text_win_col']
let opts['virt_text_pos'] = 'overlay'
endif
call nvim_buf_set_extmark(a:bufnr, a:src_id, a:line, 0, opts)
endif
endfunction

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,110 @@
# 2022-09-12
- All configurations are now scoped #4185
- No `onDidChangeConfiguration` event fired when workspace folder changed.
- Deprecated configuration `suggest.detailMaxLength`, use `suggest.labelMaxLength` instead.
- Deprecated configuration `inlayHint.filetypes`, use `inlayHint.enable` with scoped languages instead.
- Deprecated configuration `semanticTokens.filetypes`, use `semanticTokens.enable` with scoped languages instead.
- Use `workspaceFolderValue` instead of `workspaceValue` for `ConfigurationInspect` returned by `WorkspaceConfiguration.inspect()`.
# 2022-09-04
- Add configuration "snippet.choicesMenuPicker".
# 2022-09-03
- Send "WinClosed" event to node client.
- Add `onDidFilterStateChange` and `onDidCursorMoved` to `TreeView`.
- Support `autoPreview` for outline.
# 2022-09-02
- Support `diagnostic.virtualTextFormat`.
- Add command `workspace.writeHeapSnapshot`.
# 2022-09-01
- Add configuration "suggest.asciiMatch"
- Support `b:coc_force_attach`.
# 2022-08-31
- Add configuration "suggest.reversePumAboveCursor".
- Use `DiagnosticSign*` highlight groups when possible.
- Use `DiagnosticUnderline*` highlight groups when possible.
# 2022-08-30
- Export `LineBuilder` class.
# 2022-08-29
- Fix semanticTokens highlights unexpected cleared
- Fix range of `doQuickfix` action.
- Check reverse of `CocFloating`, use `border` and `Normal` highlight when reversed.
- Make `CocInlayHint` use background of `SignColumn`.
- Add command `document.toggleInlayHint`.
# 2022-08-28
- Make `CocMenuSel` use background of `PmenuSel`.
- Snippet related configuration changed (old configuration still works until next release)
- "coc.preferences.snippetStatusText" -> "snippet.statusText"
- "coc.preferences.snippetHighlight" -> "snippet.highlight"
- "coc.preferences.nextPlaceholderOnDelete" -> "snippet.nextPlaceholderOnDelete"
- Add configuration `"list.smartCase"`
- Add configurations for inlay hint
- "inlayHint.refreshOnInsertMode"
- "inlayHint.enableParameter"
- "inlayHint.typeSeparator"
- "inlayHint.parameterSeparator"
- "inlayHint.subSeparator"
# 2022-08-27
- Avoid use `EasyMotion#is_active`, use autocmd to disable linting.
- Show message when call hierarchy provider not found or bad position.
# 2022-08-26
- Remove `completeOpt` from `workspace.env`.
- Add configuration `"diagnostic.virtualTextAlign"`.
- Add warning when required features not compiled with vim.
- Not echo error for semanticTokens request (log only).
- Merge results form providers when possible.
# 2022-08-24
- Virtual text of suggest on vim9.
- Virtual text of diagnostics on vim9.
- Add configuration `inlayHint.filetypes`.
- Inlay hint support on vim9.
# 2022-08-23
- Retry semanticTokens request on server cancel (LSP 3.17).
- `RelativePattern` support for `workspace.createFileSystemWatcher()`.
- `relativePatternSupport` for `DidChangeWatchedFiles` (LSP 3.17).
- Not echo error on `doComplete()`.
# 2022-08-21
- Added `window.createFloatFactory()`, deprecated `FloatFactory` class.
- Support `labelDetails` field of `CompleteItem`(LSP 3.17).
- Added `triggerKind` to `CodeActionContext`, export `CodeActionTriggerKind`.
# 2022-08-20
- Support pull diagnostics `:h coc-pullDiagnostics`.
- Break change: avoid extension overwrite builtin configuration defaults.
- Change default value of configuration "diagnostic.format".
- 'line' changes to 'currline' for `CocAction('codeAction')`.
- Check NodeJS version on syntax error.
# 2022-08-10
- Change "notification.highlightGroup" default to "Normal".
# 2022-08-07 # 2022-08-07
- Add configuration 'suggest.pumFloatConfig'. - Add configuration 'suggest.pumFloatConfig'.
@ -481,7 +588,7 @@
- **Break change** logic for resolve workspace folder changed. - **Break change** logic for resolve workspace folder changed.
- Add `Task` module. - Add `Task` module.
- Add `getCurrentFunctionSymbol` action. - Add `getCurrentFunctionSymbol` action.
- Add `list.source.outline.ctagsFilestypes` setting. - Add `list.source.outline.ctagsFiletypes` setting.
- Add `suggest.disableMenu` and `suggest.disableMenu` settings. - Add `suggest.disableMenu` and `suggest.disableMenu` settings.
- Add `equal` support for complete items. - Add `equal` support for complete items.
- Add support for do action with visual select lines of list. - Add support for do action with visual select lines of list.

View File

@ -31,6 +31,14 @@ function! s:checkVersion() abort
echom "Note that some features may behave incorrectly." echom "Note that some features may behave incorrectly."
echohl None echohl None
sleep 2 sleep 2
elseif !has('nvim') && (!has('job') || !has('popupwin') || !has('textprop'))
echohl WarningMsg
echom "coc.nvim requires job, popupwin and textprop features of vim, consider recompile your vim."
echom "You can add this to your vimrc to avoid this message:"
echom " let g:coc_disable_startup_warning = 1"
echom "Note that some features may behave incorrectly."
echohl None
sleep 2
endif endif
endif endif
endif endif
@ -231,6 +239,15 @@ function! s:AddAnsiGroups() abort
endtry endtry
endfunction endfunction
function! s:CreateHighlight(group, fg, bg) abort
let cmd = coc#highlight#compose(a:fg, a:bg)
if !empty(trim(cmd))
exe 'hi default '.a:group.' '.cmd
else
exe 'hi default link '.a:group.' '.a:fg
endif
endfunction
function! s:CursorRangeFromSelected(type, ...) abort function! s:CursorRangeFromSelected(type, ...) abort
" add range by operator " add range by operator
call coc#rpc#request('cursorsSelect', [bufnr('%'), 'operator', a:type]) call coc#rpc#request('cursorsSelect', [bufnr('%'), 'operator', a:type])
@ -284,6 +301,12 @@ function! s:HandleWinScrolled(winid) abort
call s:Autocmd('WinScrolled', a:winid) call s:Autocmd('WinScrolled', a:winid)
endfunction endfunction
function! s:HandleWinClosed(winid) abort
call coc#float#on_close(a:winid)
call coc#notify#on_close(a:winid)
call s:Autocmd('WinClosed', a:winid)
endfunction
function! s:SyncAutocmd(...) function! s:SyncAutocmd(...)
if !get(g:, 'coc_workspace_initialized', 0) if !get(g:, 'coc_workspace_initialized', 0)
return return
@ -291,6 +314,14 @@ function! s:SyncAutocmd(...)
call coc#rpc#request('CocAutocmd', a:000) call coc#rpc#request('CocAutocmd', a:000)
endfunction endfunction
function! s:CheckHighlight() abort
let fgId = synIDtrans(hlID('CocSelectedText'))
let guifg = synIDattr(fgId, 'fg', 'gui')
if empty(guifg)
call s:Highlight()
endif
endfunction
function! s:Enable(initialize) function! s:Enable(initialize)
if get(g:, 'coc_enabled', 0) == 1 if get(g:, 'coc_enabled', 0) == 1
return return
@ -305,6 +336,11 @@ function! s:Enable(initialize)
elseif get(g:, 'coc_start_at_startup', 1) elseif get(g:, 'coc_start_at_startup', 1)
autocmd VimEnter * call coc#rpc#start_server() autocmd VimEnter * call coc#rpc#start_server()
endif endif
if v:vim_did_enter
call s:CheckHighlight()
else
autocmd VimEnter * call timer_start(0, { -> s:CheckHighlight()})
endif
if s:is_vim if s:is_vim
if exists('##DirChanged') if exists('##DirChanged')
autocmd DirChanged * call s:Autocmd('DirChanged', getcwd()) autocmd DirChanged * call s:Autocmd('DirChanged', getcwd())
@ -323,8 +359,7 @@ function! s:Enable(initialize)
autocmd CursorMoved list:///* call coc#list#select(bufnr('%'), line('.')) autocmd CursorMoved list:///* call coc#list#select(bufnr('%'), line('.'))
autocmd CursorHold * call coc#float#check_related() autocmd CursorHold * call coc#float#check_related()
if exists('##WinClosed') if exists('##WinClosed')
autocmd WinClosed * call coc#float#on_close(+expand('<amatch>')) autocmd WinClosed * call s:HandleWinClosed(+expand('<amatch>'))
autocmd WinClosed * call coc#notify#on_close(+expand('<amatch>'))
elseif exists('##TabEnter') elseif exists('##TabEnter')
autocmd TabEnter * call coc#notify#reflow() autocmd TabEnter * call coc#notify#reflow()
endif endif
@ -363,7 +398,7 @@ function! s:Enable(initialize)
autocmd VimLeavePre * call s:Autocmd('VimLeavePre') autocmd VimLeavePre * call s:Autocmd('VimLeavePre')
autocmd BufReadCmd,FileReadCmd,SourceCmd list://* call coc#list#setup(expand('<amatch>')) autocmd BufReadCmd,FileReadCmd,SourceCmd list://* call coc#list#setup(expand('<amatch>'))
autocmd BufWriteCmd __coc_refactor__* :call coc#rpc#notify('saveRefactor', [+expand('<abuf>')]) autocmd BufWriteCmd __coc_refactor__* :call coc#rpc#notify('saveRefactor', [+expand('<abuf>')])
autocmd ColorScheme * call s:Hi() autocmd ColorScheme * call s:Highlight()
augroup end augroup end
if a:initialize == 0 if a:initialize == 0
call coc#rpc#request('attach', []) call coc#rpc#request('attach', [])
@ -373,37 +408,38 @@ function! s:Enable(initialize)
endif endif
endfunction endfunction
function! s:FgColor(hlGroup) abort function! s:Highlight() abort
let fgId = synIDtrans(hlID(a:hlGroup))
let ctermfg = synIDattr(fgId, 'reverse', 'cterm') ==# '1' ? synIDattr(fgId, 'bg', 'cterm') : synIDattr(fgId, 'fg', 'cterm')
let guifg = synIDattr(fgId, 'reverse', 'gui') ==# '1' ? synIDattr(fgId, 'bg', 'gui') : synIDattr(fgId, 'fg', 'gui')
let cmd = ' ctermfg=' . (empty(ctermfg) ? '223' : ctermfg)
let cmd .= ' guifg=' . (empty(guifg) ? '#ebdbb2' : guifg)
return cmd
endfunction
function! s:Hi() abort
hi default CocErrorSign ctermfg=Red guifg=#ff0000 guibg=NONE
hi default CocWarningSign ctermfg=Brown guifg=#ff922b guibg=NONE
hi default CocInfoSign ctermfg=Yellow guifg=#fab005 guibg=NONE
hi default CocHintSign ctermfg=Blue guifg=#15aabf guibg=NONE
hi default CocSelectedText ctermfg=Red guifg=#fb4934 guibg=NONE hi default CocSelectedText ctermfg=Red guifg=#fb4934 guibg=NONE
hi default CocCodeLens ctermfg=Gray guifg=#999999 guibg=NONE hi default CocCodeLens ctermfg=Gray guifg=#999999 guibg=NONE
hi default CocUnderline term=underline cterm=underline gui=underline hi default CocUnderline term=underline cterm=underline gui=underline guisp=#ebdbb2
hi default CocBold term=bold cterm=bold gui=bold hi default CocBold term=bold cterm=bold gui=bold
hi default CocItalic term=italic cterm=italic gui=italic hi default CocItalic term=italic cterm=italic gui=italic
hi default CocStrikeThrough term=strikethrough cterm=strikethrough gui=strikethrough hi default CocStrikeThrough term=strikethrough cterm=strikethrough gui=strikethrough
hi default CocMarkdownLink ctermfg=Blue guifg=#15aabf guibg=NONE hi default CocMarkdownLink ctermfg=Blue guifg=#15aabf guibg=NONE
hi default CocDisabled guifg=#999999 ctermfg=gray hi default CocDisabled guifg=#999999 ctermfg=gray
hi default CocSearch ctermfg=Blue guifg=#15aabf guibg=NONE hi default CocSearch ctermfg=Blue guifg=#15aabf guibg=NONE
hi default CocMenuSel ctermbg=237 guibg=#13354A if coc#highlight#get_contrast('Normal', has('nvim') ? 'NormalFloat' : 'Pmenu') > 2.0
exe 'hi default CocFloating '.coc#highlight#create_bg_command('Normal', &background ==# 'dark' ? -0.4 : 0.1)
exe 'hi default CocMenuSel '.coc#highlight#create_bg_command('Normal', &background ==# 'dark' ? -0.2 : 0.05)
exe 'hi default CocFloatThumb '.coc#highlight#create_bg_command('Normal', &background ==# 'dark' ? -0.3 : 0.2)
exe 'hi default CocFloatSbar '.coc#highlight#create_bg_command('Normal', &background ==# 'dark' ? -0.5 : 0.3)
else
exe 'hi default link CocFloating '.(has('nvim') ? 'NormalFloat' : 'Pmenu')
if coc#highlight#get_contrast('CocFloating', 'PmenuSel') > 2.0
if &background ==# 'dark'
hi default CocMenuSel ctermbg=237 guibg=#13354A
else
exe 'hi default CocMenuSel '.coc#highlight#create_bg_command('CocFloating', &background ==# 'dark' ? -0.2 : 0.05)
endif
else
exe 'hi default CocMenuSel '.coc#highlight#get_hl_command(synIDtrans(hlID('PmenuSel')), 'bg', '237', '#13354A')
endif
hi default link CocFloatThumb PmenuThumb
hi default link CocFloatSbar PmenuSbar
endif
hi default link CocFadeOut Conceal hi default link CocFadeOut Conceal
hi default link CocMarkdownCode markdownCode hi default link CocMarkdownCode markdownCode
hi default link CocMarkdownHeader markdownH1 hi default link CocMarkdownHeader markdownH1
hi default link CocErrorHighlight CocUnderline
hi default link CocWarningHighlight CocUnderline
hi default link CocInfoHighlight CocUnderline
hi default link CocHintHighlight CocUnderline
hi default link CocDeprecatedHighlight CocStrikeThrough hi default link CocDeprecatedHighlight CocStrikeThrough
hi default link CocUnusedHighlight CocFadeOut hi default link CocUnusedHighlight CocFadeOut
hi default link CocListLine CursorLine hi default link CocListLine CursorLine
@ -416,7 +452,6 @@ function! s:Hi() abort
hi default link CocLinkedEditing CocCursorRange hi default link CocLinkedEditing CocCursorRange
hi default link CocHighlightRead CocHighlightText hi default link CocHighlightRead CocHighlightText
hi default link CocHighlightWrite CocHighlightText hi default link CocHighlightWrite CocHighlightText
hi default link CocInlayHint CocHintSign
" Notification " Notification
hi default CocNotificationProgress ctermfg=Blue guifg=#15aabf guibg=NONE hi default CocNotificationProgress ctermfg=Blue guifg=#15aabf guibg=NONE
hi default link CocNotificationButton CocUnderline hi default link CocNotificationButton CocUnderline
@ -435,16 +470,12 @@ function! s:Hi() abort
hi default link CocSymbolDefault MoreMsg hi default link CocSymbolDefault MoreMsg
"Pum "Pum
hi default link CocPumSearch CocSearch hi default link CocPumSearch CocSearch
hi default link CocPumDetail Comment
hi default link CocPumMenu CocFloating hi default link CocPumMenu CocFloating
hi default link CocPumShortcut Comment hi default link CocPumShortcut Comment
hi default link CocPumDeprecated CocStrikeThrough hi default link CocPumDeprecated CocStrikeThrough
hi default CocPumVirtualText ctermfg=239 guifg=#504945 hi default link CocPumVirtualText NonText
if has('nvim')
hi default link CocFloating NormalFloat
else
hi default link CocFloating Pmenu
endif
hi default link CocFloatDividingLine NonText hi default link CocFloatDividingLine NonText
if !exists('*sign_getdefined') || empty(sign_getdefined('CocCurrentLine')) if !exists('*sign_getdefined') || empty(sign_getdefined('CocCurrentLine'))
sign define CocCurrentLine linehl=CocMenuSel sign define CocCurrentLine linehl=CocMenuSel
@ -459,27 +490,37 @@ function! s:Hi() abort
hi default CocCursorTransparent gui=strikethrough blend=100 hi default CocCursorTransparent gui=strikethrough blend=100
endif endif
if has('nvim') let sign_colors = {
let names = ['Error', 'Warning', 'Info', 'Hint'] \ 'Error': ['Red', '#ff0000'],
for name in names \ 'Warn': ['Brown', '#ff922b'],
let suffix = name ==# 'Warning' ? 'Warn' : name \ 'Info': ['Yellow', '#fab005'],
if hlexists('DiagnosticVirtualText'.suffix) \ 'Hint': ['Blue', '#15aabf']
exe 'hi default link Coc'.name.'VirtualText DiagnosticVirtualText'.suffix \ }
else for name in ['Error', 'Warning', 'Info', 'Hint']
exe 'hi default link Coc'.name.'VirtualText Coc'.name.'Sign' let suffix = name ==# 'Warning' ? 'Warn' : name
endif if hlexists('DiagnosticUnderline'.suffix)
if hlexists('Diagnostic'.suffix) exe 'hi default link Coc'.name.'Highlight DiagnosticUnderline'.suffix
exe 'hi default link Coc'.name.'Float Diagnostic'.suffix else
else exe 'hi default link Coc'.name.'Highlight CocUnderline'
exe 'hi default link Coc'.name.'Float '.coc#highlight#compose_hlgroup('Coc'.name.'Sign', 'CocFloating') endif
endif if hlexists('DiagnosticSign'.suffix)
endfor exe 'hi default link Coc'.name.'Sign DiagnosticSign'.suffix
else else
execute 'hi default link CocErrorFloat '.coc#highlight#compose_hlgroup('CocErrorSign', 'CocFloating') exe 'hi default Coc'.name.'Sign ctermfg='.sign_colors[suffix][0].' guifg='.sign_colors[suffix][1]
execute 'hi default link CocWarningFloat '.coc#highlight#compose_hlgroup('CocWarningSign', 'CocFloating') endif
execute 'hi default link CocInfoFloat '.coc#highlight#compose_hlgroup('CocInfoSign', 'CocFloating') if hlexists('DiagnosticVirtualText'.suffix)
execute 'hi default link CocHintFloat '.coc#highlight#compose_hlgroup('CocHintSign', 'CocFloating') exe 'hi default link Coc'.name.'VirtualText DiagnosticVirtualText'.suffix
endif else
call s:CreateHighlight('Coc'.name.'VirtualText', 'Coc'.name.'Sign', 'Normal')
endif
if hlexists('Diagnostic'.suffix)
exe 'hi default link Coc'.name.'Float Diagnostic'.suffix
else
call s:CreateHighlight('Coc'.name.'Float', 'Coc'.name.'Sign', 'CocFloating')
endif
endfor
call s:CreateHighlight('CocInlayHint', 'CocHintSign', 'SignColumn')
call s:AddAnsiGroups() call s:AddAnsiGroups()
if get(g:, 'coc_default_semantic_highlight_groups', 1) if get(g:, 'coc_default_semantic_highlight_groups', 1)
@ -555,7 +596,7 @@ function! s:Hi() abort
for [key, value] in items(symbolMap) for [key, value] in items(symbolMap)
let hlGroup = hlexists(value[0]) ? value[0] : get(value, 1, 'CocSymbolDefault') let hlGroup = hlexists(value[0]) ? value[0] : get(value, 1, 'CocSymbolDefault')
if hlexists(hlGroup) if hlexists(hlGroup)
execute 'hi default CocSymbol'.key.' '.s:FgColor(hlGroup) execute 'hi default CocSymbol'.key.' '.coc#highlight#get_hl_command(synIDtrans(hlID(hlGroup)), 'fg', '223', '#ebdbb2')
endif endif
endfor endfor
endfunction endfunction
@ -629,8 +670,8 @@ command! -nargs=0 CocUpdate :call coc#util#update_extensions(1)
command! -nargs=0 -bar CocUpdateSync :call coc#util#update_extensions() command! -nargs=0 -bar CocUpdateSync :call coc#util#update_extensions()
command! -nargs=* -bar -complete=custom,s:InstallOptions CocInstall :call coc#util#install_extension([<f-args>]) command! -nargs=* -bar -complete=custom,s:InstallOptions CocInstall :call coc#util#install_extension([<f-args>])
call s:Highlight()
call s:Enable(1) call s:Enable(1)
call s:Hi()
" Default key-mappings for completion " Default key-mappings for completion
if empty(mapcheck('<C-n>', 'i')) if empty(mapcheck('<C-n>', 'i'))
@ -666,7 +707,7 @@ vnoremap <silent> <Plug>(coc-format-selected) :<C-u>call CocActionAs
vnoremap <silent> <Plug>(coc-codeaction-selected) :<C-u>call CocActionAsync('codeAction', visualmode())<CR> vnoremap <silent> <Plug>(coc-codeaction-selected) :<C-u>call CocActionAsync('codeAction', visualmode())<CR>
nnoremap <Plug>(coc-codeaction-selected) :<C-u>set operatorfunc=<SID>CodeActionFromSelected<CR>g@ nnoremap <Plug>(coc-codeaction-selected) :<C-u>set operatorfunc=<SID>CodeActionFromSelected<CR>g@
nnoremap <Plug>(coc-codeaction) :<C-u>call CocActionAsync('codeAction', '')<CR> nnoremap <Plug>(coc-codeaction) :<C-u>call CocActionAsync('codeAction', '')<CR>
nnoremap <Plug>(coc-codeaction-line) :<C-u>call CocActionAsync('codeAction', 'line')<CR> nnoremap <Plug>(coc-codeaction-line) :<C-u>call CocActionAsync('codeAction', 'currline')<CR>
nnoremap <Plug>(coc-codeaction-cursor) :<C-u>call CocActionAsync('codeAction', 'cursor')<CR> nnoremap <Plug>(coc-codeaction-cursor) :<C-u>call CocActionAsync('codeAction', 'cursor')<CR>
nnoremap <silent> <Plug>(coc-rename) :<C-u>call CocActionAsync('rename')<CR> nnoremap <silent> <Plug>(coc-rename) :<C-u>call CocActionAsync('rename')<CR>
nnoremap <silent> <Plug>(coc-format-selected) :<C-u>set operatorfunc=<SID>FormatFromSelected<CR>g@ nnoremap <silent> <Plug>(coc-format-selected) :<C-u>set operatorfunc=<SID>FormatFromSelected<CR>g@