1
0
Fork 0
mirror of synced 2024-06-26 02:31:09 -04:00
ultimate-vim/sources_non_forked/coc.nvim/src/completion/floating.ts
2022-07-20 13:20:15 +08:00

69 lines
1.9 KiB
TypeScript

'use strict'
import { Neovim } from '@chemzqm/neovim'
import events from '../events'
import { parseDocuments } from '../markdown'
import { FloatConfig, Documentation } from '../types'
const logger = require('../util/logger')('floating')
export interface PumBounding {
readonly height: number
readonly width: number
readonly row: number
readonly col: number
readonly scrollbar: boolean
}
export interface FloatingConfig extends FloatConfig {
excludeImages: boolean
}
export default class Floating {
private winid = 0
private bufnr = 0
constructor(
private nvim: Neovim,
private isVim: boolean) {
}
public async show(docs: Documentation[], bounding: PumBounding, config: FloatingConfig): Promise<void> {
let { nvim } = this
docs = docs.filter(o => o.content.trim().length > 0)
let { lines, codes, highlights } = parseDocuments(docs, { excludeImages: config.excludeImages })
if (lines.length == 0) {
this.close()
return
}
let opts: any = {
codes,
highlights,
maxWidth: config.maxWidth || 80,
pumbounding: bounding,
}
if (config.border) opts.border = [1, 1, 1, 1]
if (config.highlight) opts.highlight = config.highlight
if (config.borderhighlight) opts.borderhighlight = config.borderhighlight
if (!this.isVim) {
if (typeof config.winblend === 'number') opts.winblend = config.winblend
opts.focusable = config.focusable === true ? 1 : 0
if (config.shadow) opts.shadow = 1
}
let res = await nvim.call('coc#dialog#create_pum_float', [this.winid, this.bufnr, lines, opts])
nvim.redrawVim()
if (!res || res.length == 0) return
this.winid = res[0]
this.bufnr = res[1]
if (!events.pumvisible) {
this.close()
}
}
public close(): void {
let { winid, nvim } = this
this.winid = 0
if (!winid) return
nvim.call('coc#float#close', [winid], true)
nvim.redrawVim()
}
}