New (incomplete and x64 only) LSP client plugin
-
Do you have any idea how to name such a flag?
I was thinking of a boolean value namedsend_completion_request_always
and it should be available in both the global and lspserver sections.The absence would mean `false" and has the current behavior, i.e. if a completion list is active, it will be used and not canceled.
If the boolean value is present in the global section, each lspserver inherits its value unless it explicitly overrides it.Other ideas?
-
I think that’s brilliant and flexible - to be globally and “locally” (per LS) override.
Cheers.
-
v.0.0.18 has been released
The new (experimental) flag
complete_always
has been introduced.To be honest, I’m not very happy with it - quite a bit of flickering. I’m still thinking about whether other solutions are possible/useful.
-
@Ekopalypse said in New (incomplete and x64 only) LSP client plugin:
quite a bit of flickering
Yes, that’s because every time a character is typed, autocompletion is called. The way you had it was “nicer” in that autocompletion was just called once and further typing didn’t “filter” (i.e., shorten and redisplay) the list, it just “narrowed” (i.e. moved to the closest match).
This is a symptom of a rather immature autocomplete feature and the Notepad++ implementation and probably other “stuff”. Meaning, there can only be one active autocomplete list at a time, but there is no way to add to that list. So type a character and Notepad++ creates its own list based on the ‘autoComplete/LANG.xml’ file and any current words in the doc (depending on settings of course) and my QuickText plugin creates its list for the language if you match a snip and my TagLEET plugin creates a list based on all the CTags in the project and now your LSPClient creates a list, and on and on … last list wins? or maybe not?
Of course, if you don’t have any of those plugins, you don’t see the issue, but it would be nice (not for you to solve) if Notepad++ / Scintilla had a sort of universal autocomplete where you don’t create the list, just submit your items to add to the list and the universal autocomplete compiles a consolidated list of all the available completions before displaying. That way, you can get the goodness of Notepad++ default fallback for non-LSP languages and the useful “other words in document” (great for typing documentation or README files where words / phrases are repeated) plus any plugin could make use of autocomplete sending suggestions (like the plugins I previously mentioned above) without conflicting with each other - rather cooperatively creating a curated list of the possible completions for the user.
FOR NOW: definitely keep this “feature” disabled by default and maybe document the “issues” with enabling it. And if ultimately you don’t like it or it makes the maintenance difficult - you can remove it. I do appreciate you adding it in so quickly for me to test / play with. I’ve sorta gotten used to this subpar autocomplete experience (read: flickering and somewhat not reliable) so I may be a bad judge of how “well” this
complete_always
mode works.
I also cannot stress enough how AWESOME it is that you are tackling LSP for Notepad++!! I have tried some quick Python frameworks running with PythonScript to no avail - which is also why your dockable-dialogs-from-PythonScript piqued my interest. LSP plugin is a daunting task - again, thank you!
Cheers.
-
@Michael-Vincent said in New (incomplete and x64 only) LSP client plugin:
it would be nice [. . .] if Notepad++ / Scintilla had a sort of universal autocomplete where you don’t create the list, just submit your items to add to the list and the universal autocomplete compiles a consolidated list of all the available completions before displaying.
-
@rdipardo said in New (incomplete and x64 only) LSP client plugin:
#2403 Add an autocomplete popup mode doing no processing
Indeed - that describes the problem rather well. I see the proposed solution is a new autocomplete mode. So maybe that would help with LSP type flickering described, but I don’t think it address the “universal autocomplete” I’m talking about where other plugins (other than the Language Server) and Notepad++ itself could all create a list that gets displayed.
Cheers.
-
It seems to me that the basic workflow for getting Notepad++ - style autocomplete alongside LSP autocomplete would be something like this:
- Whenever the current buffer is updated, make a list of words in the file
- Get a list of autocompletions from the language server
- filter the words in the file for ones that could be autocompletions
- Display language server autocompletions in lexicographic order with an icon to distinguish them, and then normal word-in-file autocompletions (with no icon) in lexicographic order.
Obviously the devil is in the details, but implementing Notepad++ - style autocompletion is surely a lot easier than implementing a general-purpose LSP client.
It might even be possible to provide autocompletions from all other open buffers from the FAW (similar to VSCode) if you did something like this:
- On
NPPM_BUFFERACTIVATED
, check if the activated buffer is in the FAW, and if its lexer language matches the LSP, list the words in that buffer. - When a buffer from the FAW is navigated away from (but not closed), cache the words in that buffer in a data structure like a trie, so that they can easily be used for autocompletions.
My idea of using a trie only really works for static, unchanging word lists (like the buffers that are open but not currently being edited), because constructing a trie is pretty expensive and doesn’t pay for itself until you’ve done a lot of searches.
-
@Mark-Olson said in New (incomplete and x64 only) LSP client plugin:
Obviously the devil is in the details, but implementing Notepad++ - style autocompletion is surely a lot easier than implementing a general-purpose LSP client.
I could be misunderstanding your numbered workflow, but I don’t think the LSP client should be responsible for getting all word autocompletes from the current buffer.
What I think needs to happen is Notepad++ provides an autocompletion collection point if you will. It dumps its ‘autoComplete/LANG.xml’ entries, current document words and anything else it’s configured for. The collection point is also the place where my QuickText plugin would send possible autocompletes and my TagLEET plugin would send possible autocompletes and @Ekopalypse 's LSP Client would send possible autocompletes. After collecting them all, Notepad++ sorts, filters dups, appends icons, … whatever … then makes the Scintilla call to
SCI_AUTOCSHOW
to display the list. Then we do it again for the next typed character.Of course this idea is fraught with issues like the race conditions of how quickly a plugin can submit its autocomplete partial list to the collection point before the collection point says - “I’ve had enough, we’ve waited to long, time to display before the user falls asleep”.
There’s probably a proper software design pattern with a callback or an observable or something far to abstract for me to articulate that handles this exact thing - but I think that has to be put in Notepad++ for the plugins to make use of. Otherwise, we’re where we currently are, with plugins offering autocomplete directly to Scintilla, bypassing Notepad++, which results in stepping on each other and Notepad++, and a poor user experience.
Cheers.
-
First of all, thanks to everyone for participating in this topic.
The more I think about it, the more I feel that implementing a custom completion dialog is the way to go … but … hmm … I don’t know
-
@Ekopalypse said in New (incomplete and x64 only) LSP client plugin:
The more I think about it, the more I feel that implementing a custom completion dialog is the way to go … but … hmm … I don’t know
Reply
For example, see @pnedev NppGTags. Also, I think 3P, though I’ve never used that plugin (I have the former).
Cheers.
-
Just a quick info
It can happen that Npp blocks when multiple language servers are running and a message is received from an inactive one, i.e. one that is not used by the current buffer.
-
v.0.0.19 has been released which should address the aforementioned issue.
-
I am thinking about whether it is necessary to create a “dockableDialog” for symbols of the current buffer.
On the one hand Npp already offers the FunctionList dialog,
on the other hand Lsp-Symbols offers not only functions, but also constants, structures, classes …
But is a “dockableDialog” really needed for this?
I was just thinking that a kind of “search bar” would be sufficient, if not better, for this.
In my case, I usually know the approximate name of the symbol
and then either just want to take a quick look at it or jump there.
In other words, you could use a search bar, which would be sorted alphabetically,
to display the symbols and possibly open another dialog next to it, which, for example, shows the complete function.
Or what do you think? How would you use/prefer a symbol dialog? -
Go for the docked symbols panel. The built-in function list is a joke, if we’re being honest.
-
Glad to see the symbols panel was implemented. Is there any way the
SCN_ZOOM
callback can also resize the icon column? In current builds it gets crowded out by the identifiers at larger scales, e.g., -
The symbol dialog is still a bit buggy, it currently only handles parent-child relationships, but not grandparent-child relationships etc.
The Borrow Checker and I are constantly arguing about this :-D
Yes, the resizing of all(!?) dialogs needs to be addressed. -
Feature-wise, v.0.0.26 has reached beta status, i.e. no new features are planned before the first beta is released.
So if you think something is missing, now would be a good time to open an issue on github.Before the release of the first beta version, the following issues needs to be addressed
- handle NPPN_GLOBALMODIFIED message
- new workspace dialog
- new completion and signature dialogs that allow both to be shown at the same time
- the symbol dialog shows the correct hierarchy
- the hover dialog will hopefully get a proper web view
- console dialog shows debug log
- all dialogs get their own configuration section to customize the colors
- the progress dialog is “glued” to its position
- code action hints (I’m not sure how to do this yet)
- reference dialog gets a kind of in-progress label
If I have forgotten anything, please let me know.
Thanks for reading :-) -
I’m starting to question whether using a WebView for the hover part is really beneficial.
It complicates more than one could, probably, benefit from and it slows down the startup of npp considerably.
I know I could start it “lazily” by initializing everything the first time I use it.
But running 6 additional processes … hmmm … and what are they doing in the background? Links can also be opened via Scintilla … the styling options are of course limited but is that really needed.
And there are certainly some servers that don’t support Markdown at all …
yes pylsp I am looking at you for example.
What do you think, does it make sense to use a WebView? -
I recently found perlnavigator, which is a Perl LSP server that has with a pre-built Windows executable, and I can actually unzip it at work (where I was never able to get Perl::LanguageServer to install properly at work, so I never bothered at home). And I confirmed it defaults to STDIO mode for communication, so it should be compatible with your new plugin. (And it’s dead-simple to install: just unzip the perlnavigator-win-x86_64.zip and put the
perlnavigator.exe
in your path or a known location;--stdio
seems to be the only command line argument needed)So I downloaded your NppLspClient v0.0.26-alpha and installed it in a v8.6.2 portable (since the alpha download pages showed they need < v8.6.3).
Initial problem: when it creates
NppLspConfig.toml
, I get an error in the auto-generated config file:
If I add
[lspservers]
as line 1, that error goes away. But I would hope the auto-created config would not have syntax errors. :-)Second, I was surprised to not see syntax highlighting in the config file. Why did you pick a config language that Notepad++ doesn’t recognize out-of-the-box? ;-) Do you prefer a UDL (like the one listed in the UDL Collection)? Or do you just assign
.toml
to the INI builtin language?----
But, after a few false starts (which were me having mistakes in the config file), I was able to get it working (for the first level of “it works”)
[lspservers.perl] mode = "io" executable = 'c:\\usr\\local\\bin\\perlnavigator.exe' args = '--stdio' auto_start_server = false
And I can see a function in the “Symbols”, and clicking in the Symbols list will take me to the definition of a function. But if I add a new function, or insert lines before a function, it doesn’t refresh. Is there a way to get it to refresh automatically (at least when the source is saved)? Or is that a limitation of the current implementation of the Client? Or is the PerlNavigator server not responding to your client’s request for a refresh?
Even though clicking in the Symbols panel will allow me to go to the function, “Goto declaration/implementation/definition” doesn’t seem to do anything for me. I don’t know whether it’s just there need to be more options sent to the perlnavigator server somehow. (its main page seems to show some LspClients in other editors have settings that they can pass to the server; is there something like that in NppLspClient?)
Is there something specific at >= v8.6.3 that causes it to “not work”, or have you just not upgraded beyond that yet, so haven’t tried? (I tried installing it in my daily 8.6.4, and it didn’t crash and would show my function, but since I haven’t seen many features work, I don’t know if there’s something that I haven’t tried that causes a crash, or what.)
Anyway, sorry for the rambling. I still don’t have a lot of (really, any) experience with LSP. But I’m really hoping I can eventually figure out how to make it useful for my perl code.
-
First of all, many thanks for the testing and the detailed experience report.
But I would hope the auto-created config would not have syntax errors. :-)
The error comes from the TOML linter. From the plugin’s point of view, an initial configuration is not usable because it does not contain an lspserver configuration. I am currently not sure if I can simply overwrite the error message, but a check for this specific text and then a more meaningful message should always be possible.
Why did you pick a config language that Notepad++ doesn’t recognize out-of-the-box?
I wanted to have a configuration file format that could use comments and that was already supported by V at the time, hence my choice of toml. I am currently using a very experimental toml lexer, but previously I used the udl lexer.
… at least when the source is saved
That should already work, symbols are queried every time you save a document.
Can you give a simple test case?“Goto declaration/implementation/definition” doesn’t seem to do anything for me
It could be that this is not supported by the server or you have discovered a bug.
Right now I’m just returning from the function, maybe I should log something in the console window to alert the user that the current operation is not supported by the server.Is there something specific at >= v8.6.3 that causes it to “not work”,
Yes, certain events have been disabled that the plugin requires.
See here for more information) for more information. Everything seems to work with 8.6.5 so far.By the way, if you enable debugging via the configuration, the communication between the lsp client and the servers is logged which can be helpful for root cause analysis.
The log is created in the plugin\config\npplspclient directory with the respective Npp process ID.
Caution, the respective log is also deleted when Npp is closed.LSP communication currently recognizes 3 message types that can be sent by the client or any server.
Requests, responses and notifications.
Each request must be sent with a unique ID and answered by the other side with a response and this ID.
Notifications are only received and do not have this ID.