From 0a20357d4585da91d92252972f3eb7b715ff64ab Mon Sep 17 00:00:00 2001 From: Marc Coquand Date: Mon, 1 Jul 2024 21:26:30 -0500 Subject: initial commit --- vim/pack/downloads/opt/lsp/ftplugin/lspgfm.vim | 78 ++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 vim/pack/downloads/opt/lsp/ftplugin/lspgfm.vim (limited to 'vim/pack/downloads/opt/lsp/ftplugin/lspgfm.vim') diff --git a/vim/pack/downloads/opt/lsp/ftplugin/lspgfm.vim b/vim/pack/downloads/opt/lsp/ftplugin/lspgfm.vim new file mode 100644 index 0000000..2e9bf76 --- /dev/null +++ b/vim/pack/downloads/opt/lsp/ftplugin/lspgfm.vim @@ -0,0 +1,78 @@ +vim9script + +import autoload 'lsp/markdown.vim' as md + +# Update the preview window with the github flavored markdown text +def UpdatePreviewWindowContents(bnr: number, contentList: list>) + :silent! bnr->deletebufline(1, '$') + + var lines: list = [] + var props: dict>> + var lnum = 0 + + # Each item in "contentList" is a Dict with the following items: + # text: text for this line + # props: list of text properties. Each list item is a Dict. See + # |popup-props| for more information. + # + # Need to convert the text properties from the format used by + # popup_settext() to that used by prop_add_list(). + for entry in contentList + lines->add(entry.text) + lnum += 1 + if entry->has_key('props') + for p in entry.props + if !props->has_key(p.type) + props[p.type] = [] + endif + if p->has_key('end_lnum') + props[p.type]->add([lnum, p.col, p.end_lnum, p.end_col]) + else + props[p.type]->add([lnum, p.col, lnum, p.col + p.length]) + endif + endfor + endif + endfor + setbufline(bnr, 1, lines) + for prop_type in props->keys() + prop_add_list({type: prop_type}, props[prop_type]) + endfor +enddef + +# Render the github flavored markdown text. +# Text can be displayed either in a popup window or in a preview window. +def RenderGitHubMarkdownText() + var bnr: number = bufnr() + var winId: number = win_getid() + var document: dict> + var inPreviewWindow = false + + if win_gettype() == 'preview' + inPreviewWindow = true + endif + + try + if !inPreviewWindow + winId = bnr->getbufinfo()[0].popups[0] + endif + # parse the github markdown content and convert it into a list of text and + # list of associated text properties. + document = md.ParseMarkdown(bnr->getbufline(1, '$'), winId->winwidth()) + catch /.*/ + b:markdown_fallback = v:true + return + endtry + + b:lsp_syntax = document.syntax + md.list_pattern->setbufvar(bnr, '&formatlistpat') + var settings = 'linebreak breakindent breakindentopt=list:-1' + win_execute(winId, $'setlocal {settings}') + if inPreviewWindow + UpdatePreviewWindowContents(bnr, document.content) + else + winId->popup_settext(document.content) + endif +enddef +RenderGitHubMarkdownText() + +# vim: tabstop=8 shiftwidth=2 softtabstop=2 -- cgit v1.2.3