checkpoint

This commit is contained in:
Ryan Fleury
2026-07-27 14:47:36 -07:00
parent f247d3c52d
commit 9ed2e020e8
8 changed files with 1010 additions and 310 deletions
-1
View File
@@ -20,7 +20,6 @@ target:
{
executable: "build/mule_main.exe"
working_directory: build
output_label: output_a
}
target:
{
+198 -198
View File
@@ -948,302 +948,302 @@ RD_RegTable:
////////////////////////////////
//~ rjf: Command Table
@table(name ui_vis ipc_docs_vis q_expr q_slot q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags filter_tags)
// / | | | \___ _________________________________________________/ | | | | | |
// / | | | \ / | | | | | |
RD_CmdTable: // | | | | | | | | | | |
@table(name foo ui_vis ipc_docs_vis q_expr q_slot q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags filter_tags)
// / | | | | \___ _________________________________________________/ | | | | | |
// / | | | | \ / | | | | | |
RD_CmdTable: // | | | | | | | | | | | |
{
//- rjf: exiting
{Exit 1 1 "" Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" }
{Exit 0 1 1 "" Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" }
//- rjf: palette
{OpenPalette 1 1 "" Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" }
{OpenPalette 0 1 1 "" Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" }
//- rjf: command fast-path
{RunCommand 0 0 "query:commands" CmdName 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" }
{RunCommand 0 0 0 "query:commands" CmdName 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" }
//- rjf: external drivers
{RunExternalDriverTextCommand 0 0 "" Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" }
{State 0 1 "" Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" }
{Eval 0 1 "" Expr 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" }
{LineFromVAddr 0 1 "" Vaddr 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" }
{RunExternalDriverTextCommand 0 0 0 "" Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" }
{State 0 0 1 "" Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" }
{Eval 0 0 1 "" Expr 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" }
{LineFromVAddr 0 0 1 "" Vaddr 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" }
//- rjf: os event passthrough
{WMEvent 0 0 "" Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" }
{WMEvent 0 0 0 "" Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" }
//- rjf: thread/frame selection
{SelectThread 1 1 "query:threads" Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" }
{SelectUnwind 0 1 "query:call_stack" Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" }
{UpOneFrame 1 1 "" Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" }
{DownOneFrame 1 1 "" Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" }
{SelectEntity 0 0 "" Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" }
{DeselectEntity 0 0 "" Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" }
{SelectThread 0 1 1 "query:threads" Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" }
{SelectUnwind 0 0 1 "query:call_stack" Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" }
{UpOneFrame 0 1 1 "" Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" }
{DownOneFrame 0 1 1 "" Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" }
{SelectEntity 0 0 0 "" Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" }
{DeselectEntity 0 0 0 "" Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" }
//- rjf: font sizes
{IncWindowFontSize 1 1 "" Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" }
{DecWindowFontSize 1 1 "" Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" }
{IncViewFontSize 1 1 "" Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" }
{DecViewFontSize 1 1 "" Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" }
{IncWindowFontSize 0 1 1 "" Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" }
{DecWindowFontSize 0 1 1 "" Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" }
{IncViewFontSize 0 1 1 "" Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" }
{DecViewFontSize 0 1 1 "" Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" }
//- rjf: windows
{OpenWindow 1 1 "" Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" }
{WindowSettings 1 1 "" Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" }
{CloseWindow 1 1 "" Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" }
{ToggleFullscreen 1 1 "" Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" }
{BringToFront 0 1 "" Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" }
{OpenWindow 0 1 1 "" Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" }
{WindowSettings 0 1 1 "" Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" }
{CloseWindow 0 1 1 "" Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" }
{ToggleFullscreen 0 1 1 "" Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" }
{BringToFront 0 0 1 "" Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" }
//- rjf: popups
{PopupAccept 0 1 "" Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" }
{PopupCancel 0 1 "" Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" }
{PopupAccept 0 0 1 "" Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" }
{PopupCancel 0 0 1 "" Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" }
//- rjf: keybindings
{ResetToDefaultBindings 1 1 "" Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" }
{ResetToDefaultBindings 0 1 1 "" Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" }
//- rjf: panel splitting
{ResetToDefaultPanels 1 1 "" Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" }
{ResetToCompactPanels 1 1 "" Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" }
{ResetToSimplePanels 1 1 "" Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" }
{NewPanelLeft 1 1 "" Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" }
{NewPanelUp 1 1 "" Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" }
{NewPanelRight 1 1 "" Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" }
{NewPanelDown 1 1 "" Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" }
{SplitPanel 0 0 "" Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" }
{ResetToDefaultPanels 0 1 1 "" Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" }
{ResetToCompactPanels 0 1 1 "" Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" }
{ResetToSimplePanels 0 1 1 "" Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" }
{NewPanelLeft 0 1 1 "" Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" }
{NewPanelUp 0 1 1 "" Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" }
{NewPanelRight 0 1 1 "" Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" }
{NewPanelDown 0 1 1 "" Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" }
{SplitPanel 0 0 0 "" Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" }
//- rjf: panel rotation
{RotatePanelColumns 1 1 "" Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" }
{RotatePanelColumns 0 1 1 "" Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" }
//- rjf: focused panel changing
{NextPanel 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" }
{PrevPanel 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" }
{FocusPanel 0 0 "" Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" }
{FocusPanelRight 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" }
{FocusPanelLeft 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" }
{FocusPanelUp 1 1 "" Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" }
{FocusPanelDown 1 1 "" Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" }
{NextPanel 0 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" }
{PrevPanel 0 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" }
{FocusPanel 0 0 0 "" Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" }
{FocusPanelRight 0 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" }
{FocusPanelLeft 0 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" }
{FocusPanelUp 0 1 1 "" Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" }
{FocusPanelDown 0 1 1 "" Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" }
//- rjf: undo/redo
{Undo 0 0 "" Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" }
{Redo 0 0 "" Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" }
{Undo 0 0 0 "" Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" }
{Redo 0 0 0 "" Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" }
//- rjf: focus history
{GoBack 0 0 "" Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" }
{GoForward 0 0 "" Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" }
{GoBack 0 0 0 "" Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" }
{GoForward 0 0 0 "" Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" }
//- rjf: panel removal
{ClosePanel 1 1 "" Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" }
{ClosePanel 0 1 1 "" Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" }
//- rjf: panel tab
{FocusTab 0 0 "" Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" }
{NextTab 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" }
{PrevTab 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" }
{MoveTabRight 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "" }
{MoveTabLeft 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "" }
{OpenTab 1 1 "query:tab_commands" CmdName 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" }
{BuildTab 0 0 "" Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" }
{DuplicateTab 1 1 "" Tab 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "" }
{CopyTabFullPath 0 0 "" Tab 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "" }
{CloseTab 1 1 "" Tab 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "" }
{MoveView 0 0 "" Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" }
{TabBarTop 1 1 "" Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "" }
{TabBarBottom 1 1 "" Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "" }
{TabSettings 1 1 "" Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" }
{FocusTab 0 0 0 "" Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" }
{NextTab 0 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" }
{PrevTab 0 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" }
{MoveTabRight 0 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "" }
{MoveTabLeft 0 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "" }
{OpenTab 0 1 1 "query:tab_commands" CmdName 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" }
{BuildTab 0 0 0 "" Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" }
{DuplicateTab 0 1 1 "" Tab 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "" }
{CopyTabFullPath 0 0 0 "" Tab 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "" }
{CloseTab 0 1 1 "" Tab 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "" }
{MoveView 0 0 0 "" Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" }
{TabBarTop 0 1 1 "" Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "" }
{TabBarBottom 0 1 1 "" Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "" }
{TabSettings 0 1 1 "" Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" }
//- rjf: files
{SetCurrentPath 0 1 "" Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" }
{Open 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" }
{OpenSourceFileFromDebugInfo 1 0 "query:source_files" Cfg 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "{tab_commands}" }
{SwitchToPartnerFile 1 1 "" Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" }
{ShowFileInExplorer 1 1 "" Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "" }
{SetCurrentPath 0 0 1 "" Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" }
{Open 0 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" }
{OpenSourceFileFromDebugInfo 0 1 0 "query:source_files" Cfg 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "{tab_commands}" }
{SwitchToPartnerFile 0 1 1 "" Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" }
{ShowFileInExplorer 0 1 1 "" Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "" }
//- rjf: source <-> disasm
{GoToDisassembly 1 1 "" Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "{text_pt_commands}" }
{GoToSource 1 1 "" Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "{disasm_pt_commands}" }
{GoToDisassembly 0 1 1 "" Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "{text_pt_commands}" }
{GoToSource 0 1 1 "" Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "{disasm_pt_commands}" }
//- rjf: override file links
{SetFileReplacementPath 0 0 "" Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" }
{SetFileReplacementPath 0 0 0 "" Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" }
//- rjf: setting config paths
{NewUser 1 1 "" Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" }
{NewProject 1 1 "" Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" }
{OpenUser 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" }
{OpenProject 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" }
{OpenRecentProject 1 1 "query:recent_projects" Cfg 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" }
{SaveUser 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" }
{SaveProject 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" }
{RecordUserAsLastOpened 0 0 "" Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" }
{RecordProjectInUser 0 0 "" Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" }
{NewUser 0 1 1 "" Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" }
{NewProject 0 1 1 "" Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" }
{OpenUser 0 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" }
{OpenProject 0 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" }
{OpenRecentProject 0 1 1 "query:recent_projects" Cfg 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" }
{SaveUser 0 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" }
{SaveProject 0 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" }
{RecordUserAsLastOpened 0 0 0 "" Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" }
{RecordProjectInUser 0 0 0 "" Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" }
//- rjf: writing config changes
{WriteUserData 0 1 "" Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" }
{WriteProjectData 0 1 "" Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" }
{WriteUserData 0 0 1 "" Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" }
{WriteProjectData 0 0 1 "" Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" }
//- rjf: opening user/project settings
{UserSettings 1 1 "" Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" }
{ProjectSettings 1 1 "" Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" }
{UserSettings 0 1 1 "" Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" }
{ProjectSettings 0 1 1 "" Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" }
//- rjf: meta controls
{Edit 1 1 "" Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" }
{Accept 1 1 "" Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" }
{Cancel 1 1 "" Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" }
{FocusMenu 1 1 "" Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" }
{Edit 0 1 1 "" Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" }
{Accept 0 1 1 "" Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" }
{Cancel 0 1 1 "" Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" }
{FocusMenu 0 1 1 "" Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" }
//- rjf: directional movement & text controls
{MoveLeft 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" }
{MoveRight 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" }
{MoveUp 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" }
{MoveDown 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" }
{MoveLeftSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" }
{MoveRightSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" }
{MoveUpSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" }
{MoveDownSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" }
{MoveLeftChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" }
{MoveRightChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" }
{MoveUpChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" }
{MoveDownChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" }
{MoveUpPage 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" }
{MoveDownPage 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" }
{MoveUpWhole 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" }
{MoveDownWhole 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" }
{MoveLeftChunkSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" }
{MoveRightChunkSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" }
{MoveUpChunkSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" }
{MoveDownChunkSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" }
{MoveUpPageSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" }
{MoveDownPageSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" }
{MoveUpWholeSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" }
{MoveDownWholeSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" }
{MoveUpReorder 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" }
{MoveDownReorder 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" }
{MoveHome 1 1 "" Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" }
{MoveEnd 1 1 "" Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" }
{MoveHomeSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" }
{MoveEndSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" }
{SelectAll 1 1 "" Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" }
{DeleteSingle 1 1 "" Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" }
{DeleteChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" }
{BackspaceSingle 1 1 "" Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" }
{BackspaceChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" }
{Copy 1 1 "" Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "{text_range_commands}{disasm_range_commands}" }
{Cut 1 1 "" Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" }
{Paste 1 1 "" Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" }
{InsertText 0 1 "" Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" }
{MoveLeft 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" }
{MoveRight 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" }
{MoveUp 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" }
{MoveDown 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" }
{MoveLeftSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" }
{MoveRightSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" }
{MoveUpSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" }
{MoveDownSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" }
{MoveLeftChunk 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" }
{MoveRightChunk 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" }
{MoveUpChunk 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" }
{MoveDownChunk 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" }
{MoveUpPage 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" }
{MoveDownPage 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" }
{MoveUpWhole 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" }
{MoveDownWhole 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" }
{MoveLeftChunkSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" }
{MoveRightChunkSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" }
{MoveUpChunkSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" }
{MoveDownChunkSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" }
{MoveUpPageSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" }
{MoveDownPageSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" }
{MoveUpWholeSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" }
{MoveDownWholeSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" }
{MoveUpReorder 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" }
{MoveDownReorder 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" }
{MoveHome 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" }
{MoveEnd 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" }
{MoveHomeSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" }
{MoveEndSelect 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" }
{SelectAll 0 1 1 "" Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" }
{DeleteSingle 0 1 1 "" Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" }
{DeleteChunk 0 1 1 "" Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" }
{BackspaceSingle 0 1 1 "" Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" }
{BackspaceChunk 0 1 1 "" Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" }
{Copy 0 1 1 "" Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "{text_range_commands}{disasm_range_commands}" }
{Cut 0 1 1 "" Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" }
{Paste 0 1 1 "" Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" }
{InsertText 0 0 1 "" Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" }
//- rjf: directionless navigation
{MoveNext 1 1 "" Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" }
{MovePrev 1 1 "" Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" }
{MoveNext 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" }
{MovePrev 0 1 1 "" Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" }
//- rjf: code navigation
{GoToLine 1 1 "" LineNum 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" }
{GoToAddress 1 1 "" Vaddr 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" }
{CenterCursor 1 1 "" Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" }
{ContainCursor 1 1 "" Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" }
{FindNext 1 1 "" Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" }
{FindPrev 1 1 "" Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" }
{GoToLine 0 1 1 "" LineNum 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" }
{GoToAddress 0 1 1 "" Vaddr 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" }
{CenterCursor 0 1 1 "" Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" }
{ContainCursor 0 1 1 "" Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" }
{FindNext 0 1 1 "" Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" }
{FindPrev 0 1 1 "" Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" }
//- rjf: thread finding
{FindThread 1 1 "query:threads" Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" }
{FindSelectedThread 1 1 "" Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "{text_pt_commands}{text_range_commands}{disasm_pt_commands}{disasm_range_commands}" }
{FindThread 0 1 1 "query:threads" Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" }
{FindSelectedThread 0 1 1 "" Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "{text_pt_commands}{text_range_commands}{disasm_pt_commands}{disasm_range_commands}" }
//- rjf: name finding
{GoToName 1 1 "query:procedures" String 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" }
{GoToNameAtCursor 1 1 "" Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "{text_pt_commands}{disasm_pt_commands}" }
{GoToName 0 1 1 "query:procedures" String 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" }
{GoToNameAtCursor 0 1 1 "" Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "{text_pt_commands}{disasm_pt_commands}" }
//- rjf: watch expressions
{ToggleWatchExpression 1 1 "" Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "" }
{ToggleWatchExpressionAtCursor 1 1 "" Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "{text_pt_commands}{disasm_pt_commands}" }
{ToggleWatchExpressionAtMouse 1 1 "" Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" }
{ToggleWatchExpression 0 1 1 "" Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "" }
{ToggleWatchExpressionAtCursor 0 1 1 "" Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "{text_pt_commands}{disasm_pt_commands}" }
{ToggleWatchExpressionAtMouse 0 1 1 "" Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" }
//- rjf: general config operations
{EnableCfg 0 0 "" Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" }
{DisableCfg 0 0 "" Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" }
{SelectCfg 0 0 "" Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" }
{DeselectCfg 0 0 "" Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" }
{RemoveCfg 0 0 "" Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" }
{NameCfg 0 0 "" Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" }
{ConditionCfg 0 0 "" Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" }
{DuplicateCfg 0 0 "" Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" }
{RelocateCfg 0 0 "" Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" }
{SaveToProject 0 0 "" Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" }
{EnableCfg 0 0 0 "" Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" }
{DisableCfg 0 0 0 "" Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" }
{SelectCfg 0 0 0 "" Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" }
{DeselectCfg 0 0 0 "" Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" }
{RemoveCfg 0 0 0 "" Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" }
{NameCfg 0 0 0 "" Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" }
{ConditionCfg 0 0 0 "" Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" }
{DuplicateCfg 0 0 0 "" Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" }
{RelocateCfg 0 0 0 "" Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" }
{SaveToProject 0 0 0 "" Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" }
//- rjf: breakpoints
{AddBreakpoint 1 1 "" Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" }
{AddAddressBreakpoint 1 0 "" Expr 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "" }
{AddFunctionBreakpoint 1 0 "query:procedures" String 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "" }
{ToggleBreakpoint 1 1 "" Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "{text_pt_commands}{disasm_pt_commands}" }
{RemoveBreakpoint 1 0 "query:breakpoints" Cfg 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "" }
{EnableBreakpoint 1 1 "query:breakpoints" Cfg 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" }
{DisableBreakpoint 1 1 "query:breakpoints" Cfg 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" }
{ClearBreakpoints 1 1 "" Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" }
{AddBreakpoint 0 1 1 "" Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" }
{AddAddressBreakpoint 0 1 0 "" Expr 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "" }
{AddFunctionBreakpoint 0 1 0 "query:procedures" String 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "" }
{ToggleBreakpoint 0 1 1 "" Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "{text_pt_commands}{disasm_pt_commands}" }
{RemoveBreakpoint 0 1 0 "query:breakpoints" Cfg 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "" }
{EnableBreakpoint 0 1 1 "query:breakpoints" Cfg 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" }
{DisableBreakpoint 0 1 1 "query:breakpoints" Cfg 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" }
{ClearBreakpoints 0 1 1 "" Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" }
//- rjf: output
{ClearOutput 1 1 "" Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" }
{ClearOutput 0 1 1 "" Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" }
//- rjf: watch pins
{AddWatchPin 1 1 "" Expr 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "" }
{ToggleWatchPin 1 0 "" Expr 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" }
{AddWatchPin 0 1 1 "" Expr 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "" }
{ToggleWatchPin 0 1 0 "" Expr 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" }
//- rjf: debug infos
{LoadDebugInfo 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "" }
{UnloadDebugInfo 1 1 "query:debug_infos" Cfg 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "" }
{LoadDebugInfo 0 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "" }
{UnloadDebugInfo 0 1 1 "query:debug_infos" Cfg 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "" }
//- rjf: type views
{AddTypeView 0 0 "" String 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" }
{AddTypeView 0 0 0 "" String 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" }
//- rjf: file path maps
{AddFilePathMap 0 0 "" Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" }
{AddFilePathMap 0 0 0 "" Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" }
//- rjf: themes
{EditUserTheme 0 0 "query:themes" String 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" }
{EditProjectTheme 0 0 "query:themes" String 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" }
{AddThemeColor 0 0 "" Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" }
{ForkTheme 0 0 "" Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" }
{SaveTheme 0 0 "" String 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" }
{SaveAndSetTheme 0 0 "" String 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" }
{EditUserTheme 0 0 0 "query:themes" String 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" }
{EditProjectTheme 0 0 0 "query:themes" String 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" }
{AddThemeColor 0 0 0 "" Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" }
{ForkTheme 0 0 0 "" Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" }
{SaveTheme 0 0 0 "" String 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" }
{SaveAndSetTheme 0 0 0 "" String 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" }
//- rjf: line operations
{SetNextStatement 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "{text_pt_commands}{disasm_pt_commands}" }
{SetNextStatement 0 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "{text_pt_commands}{disasm_pt_commands}" }
//- rjf: targets
{AddTarget 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "" }
{SelectTarget 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" }
{EnableTarget 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" }
{DisableTarget 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" }
{RemoveTarget 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" }
{AddTarget 0 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "" }
{SelectTarget 0 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" }
{EnableTarget 0 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" }
{DisableTarget 0 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" }
{RemoveTarget 0 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" }
//- rjf: attaching
{RegisterAsJITDebugger 1 1 "" Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" }
{RegisterAsJITDebugger 0 1 1 "" Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" }
//- rjf: snap-to-code-location
{FindCodeLocation 0 1 "" FilePath 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" }
{FindCodeLocation 0 0 1 "" FilePath 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" }
//- rjf: snap-to-memory-location
{GoToMemory 0 1 "" Expr 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "{memory_eval_commands}" }
{GoToMemory 0 0 1 "" Expr 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "{memory_eval_commands}" }
//- rjf: break-when-value-changes
{BreakWhenValueChanges 0 1 "" Expr 0 0 0 0 1 1 0 CircleFilled "break_when_value_changes" "Break When Value Changes" "Adds a new write data breakpoint for this variable's range." "" "{memory_eval_commands}" }
{BreakWhenValueChanges 0 0 1 "" Expr 0 0 0 0 1 1 0 CircleFilled "break_when_value_changes" "Break When Value Changes" "Adds a new write data breakpoint for this variable's range." "" "{memory_eval_commands}" }
//- rjf: searching
{Search 1 1 "" String 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" }
{SearchBackwards 1 1 "" String 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" }
{Search 0 1 1 "" String 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" }
{SearchBackwards 0 1 1 "" String 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" }
//- rjf: queries
{PickFile 0 0 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" }
{PickFolder 0 0 `folder:\\"$input\\"` FilePath 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" }
{PickFileOrFolder 0 0 `folder:\\"$input\\"` FilePath 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" }
{PickFile 0 0 0 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" }
{PickFolder 0 0 0 `folder:\\"$input\\"` FilePath 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" }
{PickFileOrFolder 0 0 0 `folder:\\"$input\\"` FilePath 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" }
//- rjf: query stack
{PushQuery 0 0 "" Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" }
{CompleteQuery 0 0 "" Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" }
{CancelQuery 0 0 "" Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" }
{UpdateQuery 0 0 "" Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" }
{PushQuery 0 0 0 "" Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" }
{CompleteQuery 0 0 0 "" Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" }
{CancelQuery 0 0 0 "" Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" }
{UpdateQuery 0 0 0 "" Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" }
//- rjf: event buffers
{OpenEventBuffer 0 1 "" Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" }
{CloseEventBuffer 0 1 "" Cfg 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" }
{OpenEventBuffer 0 0 1 "" Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" }
{CloseEventBuffer 0 0 1 "" Cfg 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" }
//- rjf: developer commands
{ToggleDevMenu 1 1 "" Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" }
{LogMarker 1 1 "" Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" }
{ToggleDevMenu 0 1 1 "" Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" }
{LogMarker 0 1 1 "" Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" }
}
@enum RD_CmdKind:
+4 -3
View File
@@ -9802,11 +9802,12 @@ rd_code_color_slot_from_txt_token_kind(TXT_TokenKind kind)
switch(kind)
{
default:break;
case TXT_TokenKind_Keyword:{color = RD_CodeColorSlot_CodeKeyword;}break;
case TXT_TokenKind_Numeric:{color = RD_CodeColorSlot_CodeNumeric;}break;
case TXT_TokenKind_Keyword: {color = RD_CodeColorSlot_CodeKeyword;}break;
case TXT_TokenKind_Numeric: {color = RD_CodeColorSlot_CodeNumeric;}break;
case TXT_TokenKind_String: {color = RD_CodeColorSlot_CodeString;}break;
case TXT_TokenKind_Meta: {color = RD_CodeColorSlot_CodeMeta;}break;
case TXT_TokenKind_Comment:{color = RD_CodeColorSlot_CodeComment;}break;
case TXT_TokenKind_LineComment: {color = RD_CodeColorSlot_CodeComment;}break;
case TXT_TokenKind_BlockComment:{color = RD_CodeColorSlot_CodeComment;}break;
case TXT_TokenKind_Symbol: {color = RD_CodeColorSlot_CodeDelimiterOperator;}break;
}
return color;
+42 -6
View File
@@ -163,7 +163,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
B32 need_nav = (start_cursor == start_mark || !(evt->flags & UI_EventFlag_ZeroDeltaOnSelect));
//- rjf: wrap lines right
if(need_nav && evt->delta_unit != UI_EventDeltaUnit_Whole && delta.x > 0 && start_cursor == line_range.max && line_num+1 <= line_count)
if(need_nav && evt->delta_unit != UI_EventDeltaUnit_Whole && evt->delta_unit != UI_EventDeltaUnit_Line && delta.x > 0 && start_cursor == line_range.max && line_num+1 <= line_count)
{
Rng1U64 next_line_range = txt_range_from_line_num(&text_patched.line_map, line_num+1);
*cursor = next_line_range.min;
@@ -171,7 +171,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
}
//- rjf: wrap lines left
if(need_nav && evt->delta_unit != UI_EventDeltaUnit_Whole && delta.x < 0 && start_cursor == line_range.min && line_num-1 >= 1)
if(need_nav && evt->delta_unit != UI_EventDeltaUnit_Whole && evt->delta_unit != UI_EventDeltaUnit_Line && delta.x < 0 && start_cursor == line_range.min && line_num-1 >= 1)
{
Rng1U64 prev_line_range = txt_range_from_line_num(&text_patched.line_map, line_num-1);
*cursor = prev_line_range.max;
@@ -385,7 +385,16 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
priority_margin_width_px = floor_f32(big_glyph_advance*3.5f);
catchall_margin_width_px = floor_f32(big_glyph_advance*3.5f);
}
TXT_LineTokensSlice slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, text_info, text_data, visible_line_num_range);
Rng1U64 visible_byte_range = r1u64(txt_range_from_line_num(&text_patched.line_map, visible_line_num_range.min).min,
txt_range_from_line_num(&text_patched.line_map, visible_line_num_range.max).max);
String8 visible_data = memory_map_data_from_range(scratch.arena, &text_patched.memory_map, visible_byte_range);
//////////////////////////////
//- rjf: find tokens for visible byte range
//
U64 ctx_token_pt_num = txt_token_pt_num_from_off(&text_patched.token_pt_map, visible_byte_range.min);
TXT_TokenPt ctx_token_pt = txt_token_pt_from_num(&text_patched.token_pt_map, ctx_token_pt_num);
TXT_TokenArray tokens = txt_token_array_from_data(scratch.arena, ctx_token_pt, visible_data, visible_byte_range.min, max_U64);
//////////////////////////////
//- rjf: selection on single line, no query? -> set search text
@@ -459,7 +468,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
code_slice_params.line_text_max_width_px = (F32)line_size_x;
code_slice_params.margin_float_off_px = scroll_pos.x.idx + floor_f32(scroll_pos.x.off);
// rjf: fill text info
// rjf: fill line text / ranges
{
S64 line_num = visible_line_num_range.min;
U64 line_idx = visible_line_num_range.min-1;
@@ -474,8 +483,35 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
memory_map_read(&text_patched.memory_map, line_range, line_text.str);
code_slice_params.line_text[visible_line_idx] = line_text;
code_slice_params.line_ranges[visible_line_idx] = line_range;
// TODO(rjf): tokens
// code_slice_params.line_tokens[visible_line_idx] = slice.line_tokens[visible_line_idx];
}
}
// rjf: bucket tokens by line
{
U64 token_idx = 0;
for EachIndex(line_idx, visible_line_count)
{
Temp scratch2 = scratch_begin(&scratch.arena, 1);
Rng1U64 line_range = code_slice_params.line_ranges[line_idx];
TXT_TokenList line_tokens = {0};
for(;token_idx < tokens.count;)
{
Rng1U64 token_range = tokens.v[token_idx].range;
if(dim_1u64(intersect_1u64(token_range, line_range)) != 0)
{
txt_token_list_push(scratch2.arena, &line_tokens, &tokens.v[token_idx]);
}
if(token_range.max <= line_range.max || token_range.max <= line_range.min)
{
token_idx += 1;
}
else if(line_range.max <= token_range.max)
{
break;
}
}
code_slice_params.line_tokens[line_idx] = txt_token_array_from_list(scratch.arena, &line_tokens);
scratch_end(scratch2);
}
}
+2 -2
View File
@@ -157,8 +157,8 @@ str8_lit_comp("->"),
TXT_TokenizerRule txt_tokenizer_rules__c[7] =
{
{TXT_TokenKind_Comment, str8_lit_comp("//"), str8_lit_comp("\n"), 0, 0, 1, 0},
{TXT_TokenKind_Comment, str8_lit_comp("/*"), str8_lit_comp("*/"), 2, 0, 0, 0},
{TXT_TokenKind_LineComment, str8_lit_comp("//"), str8_lit_comp("\n"), 0, 0, 1, 0},
{TXT_TokenKind_BlockComment, str8_lit_comp("/*"), str8_lit_comp("*/"), 2, 0, 0, 0},
{TXT_TokenKind_Meta, str8_lit_comp("#"), str8_lit_comp("\n"), 0, 0, 1, 0},
{TXT_TokenKind_String, str8_lit_comp("\""), str8_lit_comp("\""), 1, 0, 1, 0},
{TXT_TokenKind_String, str8_lit_comp("'"), str8_lit_comp("'"), 1, 0, 1, 0},
+708 -64
View File
@@ -549,8 +549,8 @@ txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, S
char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; }
else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; }
else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; }
else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; }
else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; }
else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_LineComment; comment_is_single_line = 1; }
else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_BlockComment; comment_is_single_line = 0; }
else if(byte == '~' || byte == '!' ||
byte == '%' || byte == '^' ||
byte == '&' || byte == '*' ||
@@ -624,17 +624,14 @@ txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, S
byte != '>' && byte != '/' &&
byte != '?' && byte != '|');
}break;
case TXT_TokenKind_Comment:
{
if(comment_is_single_line)
case TXT_TokenKind_LineComment:
{
ender_found = (!escaped && (byte == '\r' || byte == '\n'));
}
else
}break;
case TXT_TokenKind_BlockComment:
{
ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/');
ender_pad += 2;
}
}break;
case TXT_TokenKind_Meta:
{
@@ -893,8 +890,8 @@ txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, St
char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; }
else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; }
else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; }
else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; }
else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; }
else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_LineComment; comment_is_single_line = 1; }
else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_BlockComment; comment_is_single_line = 0; }
else if(byte == '~' || byte == '!' ||
byte == '%' || byte == '^' ||
byte == '&' || byte == '*' ||
@@ -968,17 +965,14 @@ txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, St
byte != '>' && byte != '/' &&
byte != '?' && byte != '|');
}break;
case TXT_TokenKind_Comment:
{
if(comment_is_single_line)
case TXT_TokenKind_LineComment:
{
ender_found = (!escaped && (byte == '\r' || byte == '\n'));
}
else
}break;
case TXT_TokenKind_BlockComment:
{
ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/');
ender_pad += 2;
}
}break;
case TXT_TokenKind_Meta:
{
@@ -1179,8 +1173,8 @@ txt_token_array_from_string__jai(Arena *arena, U64 *bytes_processed_counter, Str
char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; }
else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; }
else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; }
else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; }
else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; }
else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_LineComment; comment_is_single_line = 1; }
else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_BlockComment; comment_is_single_line = 0; }
else if(byte == '~' || byte == '!' ||
byte == '%' || byte == '^' ||
byte == '&' || byte == '*' ||
@@ -1254,17 +1248,14 @@ txt_token_array_from_string__jai(Arena *arena, U64 *bytes_processed_counter, Str
byte != '>' && byte != '/' &&
byte != '?' && byte != '|');
}break;
case TXT_TokenKind_Comment:
{
if(comment_is_single_line)
case TXT_TokenKind_LineComment:
{
ender_found = (!escaped && (byte == '\r' || byte == '\n'));
}
else
}break;
case TXT_TokenKind_BlockComment:
{
ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/');
ender_pad += 2;
}
}break;
case TXT_TokenKind_Meta:
{
@@ -1465,7 +1456,7 @@ txt_token_array_from_string__zig(Arena *arena, U64 *bytes_processed_counter, Str
else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; }
else if(byte == '\\' &&
next_byte == '\\') { active_token_kind = TXT_TokenKind_String; string_is_line = 1; }
else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; }
else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_LineComment; }
else if(byte == '~' || byte == '!' ||
byte == '%' || byte == '^' ||
byte == '&' || byte == '*' ||
@@ -1547,7 +1538,7 @@ txt_token_array_from_string__zig(Arena *arena, U64 *bytes_processed_counter, Str
byte != '?' && byte != '|' &&
byte != 'c');
}break;
case TXT_TokenKind_Comment:
case TXT_TokenKind_LineComment:
{
ender_found = (!escaped && (byte == '\r' || byte == '\n'));
}break;
@@ -1709,7 +1700,7 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St
{
// NOTE(spey): Rust supports unicode identifiers. They are not handled in any way here,
// but it might be worth looking into in the future.
#if 0
Temp scratch = scratch_begin(&arena, 1);
//- rjf: generate token list
@@ -2066,6 +2057,9 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St
TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens);
scratch_end(scratch);
return result;
#endif
TXT_TokenArray result = {0};
return result;
}
internal TXT_TokenArray
@@ -2109,7 +2103,7 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed
else if(byte == '>' && brace_nest == 0 && paren_nest == 0)
{
active_token_start_off = off;
active_token_kind = TXT_TokenKind_Comment;
active_token_kind = TXT_TokenKind_LineComment;
advance = 1;
}
else if(('a' <= byte && byte <= 'z') || ('A' <= byte && byte <= 'Z') || byte == '_')
@@ -2259,7 +2253,7 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed
ender_found = 1;
advance = 0;
}break;
case TXT_TokenKind_Comment:
case TXT_TokenKind_LineComment:
if(byte == '\n')
{
ender_found = 1;
@@ -2357,6 +2351,296 @@ txt_range_from_line_num(TXT_LineMap *map, U64 num)
return result;
}
internal void
txt_token_pt_map_push(Arena *arena, TXT_TokenPtMap *map, Rng1U64 num_range, TXT_TokenPt *pts, S64 delta)
{
TXT_TokenPtMapRangeNode *n = push_array(arena, TXT_TokenPtMapRangeNode, 1);
SLLQueuePush(map->first_range, map->last_range, n);
n->num_range = num_range;
n->pts = pts;
n->delta = delta;
map->total_pt_count += dim_1u64(num_range);
}
internal U64
txt_token_pt_num_from_off(TXT_TokenPtMap *map, U64 off)
{
U64 result = 0;
for EachNode(n, TXT_TokenPtMapRangeNode, map->first_range)
{
U64 num_pts = dim_1u64(n->num_range);
if(num_pts != 0)
{
U64 first_off = n->pts[0].off + n->delta;
U64 last_off = n->pts[num_pts-1].off + n->delta;
if(first_off <= off && off <= last_off)
{
U64 first_idx = 0;
U64 last_idx = num_pts-1;
for(;first_idx <= last_idx;)
{
U64 mid_idx = (last_idx + first_idx) / 2;
U64 mid_off = n->pts[mid_idx].off + n->delta;
if(off < mid_off)
{
last_idx = mid_idx - 1;
}
else if(mid_off < off)
{
first_idx = mid_idx;
}
else if(off == mid_off)
{
first_idx = mid_idx;
break;
}
}
result = n->num_range.min + first_idx;
break;
}
}
}
return result;
}
internal TXT_TokenPt
txt_token_pt_from_num(TXT_TokenPtMap *map, U64 num)
{
TXT_TokenPt pt = {TXT_TokenKind_Null};
if(num > 0)
{
for EachNode(n, TXT_TokenPtMapRangeNode, map->first_range)
{
if(contains_1u64(n->num_range, num))
{
pt = n->pts[num - n->num_range.min];
pt.off += n->delta;
break;
}
}
}
return pt;
}
internal TXT_TokenArray
txt_token_array_from_data(Arena *arena, TXT_TokenPt ctx_token_pt, String8 data, U64 base_off, U64 limit)
{
Temp scratch = scratch_begin(&arena, 1);
TXT_TokenChunkList tokens = {0};
{
U64 chunk_size = Clamp(8, data.size/8, 4096);
TXT_TokenKind active_token_kind = ctx_token_pt.kind;
U64 active_token_start_off = ctx_token_pt.off;
B32 escaped = 0;
for(U64 off = 0; off <= data.size;)
{
U8 byte = (off+0 < data.size) ? data.str[off+0] : 0;
U8 next_byte = (off+1 < data.size) ? data.str[off+1] : 0;
B32 token_finished = 0;
U64 advance = 1;
//- rjf: adjust escaping state
if(active_token_kind != TXT_TokenKind_Null && byte == '\\')
{
escaped = 1;
}
//- rjf: take starter bytes for new tokens
if(active_token_kind == TXT_TokenKind_Null)
{
if(0){}
else if(byte == ' ' || byte == '\n' || byte == '\t' ||
byte == '\r' || byte == '\f' || byte == '\v')
{
active_token_kind = TXT_TokenKind_Whitespace;
advance = 0;
}
else if(byte == '_' || byte == '$' ||
('a' <= byte && byte <= 'z') ||
('A' <= byte && byte <= 'Z'))
{
active_token_kind = TXT_TokenKind_Identifier;
advance = 0;
}
else if(('0' <= byte && byte <= '9') ||
(byte == '.' && ('0' <= next_byte && next_byte <= '9')))
{
active_token_kind = TXT_TokenKind_Numeric;
advance = 0;
}
else if(byte == '"')
{
active_token_kind = TXT_TokenKind_String;
advance = 1;
}
else if(byte == '\'')
{
active_token_kind = TXT_TokenKind_Char;
advance = 1;
}
else if(byte == '/' && next_byte == '/')
{
active_token_kind = TXT_TokenKind_LineComment;
advance = 2;
}
else if(byte == '/' && next_byte == '*')
{
active_token_kind = TXT_TokenKind_BlockComment;
advance = 2;
}
else if(byte == '~' || byte == '!' ||
byte == '%' || byte == '^' ||
byte == '&' || byte == '*' ||
byte == '(' || byte == ')' ||
byte == '-' || byte == '=' ||
byte == '+' || byte == '[' ||
byte == ']' || byte == '{' ||
byte == '}' || byte == ':' ||
byte == ';' || byte == ',' ||
byte == '.' || byte == '<' ||
byte == '>' || byte == '/' ||
byte == '?' || byte == '|')
{
active_token_kind = TXT_TokenKind_Symbol;
advance = 1;
}
if(active_token_kind != TXT_TokenKind_Null)
{
active_token_start_off = off;
}
else
{
TXT_Token token = {TXT_TokenKind_Error, r1u64(base_off+off, base_off+off+1)};
txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token);
advance = 1;
}
}
//- rjf: look for active token enders
else switch(active_token_kind)
{
default:{}break;
case TXT_TokenKind_Whitespace:
{
if(byte != ' ' && byte != '\n' && byte != '\t' &&
byte != '\r' && byte != '\f' && byte != '\v')
{
token_finished = 1;
advance = 0;
}
}break;
case TXT_TokenKind_Identifier:
{
// TODO(rjf): stupid C++ symbol names - `string_literals_like_this'
if((byte < '0' || '9' < byte) &&
(byte < 'a' || 'z' < byte) &&
(byte < 'A' || 'Z' < byte) &&
byte != '$' &&
byte != '_')
{
token_finished = 1;
advance = 0;
}
}break;
case TXT_TokenKind_Numeric:
{
if((byte < '0' || '9' < byte) &&
(byte < 'a' || 'z' < byte) &&
(byte < 'A' || 'Z' < byte) &&
byte != '.')
{
token_finished = 1;
advance = 0;
}
}break;
case TXT_TokenKind_String:
{
if(byte == '"')
{
token_finished = 1;
advance = 1;
}
}break;
case TXT_TokenKind_Char:
{
if(byte == '\'')
{
token_finished = 1;
advance = 1;
}
}break;
case TXT_TokenKind_Symbol:
{
if(byte != '~' && byte != '!' &&
byte != '%' && byte != '^' &&
byte != '&' && byte != '*' &&
byte != '(' && byte != ')' &&
byte != '-' && byte != '=' &&
byte != '+' && byte != '[' &&
byte != ']' && byte != '{' &&
byte != '}' && byte != ':' &&
byte != ';' && byte != ',' &&
byte != '.' && byte != '<' &&
byte != '>' && byte != '/' &&
byte != '?' && byte != '|')
{
token_finished = 1;
advance = 0;
}
}break;
case TXT_TokenKind_LineComment:
{
if(byte == '\n')
{
token_finished = 1;
advance = 1;
}
}break;
case TXT_TokenKind_BlockComment:
{
if(byte == '*' && next_byte == '/')
{
token_finished = 1;
advance = 2;
}
}break;
case TXT_TokenKind_Meta:
{
if(byte == '\n')
{
token_finished = 1;
advance = 1;
}
}break;
}
//- rjf: finish all tokens if we're at the end of the data
if(off == data.size)
{
token_finished = 1;
advance = 1;
}
//- rjf: push completed token
if(token_finished)
{
TXT_Token token = {active_token_kind, r1u64(base_off+active_token_start_off, base_off+off+advance)};
txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token);
active_token_kind = TXT_TokenKind_Null;
}
//- rjf: reset escaped state
escaped = 0;
//- rjf: advance
off += advance;
}
}
TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens);
scratch_end(scratch);
return result;
}
internal TXT_Patched
txt_patched_from_info_data_patches(Arena *arena, TXT_TextInfo *info, String8 data, TXT_PatchList *patches)
{
@@ -2366,14 +2650,17 @@ txt_patched_from_info_data_patches(Arena *arena, TXT_TextInfo *info, String8 dat
MemoryMap last_memory_map = {0};
U64 last_size = data.size;
TXT_LineMap last_line_map = {0};
TXT_TokenPtMap last_token_pt_map = {0};
memory_map_push(scratch.arena, &last_memory_map, r1u64(0, data.size), data.str);
txt_line_map_push(scratch.arena, &last_line_map, r1u64(1, info->lines_count+1), info->lines_ranges, 0);
txt_token_pt_map_push(scratch.arena, &last_token_pt_map, r1u64(0, info->big_token_pts_count), info->big_token_pts, 0);
// rjf: apply the patches in order, each being able to slice/dice the previous memory map
for EachNode(n, TXT_PatchNode, patches->first)
{
MemoryMap next_memory_map = {0};
TXT_LineMap next_line_map = {0};
TXT_TokenPtMap next_token_pt_map = {0};
// rjf: compute portion of memory before/after this replace-range
Rng1U64 pre_replace_range = r1u64(0, n->v.range.min);
@@ -2390,6 +2677,17 @@ txt_patched_from_info_data_patches(Arena *arena, TXT_TextInfo *info, String8 dat
Rng1U64 pre_replace_line_num_range = r1u64(1, replace_line_num_range.min);
Rng1U64 post_replace_line_num_range = r1u64(replace_line_num_range.max+1, last_line_map.total_line_count+1);
// rjf: map this replace range -> range of token pts
Rng1U64 replace_token_pt_range = {0};
{
replace_token_pt_range.min = txt_token_pt_num_from_off(&last_token_pt_map, n->v.range.min);
replace_token_pt_range.max = txt_token_pt_num_from_off(&last_token_pt_map, n->v.range.max);
}
// rjf: compute ranges of unchanged token pts before/after this replace-range
Rng1U64 pre_replace_token_pt_range = r1u64(1, replace_token_pt_range.min);
Rng1U64 post_replace_token_pt_range = r1u64(replace_token_pt_range.max, last_token_pt_map.total_pt_count+1);
// rjf: compute delta & next size
S64 size_delta = (S64)n->v.replace.size - (S64)dim_1u64(n->v.range);
U64 next_size = (U64)((S64)last_size + size_delta);
@@ -2417,6 +2715,12 @@ txt_patched_from_info_data_patches(Arena *arena, TXT_TextInfo *info, String8 dat
rng1u64_list_push(scratch.arena, &replace_line_ranges, r1u64(last_line_start_off, n->v.replace.size));
}
// rjf: compute token pt delta
S64 token_pt_delta = 0;
{
// TODO(rjf)
}
// rjf: push all portions of pre-replace / post-replace ranges in previous memory map
{
for EachNode(map_n, MemoryMapRangeNode, last_memory_map.first_range)
@@ -2504,10 +2808,32 @@ txt_patched_from_info_data_patches(Arena *arena, TXT_TextInfo *info, String8 dat
// rjf: push affected line ranges
txt_line_map_push(scratch.arena, &next_line_map, r1u64(replace_line_num_range.min, replace_line_num_range.min + affected_line_count), affected_line_ranges, 0);
// rjf: push all portions of pre-replace / post-replace ranges in previous token pt map
{
for EachNode(n, TXT_TokenPtMapRangeNode, last_token_pt_map.first_range)
{
Rng1U64 num_range = n->num_range;
Rng1U64 range_x_pre = intersect_1u64(pre_replace_token_pt_range, num_range);
Rng1U64 range_x_post = intersect_1u64(post_replace_token_pt_range, num_range);
if(range_x_pre.max > range_x_pre.min)
{
txt_token_pt_map_push(scratch.arena, &next_token_pt_map, range_x_pre, n->pts + (range_x_pre.min - num_range.min), n->delta);
}
if(range_x_post.max > range_x_post.min)
{
Rng1U64 range_x_post_shifted = range_x_post;
range_x_post_shifted.min = (U64)((S64)range_x_post_shifted.min + token_pt_delta);
range_x_post_shifted.max = (U64)((S64)range_x_post_shifted.max + token_pt_delta);
txt_token_pt_map_push(scratch.arena, &next_token_pt_map, range_x_post_shifted, n->pts + (range_x_post.min - num_range.min), n->delta);
}
}
}
// rjf: advance to the next memory map
last_memory_map = next_memory_map;
last_size = next_size;
last_line_map = next_line_map;
last_token_pt_map = next_token_pt_map;
}
// rjf: fill result
@@ -2522,6 +2848,10 @@ txt_patched_from_info_data_patches(Arena *arena, TXT_TextInfo *info, String8 dat
{
txt_line_map_push(arena, &result.line_map, n->num_range, n->ranges, n->delta);
}
for EachNode(n, TXT_TokenPtMapRangeNode, last_token_pt_map.first_range)
{
txt_token_pt_map_push(arena, &result.token_pt_map, n->num_range, n->pts, n->delta);
}
}
scratch_end(scratch);
@@ -2969,38 +3299,8 @@ txt_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64
}
//- rjf: set # of bytes to process
// (line ending calc) (line counting) (line measuring) (lexing)
set_progress_target(Min(data.size, 1024) + data.size + data.size + data.size*(lang != TXT_LangKind_Null));
//- rjf: detect line end kind
TXT_LineEndKind line_end_kind = TXT_LineEndKind_Null;
if(lane_idx() == 0)
{
U64 lf_count = 0;
U64 cr_count = 0;
for(U64 idx = 0; idx < data.size && idx < 1024; idx += 1)
{
if(data.str[idx] == '\r')
{
cr_count += 1;
}
if(data.str[idx] == '\n')
{
lf_count += 1;
}
}
if(cr_count >= lf_count/2 && lf_count >= 1)
{
line_end_kind = TXT_LineEndKind_CRLF;
}
else if(lf_count >= 1)
{
line_end_kind = TXT_LineEndKind_LF;
}
shared->info.line_end_kind = line_end_kind;
}
lane_sync();
set_progress(Min(data.size, 1024));
// (line counting) (line measuring) (lexing)
set_progress_target(data.size + data.size + data.size*(lang != TXT_LangKind_Null));
//- rjf: count # of lines
U64 lane_line_count = 0;
@@ -3048,11 +3348,16 @@ txt_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64
lane_sync_u64(&lane_line_base_idxs, 0);
//- rjf: allocate & store line ranges
U64 *lane_line_max_size = 0;
U64 *lane_cr_count = 0;
if(lane_idx() == 0)
{
lane_cr_count = push_array(scratch.arena, U64, lane_count());
lane_line_max_size = push_array(scratch.arena, U64, lane_count());
shared->info.lines_ranges = push_array_no_zero(shared->arena, Rng1U64, shared->info.lines_count);
}
lane_sync();
lane_sync_u64(&lane_line_max_size, 0);
lane_sync_u64(&lane_cr_count, 0);
{
Rng1U64 range = lane_range(data.size+1);
U64 lane_line_idx = 0;
@@ -3084,12 +3389,12 @@ txt_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64
Rng1U64 line_range = r1u64(line_start_idx, idx);
if(idx > 0 && data.str[idx-1] == '\r' && line_range.max > line_range.min)
{
lane_cr_count[lane_idx()] += 1;
line_range.max -= 1;
}
U64 line_size = dim_1u64(line_range);
shared->info.lines_ranges[lane_line_base_idxs[lane_idx()] + lane_line_idx] = line_range;
// TODO(rjf): this is a race:
shared->info.lines_max_size = Max(shared->info.lines_max_size, line_size);
lane_line_max_size[lane_idx()] = Max(lane_line_max_size[lane_idx()], line_size);
lane_line_idx += 1;
line_start_idx = idx+1;
}
@@ -3102,6 +3407,345 @@ txt_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64
lane_sync();
set_progress(Min(data.size, 1024) + data.size + data.size);
//- rjf: find max line size across all lanes
if(lane_idx() == 0)
{
for EachIndex(l_idx, lane_count())
{
shared->info.lines_max_size = Max(shared->info.lines_max_size, lane_line_max_size[l_idx]);
}
}
lane_sync();
//- rjf: pick LF/CRLF based on significant ratio of CR characters across all lanes
{
TXT_LineEndKind line_end_kind = TXT_LineEndKind_Null;
if(lane_idx() == 0)
{
U64 total_cr_count = 0;
for EachIndex(l_idx, lane_count())
{
total_cr_count += lane_cr_count[l_idx];
}
if(total_cr_count > shared->info.lines_count / 4 && total_cr_count > 0)
{
line_end_kind = TXT_LineEndKind_CRLF;
}
shared->info.line_end_kind = line_end_kind;
}
lane_sync();
}
//- rjf: find all token endpoint candidates across all lanes
//
// note that these are not necessarily actually token-forming sequences of
// characters. we're effectively just building an acceleration structure to
// quickly process the buffer - to skip between sequences of *plausible*
// token markers. but, for example, if a `//` showed up inside of two `"`s,
// then there would not be a comment token emitted. we just do this (rather
// than going through the buffer sequentially) so that we can do this gather
// step wide, and for the serially-dependent tokenization state machine part,
// we can do that over much less data.
//
typedef struct TokenEndpointCandidateChunkNode TokenEndpointCandidateChunkNode;
struct TokenEndpointCandidateChunkNode
{
TokenEndpointCandidateChunkNode *next;
U64 *v;
U64 count;
U64 cap;
};
TokenEndpointCandidateChunkNode **lanes_first_token_endpoint_candidate_chunks = 0;
TokenEndpointCandidateChunkNode **lanes_last_token_endpoint_candidate_chunks = 0;
{
if(lane_idx() == 0)
{
lanes_first_token_endpoint_candidate_chunks = push_array(scratch.arena, TokenEndpointCandidateChunkNode *, lane_count());
lanes_last_token_endpoint_candidate_chunks = push_array(scratch.arena, TokenEndpointCandidateChunkNode *, lane_count());
}
lane_sync_u64(&lanes_first_token_endpoint_candidate_chunks, 0);
lane_sync_u64(&lanes_last_token_endpoint_candidate_chunks, 0);
TokenEndpointCandidateChunkNode *first_chunk = 0;
TokenEndpointCandidateChunkNode *last_chunk = 0;
Rng1U64 range = lane_range(data.size);
for EachInRange(off, range)
{
U8 byte = data.str[off];
U8 next_byte = (off+1 < data.size) ? data.str[off+1] : 0;
U8 prev_byte = (off > 0) ? data.str[off-1] : 0;
B32 off_is_endpoint = 1;
U64 extra_advance = 0;
if(byte == '/' && next_byte == '*')
{
extra_advance = 1;
}
else if(byte == '*' && next_byte == '/')
{
extra_advance = 1;
}
else if(byte == 'R' && next_byte == '"')
{
extra_advance = 1;
}
else if(byte == '/' && next_byte == '/')
{
extra_advance = 1;
}
else if(byte == '#')
{
// NOTE(rjf): no-op
}
else if(prev_byte != '\\' && (byte == '"' || byte == '\''))
{
// NOTE(rjf): no-op
}
else
{
off_is_endpoint = 0;
}
if(off_is_endpoint)
{
TokenEndpointCandidateChunkNode *chunk = last_chunk;
if(chunk == 0 || chunk->count >= chunk->cap)
{
chunk = push_array(scratch.arena, TokenEndpointCandidateChunkNode, 1);
SLLQueuePush(first_chunk, last_chunk, chunk);
chunk->cap = 512;
chunk->v = push_array(scratch.arena, U64, chunk->cap);
}
chunk->v[chunk->count] = off;
chunk->count += 1;
}
off += extra_advance;
}
lanes_first_token_endpoint_candidate_chunks[lane_idx()] = first_chunk;
lanes_last_token_endpoint_candidate_chunks[lane_idx()] = last_chunk;
lane_sync();
}
//- rjf: join all token endpoint candidates from all lanes
TokenEndpointCandidateChunkNode *first_token_endpoint_candidate_chunk = 0;
TokenEndpointCandidateChunkNode *last_token_endpoint_candidate_chunk = 0;
if(lane_idx() == 0)
{
for EachIndex(l_idx, lane_count())
{
if(last_token_endpoint_candidate_chunk == 0)
{
first_token_endpoint_candidate_chunk = lanes_first_token_endpoint_candidate_chunks[l_idx];
last_token_endpoint_candidate_chunk = lanes_last_token_endpoint_candidate_chunks[l_idx];
}
else
{
last_token_endpoint_candidate_chunk->next = lanes_first_token_endpoint_candidate_chunks[l_idx];
last_token_endpoint_candidate_chunk = lanes_last_token_endpoint_candidate_chunks[l_idx];
}
}
}
lane_sync_u64(&first_token_endpoint_candidate_chunk, 0);
lane_sync_u64(&last_token_endpoint_candidate_chunk, 0);
//- rjf: scan sequence of token endpoint candidates - find big token ranges.
typedef struct TokenPtChunkNode TokenPtChunkNode;
struct TokenPtChunkNode
{
TokenPtChunkNode *next;
TXT_TokenPt *v;
U64 count;
U64 cap;
};
TokenPtChunkNode *first_token_pt_chunk = 0;
TokenPtChunkNode *last_token_pt_chunk = 0;
U64 total_token_pt_count = 0;
if(lane_idx() == 0)
{
TXT_TokenKind active_token_kind = TXT_TokenKind_Null;
U64 active_token_start_off = 0;
String8 herestring_marker = {0};
U64 cand_chunk_idx = 0;
for(TokenEndpointCandidateChunkNode *cand_chunk_n = first_token_endpoint_candidate_chunk; cand_chunk_n != 0;)
{
U64 off = cand_chunk_n->v[cand_chunk_idx];
U8 byte = data.str[off];
U8 next_byte = (off+1 < data.size) ? data.str[off+1] : 0;
//- rjf: no active token kind -> look for token starter
TXT_TokenKind start_active_token_kind = active_token_kind;
if(active_token_kind == TXT_TokenKind_Null)
{
// rjf: " -> start a string literal
if(byte == '"')
{
active_token_kind = TXT_TokenKind_String;
herestring_marker.size = 0;
}
// rjf: ' -> start a char literal
else if(byte == '\'')
{
active_token_kind = TXT_TokenKind_Char;
herestring_marker.size = 0;
}
// rjf: R" -> start a C++11+ style herestring
else if(byte == 'R' && next_byte == '"')
{
active_token_kind = TXT_TokenKind_String;
U64 next_paren_pos = str8_find_needle(str8_prefix(data, off+2+256), off+2, s("("), 0);
herestring_marker = str8_substr(data, r1u64(off+2, next_paren_pos));
}
// rjf: // -> start a single-line comment
else if(byte == '/' && next_byte == '/')
{
active_token_kind = TXT_TokenKind_LineComment;
}
// rjf: /* -> start a multi-line comment
else if(byte == '/' && next_byte == '*')
{
active_token_kind = TXT_TokenKind_BlockComment;
}
// rjf: # -> start a meta
else if(byte == '#')
{
active_token_kind = TXT_TokenKind_Meta;
}
// rjf: got a token kind -> remember its starting offset
if(active_token_kind != TXT_TokenKind_Null)
{
active_token_start_off = off;
}
}
//- rjf: end single-line comments & meta by binary searching for the line range -
// skip all lines that end with an escaped newline
U64 active_token_end_off = 0;
if(start_active_token_kind == TXT_TokenKind_Null && (active_token_kind == TXT_TokenKind_LineComment ||
active_token_kind == TXT_TokenKind_Meta))
{
TXT_LineMap line_map = {0};
txt_line_map_push(scratch.arena, &line_map, r1u64(1, shared->info.lines_count), shared->info.lines_ranges, 0);
U64 line_num = txt_line_num_from_off(&line_map, off);
Rng1U64 line_range = txt_range_from_line_num(&line_map, line_num);
for(;line_num <= shared->info.lines_count;)
{
if(str8_match(s("\\"), str8_substr(data, r1u64(line_range.max-1, line_range.max)), 0))
{
line_num += 1;
line_range = txt_range_from_line_num(&line_map, line_num);
}
else
{
break;
}
}
active_token_end_off = line_range.max;
}
//- rjf: try to end all other cases by looking at subsequent endpoint candidates
if(start_active_token_kind == active_token_kind && active_token_kind != TXT_TokenKind_Null)
{
switch(active_token_kind)
{
default:{}break;
case TXT_TokenKind_String:
{
if(herestring_marker.size == 0 && byte == '"')
{
active_token_end_off = off+1;
}
else if(herestring_marker.size != 0 && byte == '"')
{
String8 paren_maybe = str8_substr(data, r1u64(off - herestring_marker.size - 1, off - herestring_marker.size));
String8 herestring_marker_maybe = str8_substr(data, r1u64(off - herestring_marker.size, off));
if(str8_match(paren_maybe, s(")"), 0) && str8_match(herestring_marker, herestring_marker_maybe, 0))
{
active_token_end_off = off+1;
}
}
}break;
case TXT_TokenKind_Char:
{
if(byte == '\'')
{
active_token_end_off = off+1;
}
}break;
case TXT_TokenKind_BlockComment:
{
if(byte == '*' && next_byte == '/')
{
active_token_end_off = off+2;
}
}break;
}
}
//- rjf: end all cases with an end-of-buffer
B32 next_is_end_of_buffer = (cand_chunk_idx >= cand_chunk_n->count && cand_chunk_n->next == 0);
if(next_is_end_of_buffer)
{
active_token_end_off = off+1;
}
//- rjf: finish the active token if we can
if(active_token_end_off > active_token_start_off)
{
TXT_TokenPt pts[] =
{
{active_token_kind, active_token_start_off},
{TXT_TokenKind_Null, active_token_end_off},
};
for EachElement(pt_idx, pts)
{
TokenPtChunkNode *chunk = last_token_pt_chunk;
if(chunk == 0 || chunk->count >= chunk->cap)
{
chunk = push_array(scratch.arena, TokenPtChunkNode, 1);
SLLQueuePush(first_token_pt_chunk, last_token_pt_chunk, chunk);
chunk->cap = 512;
chunk->v = push_array(scratch.arena, TXT_TokenPt, chunk->cap);
}
chunk->v[chunk->count] = pts[pt_idx];
chunk->count += 1;
total_token_pt_count += 1;
}
}
//- rjf: advance
cand_chunk_idx += 1;
if(cand_chunk_idx >= cand_chunk_n->count)
{
cand_chunk_n = cand_chunk_n->next;
cand_chunk_idx = 0;
}
}
}
lane_sync_u64(&first_token_pt_chunk, 0);
lane_sync_u64(&last_token_pt_chunk, 0);
lane_sync_u64(&total_token_pt_count, 0);
//- rjf: form final token pt buffer
if(lane_idx() == 0)
{
shared->info.big_token_pts_count = total_token_pt_count;
shared->info.big_token_pts = push_array(shared->arena, TXT_TokenPt, shared->info.big_token_pts_count);
}
lane_sync();
{
U64 base_idx = 0;
for EachNode(n, TokenPtChunkNode, first_token_pt_chunk)
{
Rng1U64 range = lane_range(n->count);
MemoryCopy(shared->info.big_token_pts + base_idx + range.min, n->v + range.min, sizeof(n->v[0]) * dim_1u64(range));
base_idx += n->count;
}
}
lane_sync();
//- rjf: lex function * data -> tokens
#if 1
if(lane_idx() == 0 && lex_function != 0)
+34 -14
View File
@@ -25,8 +25,10 @@ typedef enum TXT_TokenKind
TXT_TokenKind_Identifier,
TXT_TokenKind_Numeric,
TXT_TokenKind_String,
TXT_TokenKind_Char,
TXT_TokenKind_Symbol,
TXT_TokenKind_Comment,
TXT_TokenKind_LineComment,
TXT_TokenKind_BlockComment,
TXT_TokenKind_Meta, // preprocessor, etc.
TXT_TokenKind_COUNT
}
@@ -65,6 +67,13 @@ struct TXT_Token
Rng1U64 range;
};
typedef struct TXT_TokenPt TXT_TokenPt;
struct TXT_TokenPt
{
TXT_TokenKind kind;
U64 off;
};
typedef struct TXT_TokenChunkNode TXT_TokenChunkNode;
struct TXT_TokenChunkNode
{
@@ -150,6 +159,8 @@ struct TXT_TextInfo
Rng1U64 *lines_ranges;
U64 lines_max_size;
TXT_LineEndKind line_end_kind;
U64 big_token_pts_count;
TXT_TokenPt *big_token_pts;
TXT_TokenArray tokens;
TXT_ScopePtArray scope_pts;
TXT_ScopeNodeArray scope_nodes;
@@ -209,25 +220,30 @@ struct TXT_LineMap
U64 total_line_count;
};
typedef struct TXT_TokenPtMapRangeNode TXT_TokenPtMapRangeNode;
struct TXT_TokenPtMapRangeNode
{
TXT_TokenPtMapRangeNode *next;
Rng1U64 num_range;
TXT_TokenPt *pts;
S64 delta;
};
typedef struct TXT_TokenPtMap TXT_TokenPtMap;
struct TXT_TokenPtMap
{
TXT_TokenPtMapRangeNode *first_range;
TXT_TokenPtMapRangeNode *last_range;
U64 total_pt_count;
};
typedef struct TXT_Patched TXT_Patched;
struct TXT_Patched
{
MemoryMap memory_map;
U64 size;
TXT_LineMap line_map;
};
typedef struct TXT_Line TXT_Line;
struct TXT_Line
{
Rng1U64 range;
};
typedef struct TXT_LineArray TXT_LineArray;
struct TXT_LineArray
{
TXT_Line *v;
U64 count;
TXT_TokenPtMap token_pt_map;
};
////////////////////////////////
@@ -292,6 +308,10 @@ internal TXT_TokenArray txt_token_array_from_string__disasm_x64_intel(Arena *are
internal void txt_line_map_push(Arena *arena, TXT_LineMap *map, Rng1U64 num_range, Rng1U64 *ranges, S64 delta);
internal U64 txt_line_num_from_off(TXT_LineMap *map, U64 off);
internal Rng1U64 txt_range_from_line_num(TXT_LineMap *map, U64 num);
internal void txt_token_pt_map_push(Arena *arena, TXT_TokenPtMap *map, Rng1U64 num_range, TXT_TokenPt *pts, S64 delta);
internal U64 txt_token_pt_num_from_off(TXT_TokenPtMap *map, U64 off);
internal TXT_TokenPt txt_token_pt_from_num(TXT_TokenPtMap *map, U64 num);
internal TXT_TokenArray txt_token_array_from_data(Arena *arena, TXT_TokenPt ctx_token_pt, String8 data, U64 base_off, U64 limit);
internal TXT_Patched txt_patched_from_info_data_patches(Arena *arena, TXT_TextInfo *info, String8 data, TXT_PatchList *patches);
//~ TODO(rjf): old unpatched text viz code:
+2 -2
View File
@@ -118,8 +118,8 @@ txt_multichar_symbols__c:
@table(token_kind open_string close_string close_advance nesting escaping parent_num) txt_tokenizer_rules__c:
{
{Comment "//" "\\n" 0 0 1 0}
{Comment "/*" "*/" 2 0 0 0}
{LineComment "//" "\\n" 0 0 1 0}
{BlockComment "/*" "*/" 2 0 0 0}
{Meta "#" "\\n" 0 0 1 0}
{String '\\"' '\\"' 1 0 1 0}
{String "'" "'" 1 0 1 0}