From 0fce3fa5e1df7582752b8baed11800444b411911 Mon Sep 17 00:00:00 2001 From: Ruslan Huzii Date: Sat, 4 Apr 2026 13:00:54 +0300 Subject: [PATCH 1/3] Add configurable Enter execution for executables and Ctrl+O terminal access - Add 'execute' option to enter_action config for running executable files - Implement Ctrl+O key binding to open terminal in current directory - Add shell return binding (Ctrl+O exits shell back to mdc) - Update help documentation and config examples - Support bash and zsh shells with temporary config files --- README.md | 5 ++- config.example.toml | 11 ++++++- internal/app/app.go | 11 +++++-- internal/app/commands.go | 62 ++++++++++++++++++++++++++++++++++++++ internal/app/keymap.go | 2 ++ internal/config/config.go | 20 ++++++------ internal/ui/help/help.go | 1 + internal/ui/panel/panel.go | 17 +++++++++-- 8 files changed, 114 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 531b9ee..c0e71c7 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,8 @@ Midday Commander (mdc) brings the classic dual-panel file management paradigm in - **Multi-file selection** - tag files with Insert or Shift+Arrow for batch operations - **Quick search** - start typing to jump to matching files instantly - **External editor/viewer** - opens files in `$EDITOR` and `$PAGER` +- **Execute files** - run executable files directly with Enter (configurable) +- **Terminal access** - open shell in current directory with Ctrl+O - **Mouse support** - clickable menu bar and panel interaction - **Go to path** - quickly jump to any directory with `~` expansion - **Single binary** - no runtime dependencies @@ -159,7 +161,7 @@ cp config.example.toml ~/.config/mdc/config.toml theme = "catppuccin-mocha" [behavior] -# What Enter does on a file: "edit" or "preview" +# What Enter does on a file: "edit", "preview", or "execute" enter_action = "edit" # What Space does on a file: "preview" or "edit" space_action = "preview" @@ -175,6 +177,7 @@ fuzzy_find = ["f9", "ctrl+p"] bookmarks = ["f2", "ctrl+b"] help = "f1" goto = "ctrl+g" +terminal = "ctrl+o" # ... all keys are configurable ``` diff --git a/config.example.toml b/config.example.toml index 9ec34c0..9a78b7b 100644 --- a/config.example.toml +++ b/config.example.toml @@ -8,7 +8,7 @@ theme = "catppuccin-mocha" # ─── Behavior ──────────────────────────────────── [behavior] -# What Enter does on a file: "edit" or "preview" +# What Enter does on a file: "edit", "preview", or "execute" enter_action = "edit" # What Space does on a file: "preview" or "edit" space_action = "preview" @@ -46,3 +46,12 @@ select_down = "shift+down" # Search quick_search = "ctrl+s" + +# Go to path +goto = "ctrl+g" +fuzzy_find = ["f9", "ctrl+p"] +bookmarks = ["f2", "ctrl+b"] +help = "f1" +theme_picker = "ctrl+t" +cmd_exec = "ctrl+r" +terminal = "ctrl+o" diff --git a/internal/app/app.go b/internal/app/app.go index 983c286..d787e7a 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -100,10 +100,10 @@ func New() Model { panelKM := panelKeyMapFromConfig(cfg.Keys) - left := panel.New(lfs, cwd, panelKM) + left := panel.New(lfs, cwd, panelKM, cfg) left.SetActive(true) - right := panel.New(lfs, home, panelKM) + right := panel.New(lfs, home, panelKM, cfg) th := theme.Default() if cfg.Theme != "" { @@ -253,6 +253,9 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case panel.OpenFileMsg: return m, m.fileActionCmd(msg.Path, m.cfg.Behavior.EnterAction) + case panel.ExecuteFileMsg: + return m, executeFileCmd(msg.Path, m.activePanel().Path()) + case panel.PreviewFileMsg: return m, m.fileActionCmd(msg.Path, m.cfg.Behavior.SpaceAction) @@ -436,6 +439,8 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case key.Matches(msg, m.keyMap.CmdExec): return m.startCmdExec() + case key.Matches(msg, m.keyMap.Terminal): + return m, startTerminalCmd(m.activePanel().Path()) } // Delegate to active panel @@ -524,6 +529,8 @@ func (m Model) dispatchKey(raw string) (tea.Model, tea.Cmd) { return m.startThemePicker() case contains(cfg.CmdExec, raw): return m.startCmdExec() + case contains(cfg.Terminal, raw): + return m, startTerminalCmd(m.activePanel().Path()) } return m, nil } diff --git a/internal/app/commands.go b/internal/app/commands.go index 439676f..fe40743 100644 --- a/internal/app/commands.go +++ b/internal/app/commands.go @@ -78,6 +78,68 @@ func editFileCmd(path string) tea.Cmd { }) } +func executeFileCmd(path string, dir string) tea.Cmd { + c := exec.Command(path) + c.Dir = dir + return tea.ExecProcess(c, func(err error) tea.Msg { + return externalDoneMsg{err: err} + }) +} + +func startTerminalCmd(dir string) tea.Cmd { + shell := os.Getenv("SHELL") + if shell == "" { + shell = "bash" + } + c := interactiveShellCmd(shell) + c.Dir = dir + return tea.ExecProcess(c, func(err error) tea.Msg { + return externalDoneMsg{err: err} + }) +} + +func interactiveShellCmd(shellPath string) *exec.Cmd { + name := filepath.Base(shellPath) + switch name { + case "bash": + if rcFile, err := writeBashRc(); err == nil { + return exec.Command(shellPath, "--rcfile", rcFile, "-i") + } + case "zsh": + if dir, err := writeZshDir(); err == nil { + cmd := exec.Command(shellPath, "-i") + cmd.Env = append(os.Environ(), "ZDOTDIR="+dir) + return cmd + } + } + return exec.Command(shellPath, "-i") +} + +func writeBashRc() (string, error) { + f, err := os.CreateTemp("", "mdc-terminal-*.bashrc") + if err != nil { + return "", err + } + defer f.Close() + _, err = f.WriteString(`bind '"\C-o": "\C-d"'` + "\n") + if err != nil { + return "", err + } + return f.Name(), nil +} + +func writeZshDir() (string, error) { + dir, err := os.MkdirTemp("", "mdc-terminal-*") + if err != nil { + return "", err + } + path := filepath.Join(dir, ".zshrc") + if err := os.WriteFile(path, []byte("bindkey '^O' exit\n"), 0o600); err != nil { + return "", err + } + return dir, nil +} + // refreshBothPanels returns commands to reload both panels. func (m *Model) refreshBothPanels() tea.Cmd { return tea.Batch(m.leftPanel.LoadDir(), m.rightPanel.LoadDir()) diff --git a/internal/app/keymap.go b/internal/app/keymap.go index 2fd6ef1..aea826c 100644 --- a/internal/app/keymap.go +++ b/internal/app/keymap.go @@ -24,6 +24,7 @@ type KeyMap struct { Help key.Binding ThemePicker key.Binding CmdExec key.Binding + Terminal key.Binding } // KeyMapFromConfig builds the global keymap from config. @@ -45,6 +46,7 @@ func KeyMapFromConfig(keys config.KeyBindings) KeyMap { Help: binding(keys.Help, "help"), ThemePicker: binding(keys.ThemePicker, "themes"), CmdExec: binding(keys.CmdExec, "run cmd"), + Terminal: binding(keys.Terminal, "terminal"), } } diff --git a/internal/config/config.go b/internal/config/config.go index 8e82e7e..a21c6ef 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -20,7 +20,7 @@ type Config struct { // BehaviorConfig controls configurable behaviors. type BehaviorConfig struct { - // What Enter does on a file: "edit" (default) or "preview" + // What Enter does on a file: "edit" (default), "preview", or "execute" EnterAction string `toml:"enter_action"` // What Space does on a file: "preview" (default) or "edit" SpaceAction string `toml:"space_action"` @@ -58,12 +58,13 @@ type KeyBindings struct { QuickSearch StringOrList `toml:"quick_search"` // Go to path - GoTo StringOrList `toml:"goto"` - FuzzyFind StringOrList `toml:"fuzzy_find"` - Bookmarks StringOrList `toml:"bookmarks"` + GoTo StringOrList `toml:"goto"` + FuzzyFind StringOrList `toml:"fuzzy_find"` + Bookmarks StringOrList `toml:"bookmarks"` Help StringOrList `toml:"help"` ThemePicker StringOrList `toml:"theme_picker"` CmdExec StringOrList `toml:"cmd_exec"` + Terminal StringOrList `toml:"terminal"` } // StringOrList can unmarshal from either a single string or a list of strings. @@ -125,13 +126,12 @@ func DefaultKeyBindings() KeyBindings { QuickSearch: StringOrList{"ctrl+s"}, - GoTo: StringOrList{"ctrl+g"}, - FuzzyFind: StringOrList{"f9", "ctrl+p"}, - Bookmarks: StringOrList{"f2", "ctrl+b"}, + GoTo: StringOrList{"ctrl+g"}, + FuzzyFind: StringOrList{"f9", "ctrl+p"}, + Bookmarks: StringOrList{"f2", "ctrl+b"}, Help: StringOrList{"f1"}, ThemePicker: StringOrList{"ctrl+t"}, - CmdExec: StringOrList{"ctrl+r"}, - } + CmdExec: StringOrList{"ctrl+r"}, Terminal: StringOrList{"ctrl+o"}} } // Load reads config from ~/.config/mdc/config.toml, merging with defaults. @@ -194,6 +194,7 @@ func mergeKeys(dst, src *KeyBindings) { mergeKey(&dst.Help, src.Help) mergeKey(&dst.ThemePicker, src.ThemePicker) mergeKey(&dst.CmdExec, src.CmdExec) + mergeKey(&dst.Terminal, src.Terminal) } func mergeKey(dst *StringOrList, src StringOrList) { @@ -250,6 +251,7 @@ func normalizeAllKeys(kb *KeyBindings) { normalizeSlice(&kb.Help) normalizeSlice(&kb.ThemePicker) normalizeSlice(&kb.CmdExec) + normalizeSlice(&kb.Terminal) } // SaveTheme writes the theme name to the config file, preserving other settings. diff --git a/internal/ui/help/help.go b/internal/ui/help/help.go index ba502d1..8c08520 100644 --- a/internal/ui/help/help.go +++ b/internal/ui/help/help.go @@ -98,6 +98,7 @@ func (m Model) buildEntries() []entry { {"Quick search", fmtKeys(k.QuickSearch)}, {"Theme picker", fmtKeys(k.ThemePicker)}, {"Run command", fmtKeys(k.CmdExec)}, + {"Terminal", fmtKeys(k.Terminal)}, {"Help", fmtKeys(k.Help)}, {"Quit", fmtKeys(k.Quit)}, } diff --git a/internal/ui/panel/panel.go b/internal/ui/panel/panel.go index b57a509..a2a4272 100644 --- a/internal/ui/panel/panel.go +++ b/internal/ui/panel/panel.go @@ -8,6 +8,7 @@ import ( "github.com/charmbracelet/bubbles/key" tea "github.com/charmbracelet/bubbletea" + "github.com/kooler/MiddayCommander/internal/config" "github.com/kooler/MiddayCommander/internal/vfs" "github.com/kooler/MiddayCommander/internal/vfs/archive" ) @@ -42,6 +43,8 @@ type Model struct { active bool err error + cfg config.Config // application config + // Quick search state searching bool searchQuery string @@ -57,13 +60,14 @@ type Model struct { } // New creates a new panel browsing the given directory. -func New(filesystem vfs.FS, path string, km KeyMap) Model { +func New(filesystem vfs.FS, path string, km KeyMap, cfg config.Config) Model { return Model{ fs: filesystem, path: path, selected: make(map[int]bool), sortMode: SortByName, keyMap: km, + cfg: cfg, } } @@ -381,8 +385,12 @@ func (m *Model) handleEnter() tea.Cmd { } } - // Enter on file = open for edit + // Enter on file path := m.CurrentPath() + info := m.infos[m.cursor] + if info != nil && isExecutable(info.Mode()) && m.cfg.Behavior.EnterAction == "execute" { + return func() tea.Msg { return ExecuteFileMsg{Path: path} } + } return func() tea.Msg { return OpenFileMsg{Path: path} } } @@ -502,6 +510,11 @@ type OpenFileMsg struct { Path string } +// ExecuteFileMsg is sent when the user wants to execute a file (Enter on executable file). +type ExecuteFileMsg struct { + Path string +} + // PreviewFileMsg is sent when the user wants to preview a file (Space on file). type PreviewFileMsg struct { Path string From bf6b6d3a0ef76d2d61f468e1f1c7182c3bc5ed6e Mon Sep 17 00:00:00 2001 From: Ruslan Huzii Date: Sat, 11 Apr 2026 11:27:38 +0300 Subject: [PATCH 2/3] Add executable Enter behavior confirmation and optional post-execution pause --- README.md | 4 ++++ config.example.toml | 4 ++++ internal/app/app.go | 30 +++++++++++++++++++++--------- internal/app/commands.go | 32 +++++++++++++++++++++++++++++++- internal/config/config.go | 18 ++++++++++++++++-- internal/ui/panel/panel.go | 2 +- 6 files changed, 77 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index c0e71c7..f83d4e2 100644 --- a/README.md +++ b/README.md @@ -165,6 +165,10 @@ theme = "catppuccin-mocha" enter_action = "edit" # What Space does on a file: "preview" or "edit" space_action = "preview" +# Whether to ask for confirmation before executing a file. +confirm_execute = true +# Whether to pause and wait after execution before returning to Midday Commander. +pause_after_execute = false [keys] quit = ["f10", "ctrl+c"] diff --git a/config.example.toml b/config.example.toml index 9a78b7b..9a58f0d 100644 --- a/config.example.toml +++ b/config.example.toml @@ -12,6 +12,10 @@ theme = "catppuccin-mocha" enter_action = "edit" # What Space does on a file: "preview" or "edit" space_action = "preview" +# Whether to ask for confirmation before executing a file. +confirm_execute = true +# Whether to pause and wait after execution before returning to Midday Commander. +pause_after_execute = false # ─── Key Bindings ──────────────────────────────── # Each binding can be a single string or a list of strings. diff --git a/internal/app/app.go b/internal/app/app.go index d787e7a..1f17b8e 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -36,12 +36,13 @@ const ( // Dialog tags identify which operation triggered the dialog. const ( - tagCopy = "copy" - tagMove = "move" - tagDelete = "delete" - tagMkdir = "mkdir" - tagRename = "rename" - tagGoTo = "goto" + tagCopy = "copy" + tagMove = "move" + tagDelete = "delete" + tagMkdir = "mkdir" + tagRename = "rename" + tagGoTo = "goto" + tagExecute = "execute" ) // Model is the root application model. @@ -71,8 +72,9 @@ type Model struct { bookmarkStore *bookmark.Store // Pending operation state (saved while dialog is open) - pendingSources []string - pendingDest string + pendingSources []string + pendingDest string + pendingExecutePath string // Double-Esc to quit lastEsc time.Time @@ -254,7 +256,13 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, m.fileActionCmd(msg.Path, m.cfg.Behavior.EnterAction) case panel.ExecuteFileMsg: - return m, executeFileCmd(msg.Path, m.activePanel().Path()) + if m.cfg.Behavior.ConfirmExecute == nil || *m.cfg.Behavior.ConfirmExecute { + m.pendingExecutePath = msg.Path + d := dialog.NewConfirm("Execute file", fmt.Sprintf("Run %s?", filepath.Base(msg.Path)), tagExecute) + m.dialog = &d + return m, nil + } + return m, executeFileCmd(msg.Path, m.activePanel().Path(), m.cfg.Behavior.PauseAfterExecute) case panel.PreviewFileMsg: return m, m.fileActionCmd(msg.Path, m.cfg.Behavior.SpaceAction) @@ -728,6 +736,10 @@ func (m Model) handleDialogResult(result dialog.Result) (tea.Model, tea.Cmd) { m.activePanel().SetPath(path) return m, m.activePanel().LoadDir() } + case tagExecute: + if result.Confirmed { + return m, executeFileCmd(m.pendingExecutePath, m.activePanel().Path(), m.cfg.Behavior.PauseAfterExecute) + } } return m, nil } diff --git a/internal/app/commands.go b/internal/app/commands.go index fe40743..e81773c 100644 --- a/internal/app/commands.go +++ b/internal/app/commands.go @@ -1,9 +1,11 @@ package app import ( + "fmt" "os" "os/exec" "path/filepath" + "strings" tea "github.com/charmbracelet/bubbletea" @@ -78,7 +80,19 @@ func editFileCmd(path string) tea.Cmd { }) } -func executeFileCmd(path string, dir string) tea.Cmd { +func executeFileCmd(path string, dir string, pause bool) tea.Cmd { + if pause { + shell := os.Getenv("SHELL") + if shell == "" { + shell = "bash" + } + c := pauseExecutionCmd(shell, path) + c.Dir = dir + return tea.ExecProcess(c, func(err error) tea.Msg { + return externalDoneMsg{err: err} + }) + } + c := exec.Command(path) c.Dir = dir return tea.ExecProcess(c, func(err error) tea.Msg { @@ -86,6 +100,22 @@ func executeFileCmd(path string, dir string) tea.Cmd { }) } +func pauseExecutionCmd(shellPath, path string) *exec.Cmd { + escapedPath := shellQuote(path) + shellName := filepath.Base(shellPath) + if shellName == "bash" || shellName == "zsh" { + script := fmt.Sprintf("status=0; %s || status=$?; printf '\nPress any key to continue...'; read -n1 -s; exit $status", escapedPath) + return exec.Command(shellPath, "-lc", script) + } + + script := fmt.Sprintf("status=0; %s || status=$?; printf '\nPress enter to continue...'; read -r; exit $status", escapedPath) + return exec.Command(shellPath, "-c", script) +} + +func shellQuote(path string) string { + return "'" + strings.ReplaceAll(path, "'", "'\\''") + "'" +} + func startTerminalCmd(dir string) tea.Cmd { shell := os.Getenv("SHELL") if shell == "" { diff --git a/internal/config/config.go b/internal/config/config.go index a21c6ef..24e8e01 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -24,6 +24,10 @@ type BehaviorConfig struct { EnterAction string `toml:"enter_action"` // What Space does on a file: "preview" (default) or "edit" SpaceAction string `toml:"space_action"` + // Whether to ask for confirmation before executing a file. + ConfirmExecute *bool `toml:"confirm_execute"` + // Whether to pause and wait after execution before returning to Midday Commander. + PauseAfterExecute bool `toml:"pause_after_execute"` } // KeyBindings defines all configurable key bindings. @@ -85,14 +89,20 @@ func (s *StringOrList) UnmarshalTOML(data any) error { } // Default returns a config with all defaults. +func boolPtr(v bool) *bool { + return &v +} + func Default() Config { keys := DefaultKeyBindings() normalizeAllKeys(&keys) return Config{ Theme: "", Behavior: BehaviorConfig{ - EnterAction: "edit", - SpaceAction: "preview", + EnterAction: "edit", + SpaceAction: "preview", + ConfirmExecute: boolPtr(true), + PauseAfterExecute: false, }, Keys: keys, } @@ -159,6 +169,10 @@ func Load() Config { if fileCfg.Behavior.SpaceAction != "" { cfg.Behavior.SpaceAction = fileCfg.Behavior.SpaceAction } + if fileCfg.Behavior.ConfirmExecute != nil { + cfg.Behavior.ConfirmExecute = fileCfg.Behavior.ConfirmExecute + } + cfg.Behavior.PauseAfterExecute = fileCfg.Behavior.PauseAfterExecute mergeKeys(&cfg.Keys, &fileCfg.Keys) normalizeAllKeys(&cfg.Keys) diff --git a/internal/ui/panel/panel.go b/internal/ui/panel/panel.go index a2a4272..05f3ec5 100644 --- a/internal/ui/panel/panel.go +++ b/internal/ui/panel/panel.go @@ -387,7 +387,7 @@ func (m *Model) handleEnter() tea.Cmd { // Enter on file path := m.CurrentPath() - info := m.infos[m.cursor] + info := m.CurrentInfo() if info != nil && isExecutable(info.Mode()) && m.cfg.Behavior.EnterAction == "execute" { return func() tea.Msg { return ExecuteFileMsg{Path: path} } } From 22d21e0d3c3df1be545285aac9b1a8174e1ee23c Mon Sep 17 00:00:00 2001 From: Ruslan Huzii Date: Sat, 11 Apr 2026 11:39:39 +0300 Subject: [PATCH 3/3] Commit remaining configuration and keymap changes --- internal/app/keymap.go | 56 +++++++++++++++++++-------------------- internal/config/config.go | 22 +++++++-------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/internal/app/keymap.go b/internal/app/keymap.go index 053c44e..a816a12 100644 --- a/internal/app/keymap.go +++ b/internal/app/keymap.go @@ -8,20 +8,20 @@ import ( // KeyMap defines all global keybindings. type KeyMap struct { - Quit key.Binding - TogglePanel key.Binding - SwapPanels key.Binding - Copy key.Binding - Move key.Binding - Mkdir key.Binding - Delete key.Binding - Rename key.Binding - View key.Binding - Edit key.Binding - GoTo key.Binding - FuzzyFind key.Binding - Bookmarks key.Binding - Help key.Binding + Quit key.Binding + TogglePanel key.Binding + SwapPanels key.Binding + Copy key.Binding + Move key.Binding + Mkdir key.Binding + Delete key.Binding + Rename key.Binding + View key.Binding + Edit key.Binding + GoTo key.Binding + FuzzyFind key.Binding + Bookmarks key.Binding + Help key.Binding ThemePicker key.Binding CmdExec key.Binding Terminal key.Binding @@ -31,20 +31,20 @@ type KeyMap struct { // KeyMapFromConfig builds the global keymap from config. func KeyMapFromConfig(keys config.KeyBindings) KeyMap { return KeyMap{ - Quit: binding(keys.Quit, "quit"), - TogglePanel: binding(keys.TogglePanel, "switch panel"), - SwapPanels: binding(keys.SwapPanels, "swap panels"), - Copy: binding(keys.Copy, "copy"), - Move: binding(keys.Move, "move"), - Mkdir: binding(keys.Mkdir, "mkdir"), - Delete: binding(keys.Delete, "delete"), - Rename: binding(keys.Rename, "rename"), - View: binding(keys.View, "view"), - Edit: binding(keys.Edit, "edit"), - GoTo: binding(keys.GoTo, "go to"), - FuzzyFind: binding(keys.FuzzyFind, "find"), - Bookmarks: binding(keys.Bookmarks, "bookmarks"), - Help: binding(keys.Help, "help"), + Quit: binding(keys.Quit, "quit"), + TogglePanel: binding(keys.TogglePanel, "switch panel"), + SwapPanels: binding(keys.SwapPanels, "swap panels"), + Copy: binding(keys.Copy, "copy"), + Move: binding(keys.Move, "move"), + Mkdir: binding(keys.Mkdir, "mkdir"), + Delete: binding(keys.Delete, "delete"), + Rename: binding(keys.Rename, "rename"), + View: binding(keys.View, "view"), + Edit: binding(keys.Edit, "edit"), + GoTo: binding(keys.GoTo, "go to"), + FuzzyFind: binding(keys.FuzzyFind, "find"), + Bookmarks: binding(keys.Bookmarks, "bookmarks"), + Help: binding(keys.Help, "help"), ThemePicker: binding(keys.ThemePicker, "themes"), CmdExec: binding(keys.CmdExec, "run cmd"), Terminal: binding(keys.Terminal, "terminal"), diff --git a/internal/config/config.go b/internal/config/config.go index f8cd055..c495fd7 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -62,10 +62,10 @@ type KeyBindings struct { QuickSearch StringOrList `toml:"quick_search"` // Go to path - GoTo StringOrList `toml:"goto"` - FuzzyFind StringOrList `toml:"fuzzy_find"` - Bookmarks StringOrList `toml:"bookmarks"` - Help StringOrList `toml:"help"` + GoTo StringOrList `toml:"goto"` + FuzzyFind StringOrList `toml:"fuzzy_find"` + Bookmarks StringOrList `toml:"bookmarks"` + Help StringOrList `toml:"help"` ThemePicker StringOrList `toml:"theme_picker"` CmdExec StringOrList `toml:"cmd_exec"` Terminal StringOrList `toml:"terminal"` @@ -137,13 +137,13 @@ func DefaultKeyBindings() KeyBindings { QuickSearch: StringOrList{"ctrl+s"}, - GoTo: StringOrList{"ctrl+g"}, - FuzzyFind: StringOrList{"f9", "ctrl+p"}, - Bookmarks: StringOrList{"f2", "ctrl+b"}, - Help: StringOrList{"f1"}, - ThemePicker: StringOrList{"ctrl+t"}, - CmdExec: StringOrList{"ctrl+r"}, - Terminal: StringOrList{"ctrl+o"}, + GoTo: StringOrList{"ctrl+g"}, + FuzzyFind: StringOrList{"f9", "ctrl+p"}, + Bookmarks: StringOrList{"f2", "ctrl+b"}, + Help: StringOrList{"f1"}, + ThemePicker: StringOrList{"ctrl+t"}, + CmdExec: StringOrList{"ctrl+r"}, + Terminal: StringOrList{"ctrl+o"}, ToggleHidden: StringOrList{"ctrl+h"}, } }