From b872a39e0124cef0df109592bb82e9f0da15f6c3 Mon Sep 17 00:00:00 2001 From: Billy Date: Sun, 7 Apr 2024 13:21:56 +0530 Subject: [PATCH] feat: Add editor specific commands to go menu --- .../components/editors/texteditor/text.py | 10 +++---- .../components/floating/palette/__init__.py | 2 +- .../components/floating/palette/searchbar.py | 2 +- biscuit/core/components/lsp/__init__.py | 2 +- biscuit/core/components/lsp/client.py | 26 +++++++++++++++---- biscuit/core/layout/menubar/__init__.py | 15 ++++++++++- biscuit/core/utils/events.py | 17 +++++++++++- 7 files changed, 59 insertions(+), 15 deletions(-) diff --git a/biscuit/core/components/editors/texteditor/text.py b/biscuit/core/components/editors/texteditor/text.py index fcc96555..7498a006 100644 --- a/biscuit/core/components/editors/texteditor/text.py +++ b/biscuit/core/components/editors/texteditor/text.py @@ -146,7 +146,7 @@ def config_bindings(self): self.bind("<>", self.on_selection) self.bind("", lambda _: self.set_ctrl_key(True)) self.bind("", lambda _: self.set_ctrl_key(False)) - self.bind("", self.request_goto_definition) + self.bind("", self.request_definition) self.bind("", lambda _: self.base.language_server_manager.request_completions(self)) def key_release_events(self, event: tk.Event): @@ -542,14 +542,14 @@ def set_ctrl_key(self, flag): def clear_goto_marks(self): self.tag_remove("hyperlink", 1.0, tk.END) - def request_goto_definition(self, e: tk.Event): - if not self.lsp or not self.last_hovered: + def request_definition(self, from_menu=False, *_): + if not from_menu and (not self.lsp or not self.last_hovered): return self.base.language_server_manager.request_goto_definition(self) - def request_references(self, e: tk.Event): - if not self.lsp or not self.last_hovered: + def request_references(self, from_menu=False, *_): + if not from_menu and (not self.lsp or not self.last_hovered): return self.base.language_server_manager.request_references(self) diff --git a/biscuit/core/components/floating/palette/__init__.py b/biscuit/core/components/floating/palette/__init__.py index 1e520114..692e4f59 100644 --- a/biscuit/core/components/floating/palette/__init__.py +++ b/biscuit/core/components/floating/palette/__init__.py @@ -155,7 +155,7 @@ def show_items(self, items: list[PaletteItem]) -> None: self.reset_selection() - def show(self, prefix: str, default: str=None) -> None: + def show(self, prefix: str=None, default: str=None) -> None: """Shows the palette with the passed prefix""" self.update_idletasks() diff --git a/biscuit/core/components/floating/palette/searchbar.py b/biscuit/core/components/floating/palette/searchbar.py index f652c83b..a44e32ba 100644 --- a/biscuit/core/components/floating/palette/searchbar.py +++ b/biscuit/core/components/floating/palette/searchbar.py @@ -41,7 +41,7 @@ def clear(self) -> None: def focus(self) -> None: self.search_bar.focus() - def add_prefix(self, prefix: str) -> None: + def add_prefix(self, prefix: str=None) -> None: self.prefix = prefix self.text_variable.set(prefix + " " if prefix else "") self.search_bar.icursor(tk.END) diff --git a/biscuit/core/components/lsp/__init__.py b/biscuit/core/components/lsp/__init__.py index 49c40355..dccb5c8f 100644 --- a/biscuit/core/components/lsp/__init__.py +++ b/biscuit/core/components/lsp/__init__.py @@ -18,7 +18,7 @@ def __init__(self, base: App): self.langservers: dict[str, str] = {} # built-in support for python-lsp-server - self.langservers["python"] = "pylsp" + self.langservers["Python"] = "pylsp" self.existing: dict[str, LangServerClient] = {} self.latest: LangServerClient = None diff --git a/biscuit/core/components/lsp/client.py b/biscuit/core/components/lsp/client.py index aab62418..5628fdab 100644 --- a/biscuit/core/components/lsp/client.py +++ b/biscuit/core/components/lsp/client.py @@ -140,34 +140,50 @@ def request_go_to_definition(self, tab: Text) -> None: if tab.path is None or self.client.state != lsp.ClientState.NORMAL: return + # very bad hack to ignore mouse and use cursor position + tab.focus_set() + pos = tab.get_mouse_pos() + if pos == '1.0': + pos = tab.get_cursor_pos() + request_id = self.client.definition( lsp.TextDocumentPosition( textDocument=lsp.TextDocumentIdentifier(uri=Path(tab.path).as_uri()), - position=encode_position(tab.get_mouse_pos()), + position=encode_position(pos), ) ) - self._gotodef_requests[request_id] = (tab, tab.get_mouse_pos()) + self._gotodef_requests[request_id] = (tab, pos) def request_references(self, tab: Text) -> None: if tab.path is None or self.client.state != lsp.ClientState.NORMAL: return + + tab.focus_set() + pos = tab.get_mouse_pos() + if pos == '1.0': + pos = tab.get_cursor_pos() request_id = self.client.references( lsp.TextDocumentPosition( textDocument=lsp.TextDocumentIdentifier(uri=Path(tab.path).as_uri()), - position=encode_position(tab.get_cursor_pos()), + position=encode_position(pos), ) ) - self._ref_requests.append((tab, tab.get_mouse_pos())) + self._ref_requests.append((tab, pos)) def request_rename(self, tab: Text, new_name: str) -> None: if tab.path is None or self.client.state != lsp.ClientState.NORMAL: return + tab.focus_set() + pos = tab.get_mouse_pos() + if pos == '1.0': + pos = tab.get_cursor_pos() + request_id = self.client.rename( lsp.TextDocumentPosition( textDocument=lsp.TextDocumentIdentifier(uri=Path(tab.path).as_uri()), - position=encode_position(tab.get_cursor_pos()), + position=encode_position(pos), ), new_name=new_name, ) diff --git a/biscuit/core/layout/menubar/__init__.py b/biscuit/core/layout/menubar/__init__.py index 3361fcb1..3316762c 100644 --- a/biscuit/core/layout/menubar/__init__.py +++ b/biscuit/core/layout/menubar/__init__.py @@ -100,6 +100,7 @@ def add_menus(self) -> None: self.add_edit_menu() self.add_selection_menu() self.add_view_menu() + self.add_go_menu() self.add_help_menu() def add_file_menu(self) -> None: @@ -163,7 +164,7 @@ def add_view_menu(self) -> None: events = self.events self.view_menu = self.add_menu("View") - self.view_menu.add_item("Command Palette...", lambda: self.base.palette.show(">")) + self.view_menu.add_item("Command Palette...", events.show_command_palette) self.view_menu.add_item("Explorer", events.show_explorer) self.view_menu.add_item("Outline", events.show_outline) self.view_menu.add_item("Search", events.show_search) @@ -172,6 +173,18 @@ def add_view_menu(self) -> None: self.view_menu.add_separator() self.view_menu.add_item("Terminal", events.show_terminal) self.view_menu.add_item("Log", events.show_logs) + + def add_go_menu(self) -> None: + events = self.events + + self.view_menu = self.add_menu("Go") + self.view_menu.add_item("Go to File...", events.show_file_search_palette) + self.view_menu.add_separator() + self.view_menu.add_item("Go to Symbol in Editor", events.show_symbol_palette) + self.view_menu.add_item("Go to Definition", events.go_to_definition) + self.view_menu.add_item("Go to References", events.find_references) + self.view_menu.add_separator() + self.view_menu.add_item("Go to Line/Column...", events.show_goto_palette) def add_help_menu(self) -> None: events = self.events diff --git a/biscuit/core/utils/events.py b/biscuit/core/utils/events.py index 38206145..53e1da4a 100644 --- a/biscuit/core/utils/events.py +++ b/biscuit/core/utils/events.py @@ -216,6 +216,21 @@ def duplicate_selection(self, *_) -> None: if editor := self.base.editorsmanager.active_editor: if editor.content and editor.content.editable: editor.content.text.event_duplicate_selection() + + def go_to_definition(self, *_) -> None: + if editor := self.base.editorsmanager.active_editor: + if editor.content and editor.content.editable: + editor.content.text.request_definition(from_menu=True) + + def find_references(self, *_) -> None: + if editor := self.base.editorsmanager.active_editor: + if editor.content and editor.content.editable: + editor.content.text.request_references(from_menu=True) + + def rename_symbol(self, *_) -> None: + if editor := self.base.editorsmanager.active_editor: + if editor.content and editor.content.editable: + editor.content.text.request_rename() def show_explorer(self, *_) -> None: self.base.sidebar.show_explorer() @@ -272,7 +287,7 @@ def show_run_config_palette(self, command) -> None: self.base.palette.show('runconf:', command) def show_file_search_palette(self, *_) -> None: - self.base.palette.show("") + self.base.palette.show() def documentation(self, *_) -> None: web.open("https://billyeatcookies.github.io/biscuit/")