euporie 2.8.0__py3-none-any.whl → 2.8.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. euporie/console/_commands.py +143 -0
  2. euporie/console/_settings.py +58 -0
  3. euporie/console/app.py +25 -71
  4. euporie/console/tabs/console.py +267 -147
  5. euporie/core/__init__.py +1 -9
  6. euporie/core/__main__.py +31 -5
  7. euporie/core/_settings.py +104 -0
  8. euporie/core/app/__init__.py +3 -0
  9. euporie/core/app/_commands.py +70 -0
  10. euporie/core/app/_settings.py +427 -0
  11. euporie/core/{app.py → app/app.py} +214 -572
  12. euporie/core/app/base.py +51 -0
  13. euporie/core/{current.py → app/current.py} +13 -4
  14. euporie/core/app/cursor.py +35 -0
  15. euporie/core/app/dummy.py +12 -0
  16. euporie/core/app/launch.py +28 -0
  17. euporie/core/bars/__init__.py +11 -0
  18. euporie/core/bars/command.py +182 -0
  19. euporie/core/bars/menu.py +258 -0
  20. euporie/core/{widgets → bars}/search.py +154 -57
  21. euporie/core/{widgets → bars}/status.py +9 -26
  22. euporie/core/clipboard.py +19 -80
  23. euporie/core/comm/base.py +8 -6
  24. euporie/core/comm/ipywidgets.py +21 -12
  25. euporie/core/comm/registry.py +2 -1
  26. euporie/core/commands.py +11 -5
  27. euporie/core/completion.py +3 -2
  28. euporie/core/config.py +368 -341
  29. euporie/core/convert/__init__.py +0 -30
  30. euporie/core/convert/datum.py +131 -60
  31. euporie/core/convert/formats/__init__.py +31 -0
  32. euporie/core/convert/formats/ansi.py +46 -30
  33. euporie/core/convert/formats/common.py +11 -23
  34. euporie/core/convert/formats/html.py +45 -40
  35. euporie/core/convert/formats/pil.py +1 -1
  36. euporie/core/convert/formats/png.py +3 -5
  37. euporie/core/convert/formats/sixel.py +3 -3
  38. euporie/core/convert/registry.py +11 -8
  39. euporie/core/convert/utils.py +50 -23
  40. euporie/core/diagnostics.py +2 -2
  41. euporie/core/filters.py +72 -82
  42. euporie/core/format.py +13 -2
  43. euporie/core/ft/ansi.py +1 -1
  44. euporie/core/ft/html.py +36 -36
  45. euporie/core/ft/table.py +1 -3
  46. euporie/core/ft/utils.py +4 -1
  47. euporie/core/graphics.py +216 -124
  48. euporie/core/history.py +2 -2
  49. euporie/core/inspection.py +3 -2
  50. euporie/core/io.py +207 -28
  51. euporie/core/kernel/__init__.py +1 -0
  52. euporie/core/{kernel.py → kernel/client.py} +100 -139
  53. euporie/core/kernel/manager.py +114 -0
  54. euporie/core/key_binding/bindings/__init__.py +2 -8
  55. euporie/core/key_binding/bindings/basic.py +47 -7
  56. euporie/core/key_binding/bindings/completion.py +3 -8
  57. euporie/core/key_binding/bindings/micro.py +5 -7
  58. euporie/core/key_binding/bindings/mouse.py +26 -24
  59. euporie/core/key_binding/bindings/terminal.py +193 -0
  60. euporie/core/key_binding/bindings/vi.py +46 -0
  61. euporie/core/key_binding/key_processor.py +43 -2
  62. euporie/core/key_binding/registry.py +2 -0
  63. euporie/core/key_binding/utils.py +22 -2
  64. euporie/core/keys.py +7156 -92
  65. euporie/core/layout/cache.py +35 -25
  66. euporie/core/layout/containers.py +280 -74
  67. euporie/core/layout/decor.py +5 -5
  68. euporie/core/layout/mouse.py +1 -1
  69. euporie/core/layout/print.py +16 -3
  70. euporie/core/layout/scroll.py +26 -28
  71. euporie/core/log.py +75 -60
  72. euporie/core/lsp.py +118 -24
  73. euporie/core/margins.py +60 -31
  74. euporie/core/path.py +2 -1
  75. euporie/core/renderer.py +58 -17
  76. euporie/core/style.py +60 -40
  77. euporie/core/suggest.py +103 -85
  78. euporie/core/tabs/__init__.py +34 -0
  79. euporie/core/tabs/_settings.py +113 -0
  80. euporie/core/tabs/base.py +11 -435
  81. euporie/core/tabs/kernel.py +420 -0
  82. euporie/core/tabs/notebook.py +20 -54
  83. euporie/core/utils.py +98 -6
  84. euporie/core/validation.py +1 -1
  85. euporie/core/widgets/_settings.py +188 -0
  86. euporie/core/widgets/cell.py +90 -158
  87. euporie/core/widgets/cell_outputs.py +26 -37
  88. euporie/core/widgets/decor.py +11 -41
  89. euporie/core/widgets/dialog.py +55 -44
  90. euporie/core/widgets/display.py +27 -24
  91. euporie/core/widgets/file_browser.py +5 -26
  92. euporie/core/widgets/forms.py +16 -12
  93. euporie/core/widgets/inputs.py +37 -81
  94. euporie/core/widgets/layout.py +7 -6
  95. euporie/core/widgets/logo.py +49 -0
  96. euporie/core/widgets/menu.py +13 -11
  97. euporie/core/widgets/pager.py +9 -11
  98. euporie/core/widgets/palette.py +6 -6
  99. euporie/hub/app.py +52 -31
  100. euporie/notebook/_commands.py +24 -0
  101. euporie/notebook/_settings.py +107 -0
  102. euporie/notebook/app.py +109 -210
  103. euporie/notebook/filters.py +1 -1
  104. euporie/notebook/tabs/__init__.py +46 -7
  105. euporie/notebook/tabs/_commands.py +714 -0
  106. euporie/notebook/tabs/_settings.py +32 -0
  107. euporie/notebook/tabs/display.py +2 -2
  108. euporie/notebook/tabs/edit.py +12 -7
  109. euporie/notebook/tabs/json.py +3 -3
  110. euporie/notebook/tabs/log.py +1 -18
  111. euporie/notebook/tabs/notebook.py +21 -674
  112. euporie/notebook/widgets/_commands.py +11 -0
  113. euporie/notebook/widgets/_settings.py +19 -0
  114. euporie/notebook/widgets/side_bar.py +14 -34
  115. euporie/preview/_settings.py +104 -0
  116. euporie/preview/app.py +8 -30
  117. euporie/preview/tabs/notebook.py +15 -86
  118. euporie/web/tabs/web.py +4 -6
  119. euporie/web/widgets/webview.py +5 -12
  120. {euporie-2.8.0.dist-info → euporie-2.8.5.dist-info}/METADATA +11 -15
  121. euporie-2.8.5.dist-info/RECORD +172 -0
  122. {euporie-2.8.0.dist-info → euporie-2.8.5.dist-info}/WHEEL +1 -1
  123. {euporie-2.8.0.dist-info → euporie-2.8.5.dist-info}/entry_points.txt +2 -2
  124. {euporie-2.8.0.dist-info → euporie-2.8.5.dist-info}/licenses/LICENSE +1 -1
  125. euporie/core/launch.py +0 -59
  126. euporie/core/terminal.py +0 -527
  127. euporie-2.8.0.dist-info/RECORD +0 -146
  128. {euporie-2.8.0.data → euporie-2.8.5.data}/data/share/applications/euporie-console.desktop +0 -0
  129. {euporie-2.8.0.data → euporie-2.8.5.data}/data/share/applications/euporie-notebook.desktop +0 -0
@@ -23,7 +23,8 @@ from euporie.core.layout.screen import BoundedWritePosition
23
23
  from euporie.core.utils import run_in_thread_with_context
24
24
 
25
25
  if TYPE_CHECKING:
26
- from typing import Callable, Literal, Sequence
26
+ from collections.abc import Sequence
27
+ from typing import Callable, Literal
27
28
 
28
29
  from prompt_toolkit.key_binding.key_bindings import (
29
30
  KeyBindingsBase,
@@ -43,6 +44,8 @@ log = logging.getLogger(__name__)
43
44
  class ScrollingContainer(Container):
44
45
  """A scrollable container which renders only the currently visible children."""
45
46
 
47
+ render_info: WindowRenderInfo | None
48
+
46
49
  def __init__(
47
50
  self,
48
51
  children: Callable[[], Sequence[AnyContainer]] | Sequence[AnyContainer],
@@ -284,25 +287,19 @@ class ScrollingContainer(Container):
284
287
  def wrapped(mouse_event: MouseEvent) -> NotImplementedOrNone:
285
288
  response: NotImplementedOrNone = NotImplemented
286
289
 
287
- if mouse_event.event_type == MouseEventType.SCROLL_DOWN:
288
- response = self.scroll(-1)
289
- elif mouse_event.event_type == MouseEventType.SCROLL_UP:
290
- response = self.scroll(1)
291
- elif callable(handler):
290
+ if callable(handler):
292
291
  response = handler(mouse_event)
293
292
 
293
+ if response is NotImplemented:
294
+ if mouse_event.event_type == MouseEventType.SCROLL_DOWN:
295
+ response = self.scroll(-1)
296
+ elif mouse_event.event_type == MouseEventType.SCROLL_UP:
297
+ response = self.scroll(1)
298
+
294
299
  # Refresh the child if there was a response
295
300
  if response is None:
296
301
  return response
297
302
 
298
- # This relies on windows returning NotImplemented when scrolled
299
- # to the start or end
300
- # if response is NotImplemented:
301
- # if mouse_event.event_type == MouseEventType.SCROLL_DOWN:
302
- # response = self.scroll(-1)
303
- # elif mouse_event.event_type == MouseEventType.SCROLL_UP:
304
- # response = self.scroll(1)
305
-
306
303
  # Select the clicked child if clicked
307
304
  if mouse_event.event_type == MouseEventType.MOUSE_DOWN:
308
305
  if child:
@@ -480,10 +477,10 @@ class ScrollingContainer(Container):
480
477
  )
481
478
  for y in range(ypos + line, ypos + available_height):
482
479
  for x in range(xpos, xpos + available_width):
483
- mouse_handlers.mouse_handlers[y][
484
- x
485
- ] = self._mouse_handler_wrapper(
486
- mouse_handlers.mouse_handlers[y][x]
480
+ mouse_handlers.mouse_handlers[y][x] = (
481
+ self._mouse_handler_wrapper(
482
+ mouse_handlers.mouse_handlers[y][x]
483
+ )
487
484
  )
488
485
  # Blit children above the selected that are on screen
489
486
  line = self.selected_child_position
@@ -525,10 +522,10 @@ class ScrollingContainer(Container):
525
522
  )
526
523
  for y in range(ypos, ypos + line):
527
524
  for x in range(xpos, xpos + available_width):
528
- mouse_handlers.mouse_handlers[y][
529
- x
530
- ] = self._mouse_handler_wrapper(
531
- mouse_handlers.mouse_handlers[y][x]
525
+ mouse_handlers.mouse_handlers[y][x] = (
526
+ self._mouse_handler_wrapper(
527
+ mouse_handlers.mouse_handlers[y][x]
528
+ )
532
529
  )
533
530
 
534
531
  # Dont bother drawing floats
@@ -600,9 +597,10 @@ class ScrollingContainer(Container):
600
597
 
601
598
  def all_children(self) -> Sequence[Container]:
602
599
  """Return the list of all children of this container."""
603
- if self.refresh_children:
604
- _children = self._children
605
- _children.clear()
600
+ _children = self._children
601
+ if self.refresh_children or not self._children:
602
+ self.refresh_children = False
603
+ new_children = []
606
604
  new_child_hashes = set()
607
605
  for child in self.children_func():
608
606
  if not (
@@ -611,21 +609,21 @@ class ScrollingContainer(Container):
611
609
  wrapped_child = self._child_cache[child_hash] = CachedContainer(
612
610
  child, mouse_handler_wrapper=self._mouse_handler_wrapper
613
611
  )
614
- _children.append(wrapped_child)
612
+ new_children.append(wrapped_child)
615
613
  new_child_hashes.add(child_hash)
614
+ _children[:] = new_children
616
615
 
617
616
  # Clean up metacache
618
617
  for child_hash in set(self._child_cache) - new_child_hashes:
619
618
  del self._child_cache[child_hash]
620
619
 
621
- self.refresh_children = False
622
620
  # Clean up positions
623
621
  self.index_positions = {
624
622
  i: pos
625
623
  for i, pos in self.index_positions.items()
626
624
  if i < len(self._children)
627
625
  }
628
- return self._children
626
+ return _children
629
627
 
630
628
  def get_children(self) -> list[Container]:
631
629
  """Return the list of currently visible children to include in the layout."""
euporie/core/log.py CHANGED
@@ -20,12 +20,10 @@ from prompt_toolkit.renderer import (
20
20
  from prompt_toolkit.shortcuts.utils import print_formatted_text
21
21
  from prompt_toolkit.styles.pygments import style_from_pygments_cls
22
22
  from prompt_toolkit.styles.style import Style, merge_styles
23
- from pygments.styles import get_style_by_name
24
23
 
25
- from euporie.core.config import add_setting
26
24
  from euporie.core.ft.utils import indent, lex, wrap
27
25
  from euporie.core.io import PseudoTTY
28
- from euporie.core.style import LOG_STYLE
26
+ from euporie.core.style import LOG_STYLE, get_style_by_name
29
27
  from euporie.core.utils import dict_merge
30
28
 
31
29
  if TYPE_CHECKING:
@@ -42,6 +40,65 @@ log = logging.getLogger(__name__)
42
40
  LOG_QUEUE: deque = deque(maxlen=1000)
43
41
 
44
42
 
43
+ class BufferedLogs(logging.Handler):
44
+ """A handler that collects log records and replays them on exit."""
45
+
46
+ def __init__(self, logger: logging.Logger | None = None) -> None:
47
+ """Initialize the collector.
48
+
49
+ Args:
50
+ logger: Logger to collect from and replay to. If None, uses root logger.
51
+ """
52
+ super().__init__()
53
+ self.records: list[logging.LogRecord] = []
54
+ self._logger = logger or logging.getLogger()
55
+ self._original_handlers: list[logging.Handler] = []
56
+
57
+ def emit(self, record: logging.LogRecord) -> None:
58
+ """Store the log record."""
59
+ self.records.append(record)
60
+
61
+ def replay(self) -> None:
62
+ """Replay collected logs through the original logger."""
63
+ for record in self.records:
64
+ if record.exc_info:
65
+ # Create a new record to avoid issues with stale exc_info
66
+ record = logging.LogRecord(
67
+ record.name,
68
+ record.levelno,
69
+ record.pathname,
70
+ record.lineno,
71
+ record.msg,
72
+ record.args,
73
+ record.exc_info,
74
+ record.funcName,
75
+ )
76
+ self._logger.handle(record)
77
+
78
+ def __enter__(self) -> BufferedLogs:
79
+ """Store and replace the log handlers."""
80
+ # Save and remove existing handlers
81
+ self._original_handlers = self._logger.handlers[:]
82
+ self._logger.handlers.clear()
83
+ # Add ourselves as the only handler
84
+ self._logger.addHandler(self)
85
+ return self
86
+
87
+ def __exit__(
88
+ self,
89
+ exc_type: type[BaseException] | None,
90
+ exc_value: BaseException | None,
91
+ exc_traceback: TracebackType | None,
92
+ ) -> None:
93
+ """Restore the original handlers."""
94
+ # Remove ourselves
95
+ self._logger.removeHandler(self)
96
+ # Restore original handlers
97
+ self._logger.handlers = self._original_handlers
98
+ # Replay collected records through original handlers
99
+ self.replay()
100
+
101
+
45
102
  class FtFormatter(logging.Formatter):
46
103
  """Base class for formatted text logging formatter."""
47
104
 
@@ -240,12 +297,17 @@ class StdoutFormatter(FtFormatter):
240
297
  msg_pad = len(date) + 10
241
298
  msg_pad_1st_line = msg_pad + 1 + len(ref)
242
299
 
243
- msg_lines = textwrap.wrap(
244
- record.message,
245
- width=width,
246
- initial_indent=" " * msg_pad_1st_line,
247
- subsequent_indent=" " * msg_pad,
248
- )
300
+ msg_lines = "\n".join(
301
+ textwrap.wrap(
302
+ record.message,
303
+ width=width,
304
+ initial_indent=" " * msg_pad_1st_line,
305
+ replace_whitespace=False,
306
+ )
307
+ ).split("\n")
308
+ subsequent_indent = " " * msg_pad
309
+ for i in range(1, len(msg_lines)):
310
+ msg_lines[i] = f"{subsequent_indent}{msg_lines[i]}"
249
311
 
250
312
  output: StyleAndTextTuples = [
251
313
  ("class:pygments.literal.date", date),
@@ -416,7 +478,7 @@ def setup_logs(config: Config | None = None) -> None:
416
478
  }
417
479
 
418
480
  if config is not None:
419
- log_file = config.get("log_file", "")
481
+ log_file = config.log_file or ""
420
482
  log_file_is_stdout = log_file in {"-", "/dev/stdout"}
421
483
  log_level = config.log_level.upper()
422
484
 
@@ -433,18 +495,14 @@ def setup_logs(config: Config | None = None) -> None:
433
495
  # Configure stdout handler
434
496
  if log_file_is_stdout:
435
497
  stdout_level = log_level
436
- elif (app_cls := config.app_cls) is not None and (
437
- log_stdout_level := app_cls.log_stdout_level
438
- ):
439
- stdout_level = log_stdout_level.upper()
440
498
  else:
441
- stdout_level = "CRITICAL"
499
+ stdout_level = config.log_level_stdout.upper()
442
500
  log_config["handlers"]["stdout"]["level"] = stdout_level
443
- if syntax_theme := config.get("syntax_theme"):
501
+ if syntax_theme := config.syntax_theme:
444
502
  log_config["handlers"]["stdout"]["pygments_theme"] = syntax_theme
445
503
 
446
504
  # Configure euporie logger
447
- log_config["loggers"]["euporie"]["level"] = config.log_level.upper()
505
+ log_config["loggers"]["euporie"]["level"] = log_level
448
506
 
449
507
  # Update log_config based on additional config dict provided
450
508
  if config.log_config:
@@ -463,46 +521,3 @@ def setup_logs(config: Config | None = None) -> None:
463
521
 
464
522
  # Log uncaught exceptions
465
523
  sys.excepthook = handle_exception
466
-
467
-
468
- # ################################### Settings ########################################
469
-
470
-
471
- add_setting(
472
- name="log_file",
473
- flags=["--log-file"],
474
- nargs="?",
475
- default="",
476
- type_=str,
477
- title="the log file path",
478
- help_="File path for logs",
479
- description="""
480
- When set to a file path, the log output will be written to the given path.
481
- If no value is given output will be sent to the standard output.
482
- """,
483
- )
484
-
485
- add_setting(
486
- name="log_level",
487
- flags=["--log-level"],
488
- type_=str,
489
- default="warning",
490
- title="the log level",
491
- help_="Set the log level",
492
- choices=["debug", "info", "warning", "error", "critical"],
493
- description="""
494
- When set, logging events at the given level are emitted.
495
- """,
496
- )
497
-
498
- add_setting(
499
- name="log_config",
500
- flags=["--log-config"],
501
- type_=str,
502
- default=None,
503
- title="additional logging configuration",
504
- help_="Additional logging configuration",
505
- description="""
506
- A JSON string specifying additional logging configuration.
507
- """,
508
- )
euporie/core/lsp.py CHANGED
@@ -13,8 +13,9 @@ from typing import TYPE_CHECKING, NamedTuple
13
13
  from prompt_toolkit.utils import Event
14
14
 
15
15
  if TYPE_CHECKING:
16
+ from collections.abc import Coroutine, Sequence
16
17
  from concurrent.futures import Future
17
- from typing import Any, Callable, Coroutine, Sequence
18
+ from typing import Any, Callable
18
19
 
19
20
 
20
21
  log = logging.getLogger(__name__)
@@ -475,6 +476,7 @@ class LspClient:
475
476
  "cellTextDocuments": [],
476
477
  }
477
478
  langs = self.can_change_nb_langs
479
+ lsp_notebook_cell: dict[str, Any]
478
480
  for cell in cells:
479
481
  if langs and cell.language not in langs:
480
482
  continue
@@ -598,6 +600,7 @@ class LspClient:
598
600
  },
599
601
  }
600
602
  langs = self.can_change_nb_langs
603
+ lsp_notebook_cell: dict[str, Any]
601
604
  for cell in cells:
602
605
  # If specified, only sync cells with the languages the server has requested
603
606
  if langs and cell.language not in langs:
@@ -657,6 +660,7 @@ class LspClient:
657
660
  "change": {"cells": (change := {"data": [], "textContent": []})},
658
661
  }
659
662
  langs = self.can_change_nb_langs
663
+ lsp_notebook_cell: dict[str, Any]
660
664
  for cell in cells:
661
665
  self._doc_versions[cell.path] += 1
662
666
  # If specified, only sync cells with the languages the server has requested
@@ -1032,10 +1036,24 @@ class LspClient:
1032
1036
 
1033
1037
  KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1034
1038
  # Custom additions
1035
- "ruff": {"command": ["ruff-lsp"], "languages": {"python"}},
1036
1039
  "typos": {"command": ["typos-lsp"], "languages": set()},
1037
1040
  # Helix's known LSPs
1038
1041
  "als": {"command": ["als"]},
1042
+ "ada-language-server": {"command": ["ada_language_server"], "languages": {"ada"}},
1043
+ "ada-gpr-language-server": {
1044
+ "command": ["ada_language_server", "--language-gpr"],
1045
+ "languages": {"ada"},
1046
+ },
1047
+ "angular": {
1048
+ "command": [
1049
+ "ngserver",
1050
+ "--stdio",
1051
+ "--tsProbeLocations",
1052
+ ".",
1053
+ "--ngProbeLocations",
1054
+ ".",
1055
+ ]
1056
+ },
1039
1057
  "awk-language-server": {"command": ["awk-language-server"], "languages": {"awk"}},
1040
1058
  "bash-language-server": {
1041
1059
  "command": ["bash-language-server", "start"],
@@ -1043,11 +1061,16 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1043
1061
  },
1044
1062
  "bass": {"command": ["bass", "--lsp"], "languages": {"bass"}},
1045
1063
  "bicep-langserver": {"command": ["bicep-langserver"], "languages": {"bicep"}},
1064
+ "bitbake-language-server": {
1065
+ "command": ["bitbake-language-server"],
1066
+ "languages": {"bitbake"},
1067
+ },
1046
1068
  "bufls": {"command": ["bufls", "serve"], "languages": {"protobuf"}},
1047
1069
  "cairo-language-server": {
1048
1070
  "command": ["cairo-language-server"],
1049
1071
  "languages": {"cairo"},
1050
1072
  },
1073
+ "circom-lsp": {"command": ["circom-lsp"], "languages": {"circom"}},
1051
1074
  "cl-lsp": {"command": ["cl-lsp", "stdio"], "languages": {"common-lisp"}},
1052
1075
  "clangd": {"command": ["clangd"], "languages": {"opencl", "cpp", "c"}},
1053
1076
  "clojure-lsp": {"command": ["clojure-lsp"], "languages": {"clojure"}},
@@ -1071,16 +1094,22 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1071
1094
  "command": ["docker-langserver", "--stdio"],
1072
1095
  "languages": {"dockerfile"},
1073
1096
  },
1097
+ "docker-compose-langserver": {
1098
+ "command": ["docker-compose-langserver", "--stdio"],
1099
+ "languages": {"docker-compose"},
1100
+ },
1074
1101
  "dot-language-server": {
1075
1102
  "command": ["dot-language-server", "--stdio"],
1076
1103
  "languages": {"dot"},
1077
1104
  },
1105
+ "earthlyls": {"command": ["earthlyls"], "languages": {"earthfile"}},
1078
1106
  "elixir-ls": {
1079
- "settings": {"elixirLS": {"dialyzerEnabled": False}},
1107
+ "config": {"elixirLS": {"dialyzerEnabled": False}},
1080
1108
  "command": ["elixir-ls"],
1081
- "languages": {"elixir", "heex"},
1109
+ "languages": {"heex", "elixir"},
1082
1110
  },
1083
1111
  "elm-language-server": {"command": ["elm-language-server"], "languages": {"elm"}},
1112
+ "elp": {"command": ["elp", "server"], "languages": {"erlang"}},
1084
1113
  "elvish": {"command": ["elvish", "-lsp"], "languages": {"elvish"}},
1085
1114
  "erlang-ls": {"command": ["erlang_ls"], "languages": {"erlang"}},
1086
1115
  "forc": {"command": ["forc", "lsp"], "languages": {"sway"}},
@@ -1090,11 +1119,12 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1090
1119
  "languages": {"fortran"},
1091
1120
  },
1092
1121
  "fsharp-ls": {
1093
- "settings": {"AutomaticWorkspaceInit": True},
1122
+ "config": {"AutomaticWorkspaceInit": True},
1094
1123
  "command": ["fsautocomplete"],
1095
1124
  "languages": {"fsharp"},
1096
1125
  },
1097
1126
  "gleam": {"command": ["gleam", "lsp"], "languages": {"gleam"}},
1127
+ "glsl_analyzer": {"command": ["glsl_analyzer"], "languages": {"glsl"}},
1098
1128
  "graphql-language-service": {
1099
1129
  "command": ["graphql-lsp", "server", "-m", "stream"],
1100
1130
  "languages": {"graphql"},
@@ -1103,9 +1133,12 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1103
1133
  "command": ["haskell-language-server-wrapper", "--lsp"],
1104
1134
  "languages": {"cabal", "haskell"},
1105
1135
  },
1136
+ "hyprls": {"command": ["hyprls"], "languages": {"hyprlang"}},
1106
1137
  "idris2-lsp": {"command": ["idris2-lsp"], "languages": {"idris"}},
1107
1138
  "intelephense": {"command": ["intelephense", "--stdio"], "languages": {"php"}},
1108
1139
  "jdtls": {"command": ["jdtls"], "languages": {"java"}},
1140
+ "jedi": {"command": ["jedi-language-server"], "languages": {"python"}},
1141
+ "jq-lsp": {"command": ["jq-lsp"], "languages": {"jq"}},
1109
1142
  "jsonnet-language-server": {
1110
1143
  "command": ["jsonnet-language-server", "-t", "--lint"],
1111
1144
  "languages": {"jsonnet"},
@@ -1122,22 +1155,39 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1122
1155
  ],
1123
1156
  "languages": {"julia"},
1124
1157
  },
1158
+ "koka": {
1159
+ "command": ["koka", "--language-server", "--lsstdio"],
1160
+ "languages": {"koka"},
1161
+ },
1125
1162
  "kotlin-language-server": {
1126
1163
  "command": ["kotlin-language-server"],
1127
1164
  "languages": {"kotlin"},
1128
1165
  },
1129
- "lean": {"command": ["lean", "--server"], "languages": {"lean"}},
1166
+ "lean": {"command": ["lean", "--server", "--memory=1024"], "languages": {"lean"}},
1130
1167
  "ltex-ls": {"command": ["ltex-ls"]},
1131
1168
  "markdoc-ls": {"command": ["markdoc-ls", "--stdio"], "languages": {"markdoc"}},
1169
+ "markdown-oxide": {"command": ["markdown-oxide"], "languages": {"markdown"}},
1132
1170
  "marksman": {"command": ["marksman", "server"], "languages": {"markdown"}},
1133
1171
  "metals": {
1134
- "settings": {"isHttpEnabled": True},
1172
+ "config": {
1173
+ "isHttpEnabled": True,
1174
+ "metals": {
1175
+ "inlayHints": {
1176
+ "typeParameters": {"enable": True},
1177
+ "hintsInPatternMatch": {"enable": True},
1178
+ }
1179
+ },
1180
+ },
1135
1181
  "command": ["metals"],
1136
1182
  "languages": {"scala"},
1137
1183
  },
1184
+ "mesonlsp": {"command": ["mesonlsp", "--lsp"], "languages": {"meson"}},
1138
1185
  "mint": {"command": ["mint", "ls"], "languages": {"mint"}},
1186
+ "mojo-lsp": {"command": ["mojo-lsp-server"], "languages": {"mojo"}},
1139
1187
  "nil": {"command": ["nil"], "languages": {"nix"}},
1140
1188
  "nimlangserver": {"command": ["nimlangserver"], "languages": {"nim"}},
1189
+ "nimlsp": {"command": ["nimlsp"]},
1190
+ "nixd": {"command": ["nixd"], "languages": {"nix"}},
1141
1191
  "nls": {"command": ["nls"], "languages": {"nickel"}},
1142
1192
  "nu-lsp": {"command": ["nu", "--lsp"], "languages": {"nu"}},
1143
1193
  "ocamllsp": {"command": ["ocamllsp"], "languages": {"ocaml", "ocaml-interface"}},
@@ -1150,6 +1200,10 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1150
1200
  "pasls": {"command": ["pasls"], "languages": {"pascal"}},
1151
1201
  "pbkit": {"command": ["pb", "lsp"], "languages": {"protobuf"}},
1152
1202
  "perlnavigator": {"command": ["perlnavigator", "--stdio"], "languages": {"perl"}},
1203
+ "pest-language-server": {
1204
+ "command": ["pest-language-server"],
1205
+ "languages": {"pest"},
1206
+ },
1153
1207
  "prisma-language-server": {
1154
1208
  "command": ["prisma-language-server", "--stdio"],
1155
1209
  "languages": {"prisma"},
@@ -1158,13 +1212,18 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1158
1212
  "command": ["purescript-language-server", "--stdio"],
1159
1213
  "languages": {"purescript"},
1160
1214
  },
1161
- "pylsp": {"command": ["pylsp"], "languages": {"python"}},
1162
- "pyright": {"settings": {}, "command": ["pyright-langserver", "--stdio"]},
1215
+ "pylsp": {"command": ["pylsp"], "languages": {"snakemake", "python"}},
1216
+ "pyright": {"config": {}, "command": ["pyright-langserver", "--stdio"]},
1217
+ "basedpyright": {"config": {}, "command": ["basedpyright-langserver", "--stdio"]},
1163
1218
  "pylyzer": {"command": ["pylyzer", "--server"]},
1164
1219
  "qmlls": {"command": ["qmlls"], "languages": {"qml"}},
1220
+ "quint-language-server": {
1221
+ "command": ["quint-language-server", "--stdio"],
1222
+ "languages": {"quint"},
1223
+ },
1165
1224
  "r": {
1166
1225
  "command": ["R", "--no-echo", "-e", "languageserver::run()"],
1167
- "languages": {"r", "rmarkdown"},
1226
+ "languages": {"rmarkdown", "r"},
1168
1227
  },
1169
1228
  "racket": {
1170
1229
  "command": ["racket", "-l", "racket-langserver"],
@@ -1176,11 +1235,16 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1176
1235
  "languages": {"rescript"},
1177
1236
  },
1178
1237
  "robotframework_ls": {"command": ["robotframework_ls"], "languages": {"robot"}},
1238
+ "ruff": {"command": ["ruff", "server"], "languages": {"python"}},
1179
1239
  "serve-d": {"command": ["serve-d"], "languages": {"d"}},
1180
1240
  "slint-lsp": {"command": ["slint-lsp"], "languages": {"slint"}},
1181
1241
  "solargraph": {"command": ["solargraph", "stdio"], "languages": {"ruby"}},
1182
1242
  "solc": {"command": ["solc", "--lsp"], "languages": {"solidity"}},
1183
1243
  "sourcekit-lsp": {"command": ["sourcekit-lsp"], "languages": {"swift"}},
1244
+ "spade-language-server": {
1245
+ "command": ["spade-language-server"],
1246
+ "languages": {"spade"},
1247
+ },
1184
1248
  "svlangserver": {"command": ["svlangserver"], "languages": {"verilog"}},
1185
1249
  "swipl": {
1186
1250
  "command": [
@@ -1196,6 +1260,7 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1196
1260
  ],
1197
1261
  "languages": {"prolog"},
1198
1262
  },
1263
+ "superhtml": {"command": ["superhtml", "lsp"], "languages": {"html"}},
1199
1264
  "tailwindcss-ls": {"command": ["tailwindcss-language-server", "--stdio"]},
1200
1265
  "taplo": {"command": ["taplo", "lsp", "stdio"], "languages": {"toml"}},
1201
1266
  "templ": {"command": ["templ", "lsp"], "languages": {"templ"}},
@@ -1204,36 +1269,38 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1204
1269
  "languages": {"tfvars", "hcl"},
1205
1270
  },
1206
1271
  "texlab": {"command": ["texlab"], "languages": {"latex", "bibtex"}},
1272
+ "typespec": {"command": ["tsp-server", "--stdio"], "languages": {"typespec"}},
1207
1273
  "vala-language-server": {
1208
1274
  "command": ["vala-language-server"],
1209
1275
  "languages": {"vala"},
1210
1276
  },
1277
+ "vale-ls": {"command": ["vale-ls"]},
1211
1278
  "vhdl_ls": {"command": ["vhdl_ls"], "languages": {"vhdl"}},
1212
1279
  "vlang-language-server": {"command": ["v-analyzer"], "languages": {"v"}},
1213
1280
  "vscode-css-language-server": {
1214
- "settings": {"provideFormatter": True, "css": {"validate": {"enable": True}}},
1281
+ "config": {"provideFormatter": True, "css": {"validate": {"enable": True}}},
1215
1282
  "command": ["vscode-css-language-server", "--stdio"],
1216
1283
  "languages": {"scss", "css"},
1217
1284
  },
1218
1285
  "vscode-html-language-server": {
1219
- "settings": {"provideFormatter": True},
1286
+ "config": {"provideFormatter": True},
1220
1287
  "command": ["vscode-html-language-server", "--stdio"],
1221
1288
  "languages": {"html"},
1222
1289
  },
1223
1290
  "vscode-json-language-server": {
1224
- "settings": {"provideFormatter": True, "json": {"validate": {"enable": True}}},
1291
+ "config": {"provideFormatter": True, "json": {"validate": {"enable": True}}},
1225
1292
  "command": ["vscode-json-language-server", "--stdio"],
1226
- "languages": {"json"},
1293
+ "languages": {"jsonc", "json"},
1227
1294
  },
1228
1295
  "vuels": {
1229
- "settings": {"typescript": {"tsdk": "node_modules/typescript/lib/"}},
1296
+ "config": {"typescript": {"tsdk": "node_modules/typescript/lib/"}},
1230
1297
  "command": ["vue-language-server", "--stdio"],
1231
1298
  "languages": {"vue"},
1232
1299
  },
1233
1300
  "wgsl_analyzer": {"command": ["wgsl_analyzer"], "languages": {"wgsl"}},
1234
1301
  "yaml-language-server": {
1235
1302
  "command": ["yaml-language-server", "--stdio"],
1236
- "languages": {"yaml"},
1303
+ "languages": {"yaml", "docker-compose"},
1237
1304
  },
1238
1305
  "zls": {"command": ["zls"], "languages": {"zig"}},
1239
1306
  "blueprint-compiler": {
@@ -1241,12 +1308,22 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1241
1308
  "languages": {"blueprint"},
1242
1309
  },
1243
1310
  "typst-lsp": {"command": ["typst-lsp"], "languages": {"typst"}},
1311
+ "tinymist": {"command": ["tinymist"], "languages": {"typst"}},
1312
+ "pkgbuild-language-server": {
1313
+ "command": ["pkgbuild-language-server"],
1314
+ "languages": {"pkgbuild"},
1315
+ },
1316
+ "helm_ls": {"command": ["helm_ls", "serve"], "languages": {"helm"}},
1317
+ "ember-language-server": {
1318
+ "command": ["ember-language-server", "--stdio"],
1319
+ "languages": {"gts", "gjs", "glimmer"},
1320
+ },
1244
1321
  "ansible-language-server": {
1245
1322
  "command": ["ansible-language-server", "--stdio"],
1246
1323
  "languages": {"yaml"},
1247
1324
  },
1248
1325
  "lua-language-server": {
1249
- "settings": {
1326
+ "config": {
1250
1327
  "Lua": {
1251
1328
  "hint": {
1252
1329
  "enable": True,
@@ -1262,7 +1339,7 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1262
1339
  "languages": {"lua"},
1263
1340
  },
1264
1341
  "gopls": {
1265
- "settings": {
1342
+ "config": {
1266
1343
  "hints": {
1267
1344
  "assignVariableTypes": True,
1268
1345
  "compositeLiteralFields": True,
@@ -1273,10 +1350,10 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1273
1350
  }
1274
1351
  },
1275
1352
  "command": ["gopls"],
1276
- "languages": {"gotmpl", "gowork", "go", "gomod"},
1353
+ "languages": {"go", "gowork", "gotmpl", "gomod"},
1277
1354
  },
1278
1355
  "golangci-lint-lsp": {
1279
- "settings": {
1356
+ "config": {
1280
1357
  "command": [
1281
1358
  "golangci-lint",
1282
1359
  "run",
@@ -1289,7 +1366,7 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1289
1366
  "languages": {"go"},
1290
1367
  },
1291
1368
  "rust-analyzer": {
1292
- "settings": {
1369
+ "config": {
1293
1370
  "inlayHints": {
1294
1371
  "bindingModeHints": {"enable": False},
1295
1372
  "closingBraceHints": {"minLines": 10},
@@ -1303,7 +1380,7 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1303
1380
  "languages": {"rust"},
1304
1381
  },
1305
1382
  "typescript-language-server": {
1306
- "settings": {
1383
+ "config": {
1307
1384
  "hostInfo": "helix",
1308
1385
  "typescript": {
1309
1386
  "inlayHints": {
@@ -1329,10 +1406,10 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1329
1406
  },
1330
1407
  },
1331
1408
  "command": ["typescript-language-server", "--stdio"],
1332
- "languages": {"tsx", "typescript", "jsx", "javascript"},
1409
+ "languages": {"jsx", "typescript", "javascript", "tsx"},
1333
1410
  },
1334
1411
  "svelteserver": {
1335
- "settings": {
1412
+ "config": {
1336
1413
  "configuration": {
1337
1414
  "typescript": {
1338
1415
  "inlayHints": {
@@ -1359,4 +1436,21 @@ KNOWN_LSP_SERVERS: dict[str, dict[str, Any]] = {
1359
1436
  "command": ["svelteserver", "--stdio"],
1360
1437
  "languages": {"svelte"},
1361
1438
  },
1439
+ "vscode-eslint-language-server": {
1440
+ "config": {
1441
+ "validate": "on",
1442
+ "experimental": {"useFlatConfig": False},
1443
+ "rulesCustomizations": [],
1444
+ "run": "onType",
1445
+ "problems": {"shortenToSingleLine": False},
1446
+ "nodePath": "",
1447
+ "codeAction": {
1448
+ "disableRuleComment": {"enable": True, "location": "separateLine"},
1449
+ "showDocumentation": {"enable": True},
1450
+ },
1451
+ "workingDirectory": {"mode": "location"},
1452
+ },
1453
+ "command": ["vscode-eslint-language-server", "--stdio"],
1454
+ "languages": {"gts", "gjs"},
1455
+ },
1362
1456
  }