README.md | 7 ++++--- autoload/lsp/symbol.vim | 32 +++++++++++++++++++++++--------- test/run_tests.sh | 9 +++++++-- test/tsserver_tests.vim | 36 ++++++++++++++++++++++++++++++++++++ diff --git a/README.md b/README.md index b2c8df1ae715e6183ad9b4690abada9c09895ec8..ffedb69aa0ed084003c9d6e5724dc90b9cf7d11f 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,7 @@ * Formatting code * Folding code * Inlay hints * Visually select symbol block/region +* Semantic Highlight ## Configuration @@ -157,6 +158,9 @@ ``` If you used [vim-plug](https://github.com/junegunn/vim-plug) to install the LSP plugin, then you need to use the VimEnter autocmd to initialize the LSP server and to set the LSP server options. For example: ```viml +let lspOpts = #{autoHighlightDiags: v:true} +autocmd VimEnter * call LspOptionsSet(lspOpts) + let lspServers = [#{ \ name: 'clang', \ filetype: ['c', 'cpp'], @@ -164,9 +168,6 @@ \ path: '/usr/local/bin/clangd', \ args: ['--background-index'] \ }] autocmd VimEnter * call LspAddServer(lspServers) - -let lspOpts = #{autoHighlightDiags: v:true} -autocmd VimEnter * call LspOptionsSet(lspOpts) ``` ## Supported Commands diff --git a/autoload/lsp/symbol.vim b/autoload/lsp/symbol.vim index 7d26df82a3f6bc8ab28e2a8e35f5eb48e411a607..76bcfa913a9d3cd264555b4666a89d1790124796 100644 --- a/autoload/lsp/symbol.vim +++ b/autoload/lsp/symbol.vim @@ -454,15 +454,30 @@ endif enddef # Key filter callback function used for the symbol popup window. -# Vim doesn't close the popup window when the escape key is pressed. -# This is function supports that. -def SymbolFilterCB(lspserver: dict, id: number, key: string): bool - if key == "\" - lspserver.peekSymbolPopup->popup_close() - return true +def SymbolFilterCB(symPopupWin: number, key: string): bool + var keyHandled = false + + if key == "\" + || key == "\" + || key == "\" + || key == "\" + || key == "\" + || key == "\" + || key == "\" + || key == "\" + || key == "\" + || key == "\" + # scroll the popup window + win_execute(symPopupWin, $'normal! {key}') + keyHandled = true endif - return false + if !keyHandled + # For any other key, close the window + symPopupWin->popup_close() + endif + + return keyHandled enddef # Display the file specified by LSP "LocationLink" in a popup window and @@ -481,7 +496,6 @@ if lspserver.peekSymbolPopup->winbufnr() != -1 # If the symbol popup window is already present, close it. lspserver.peekSymbolPopup->popup_close() endif - var CbFunc = function(SymbolFilterCB, [lspserver]) var popupAttrs = { title: $"{fnamemodify(fname, ':t')} ({fnamemodify(fname, ':h')})", wrap: false, @@ -493,7 +507,7 @@ maxwidth: 60, cursorline: true, border: [], mapping: false, - filter: CbFunc + filter: SymbolFilterCB } lspserver.peekSymbolPopup = popup_atcursor(bnum, popupAttrs) diff --git a/test/run_tests.sh b/test/run_tests.sh index e99590538d096ff631d87fce90e422bd5a2120c1..91473028ad96f5252e00ba2827aac15524d85d1b 100755 --- a/test/run_tests.sh +++ b/test/run_tests.sh @@ -2,7 +2,11 @@ #!/bin/bash # Script to run the unit-tests for the LSP Vim plugin -VIMPRG=${VIMPRG:=$(which vim)} +#VIMPRG=${VIMPRG:=$(which vim)} +#VIMPRG=/home/yega/bin/vim90/bin/vim +#VIMRUNTIME=/home/yega/bin/vim90/share/vim/vim90 +export VIMPRG=/home/yega/Documents/vim/vim9/vim/src/vim +export VIMRUNTIME=/home/yega/Documents/vim/vim9/vim/runtime if [ -z "$VIMPRG" ]; then echo "ERROR: vim (\$VIMPRG) is not found in PATH" exit 1 @@ -10,7 +14,8 @@ fi VIM_CMD="$VIMPRG -u NONE -U NONE -i NONE --noplugin -N --not-a-term" -TESTS="clangd_tests.vim tsserver_tests.vim gopls_tests.vim not_lspserver_related_tests.vim markdown_tests.vim" +#TESTS="clangd_tests.vim tsserver_tests.vim gopls_tests.vim not_lspserver_related_tests.vim markdown_tests.vim" +TESTS="clangd_tests.vim" RunTestsInFile() { testfile=$1 diff --git a/test/tsserver_tests.vim b/test/tsserver_tests.vim index 99e28368beeba952da377a3d0d0f28582ef8ff14..e553e98b740f660c4cc463f0aba10001110cccf1 100644 --- a/test/tsserver_tests.vim +++ b/test/tsserver_tests.vim @@ -5,6 +5,9 @@ source common.vim source term_util.vim source screendump.vim +var lspOpts = {autoComplete: false} +g:LspOptionsSet(lspOpts) + var lspServers = [{ filetype: ['typescript', 'javascript'], path: exepath('typescript-language-server'), @@ -33,6 +36,39 @@ # # g:StopVimInTerminal(buf) # delete('Xcompletion1.js') # enddef + +# Test for auto-import using omni completion +def g:Test_autoimport() + :silent! edit autoImportMod1.ts + sleep 200m + var lines =<< trim END + export function getNumber() { + return 1; + } + END + setline(1, lines) + :redraw! + g:WaitForServerFileLoad(0) + + var save_completopt = &completeopt + set completeopt= + + :split autoImportMod2.ts + :sleep 200m + setline(1, 'console.log(getNum') + g:WaitForServerFileLoad(2) + feedkeys("A\\());", 'xt') + var expected =<< trim END + import { getNumber } from "./autoImportMod1"; + + ());console.log(getNumber + END + assert_equal(expected, getline(1, '$')) + + &completeopt = save_completopt + + :%bw! +enddef # Start the typescript language server. Returns true on success and false on # failure.