With some work, you can enable 24-bit color support in TTY emacs, which solves this problem. Combine this with some work to either tweak or remove the more obnoxious LSP overlays and you can have a fairly good LSP experience on the TTY.
What sapped my will to live was the impossibility of doing a C-u C-x = on the overlays to determine how their contents were styled, forcing me to go into the source code of a ton of different packages to go fishing for face names to coerce to visible values.
Yes it’s possible but it’s insane. Emacs carries around all of this terminal baggage but many module developers seem to have forgotten about terminal users. Additionally, theming is conceptually broken in that it creates an MxN problem with themes and modes’ face names. This could be solved if modes stopped with the proliferation of mode-specific face names but good luck with that.
Eglot, not lsp-mode, will be the LSP implementation that makes it into the GNU Emacs distribution (because it is being developed with FSF assignments, and because the maintainer is active in the GNU Emacs development community, maintaining eldoc and flymake, and maybe others).
This is Eglot's code. Try and figure out what's happening in each of these passages:
https://github.com/joaotavora/eglot/blob/master/eglot.el#L41...
https://github.com/joaotavora/eglot/blob/master/eglot.el#L41...
https://github.com/joaotavora/eglot/blob/master/eglot.el#L17...
Contrast with lsp-mode:
https://github.com/emacs-lsp/lsp-mode/blob/master/lsp-mode.e...
https://github.com/emacs-lsp/lsp-mode/blob/master/lsp-mode.e...
https://github.com/emacs-lsp/lsp-mode/blob/master/lsp-modeli...
The lsp-mode code is a lot easier to follow, in my opinion. It's a lot clearer what's happening (although I can't say much about whether either are overabstracted which is admittedly a big concern. I haven't looked into that).
I remember watching an argument between the original authors on Reddit a while back. The lsp-mode author came across as... let's just say more professional. lsp-mode seems much closer to a professional product to me in general.
In any case, I would prefer that neither become part of GNU Emacs since then the development process and code review will become completely opaque (I'm not sure code review is really a thing once it's in Emacs. Just maintainers with push rights to some repo on savannah or something)
Eglot: 70 open, 277 closed
lsp-mode: 94 open, 977 closed
(lsp-mode is much more than 3x the size of eglot and has 15x the number of downloads on MELPA)
A lot of languages have working lsp implementations (at least according to https://langserver.org/) and, assuming it will stick around, this means that emacs can get all of these nice features "for free" by having an lsp implementation. This is a much safer bet than just assuming that somebody will provide and maintain emacs plugins for <insert language x here> that provide everything that lsp would.
https://emacs-lsp.github.io/lsp-mode/page/performance/
Ordinarily I'd ignore rabbit holes like this but LSP is unusually useful. It's worth a shot.