From 1f04ec9967c4fb4703657458531cbbe958e66b37 Mon Sep 17 00:00:00 2001 From: blasty Date: Sat, 25 Jul 2026 12:23:18 +0200 Subject: decomp: Home/End move along the line instead of scrolling to top/bottom MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pseudocode view still had the old mapping (home -> goto_top, end -> goto_bottom), so jumped you to the bottom of the function instead of the end of the line. Bring it in line with the listing view: home start of line ctrl+home top of the function shift+home first non-blank ctrl+end/G bottom of the function end end of line shift+home skips the C indentation — the pseudocode analogue of the listing's skip-the-address-gutter. Verified live and locked in view_toggle (5 checks): stays on the line with the scroll unchanged, hits column 0, lands on the indent width, and ctrl+home/ctrl+end still reach top/bottom. Full suite 179/2-flake. --- idatui/app.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'idatui') diff --git a/idatui/app.py b/idatui/app.py index 0012e32..f79d04d 100644 --- a/idatui/app.py +++ b/idatui/app.py @@ -1449,8 +1449,13 @@ class DecompView(SearchMixin, NavMixin, ColumnCursor, ScrollView, can_focus=True Binding("ctrl+u", "half_page(-1)", "½↑", show=False), Binding("pagedown", "page(1)", "PgDn", show=False), Binding("pageup", "page(-1)", "PgUp", show=False), - Binding("home", "goto_top", "Top", show=False), - Binding("G,end", "goto_bottom", "Bottom", show=False), + # Home/End move the cursor along the line (as in the listing); top and + # bottom of the function move to the ctrl+ pair (G still works too). + Binding("home", "col_home", "bol", show=False), + Binding("shift+home", "col_code_home", "code start", show=False), + Binding("end", "col_end", "eol", show=False), + Binding("ctrl+home", "goto_top", "Top", show=False), + Binding("G,ctrl+end", "goto_bottom", "Bottom", show=False), *SearchMixin.SEARCH_BINDINGS, *NavMixin.NAV_BINDINGS, *ColumnCursor.COL_BINDINGS, @@ -1649,6 +1654,15 @@ class DecompView(SearchMixin, NavMixin, ColumnCursor, ScrollView, can_focus=True if round(old_value) != round(new_value): self.post_message(DecompView.Scrolled()) + def action_col_code_home(self) -> None: + """shift+home: first non-blank column — past the C indentation, the + pseudocode analogue of the listing's skip-the-address-gutter.""" + text = self._line_plain(self.cursor) or "" + self.cursor_x = len(text) - len(text.lstrip()) if text.strip() else 0 + self._hscroll() + _refresh_lines(self, self.cursor) + self._refresh_hl() + def line_for_ea(self, ea: int) -> int | None: """The pseudocode line whose marker ea is the largest <= ``ea`` (the C line that best covers an instruction address).""" -- cgit v1.3.1-sl0p