diff --git a/docs/Config.md b/docs/Config.md index 8fd1fd960c0..49a89a37901 100644 --- a/docs/Config.md +++ b/docs/Config.md @@ -424,7 +424,7 @@ os: # Whether lazygit suspends until an edit process returns editInTerminal: false - # For opening a directory in an editor + # For opening a directory in an editor. Should contain "{{dir}}". openDirInEditor: "" # A built-in preset that sets all of the above settings. Supported presets diff --git a/pkg/config/app_config_test.go b/pkg/config/app_config_test.go index 15e0732a783..465f07bdbb9 100644 --- a/pkg/config/app_config_test.go +++ b/pkg/config/app_config_test.go @@ -555,7 +555,7 @@ os: # Whether lazygit suspends until an edit process returns editInTerminal: false - # For opening a directory in an editor + # For opening a directory in an editor. Should contain "{{dir}}". openDirInEditor: "" # A built-in preset that sets all of the above settings. Supported presets diff --git a/pkg/config/user_config.go b/pkg/config/user_config.go index 9064303e20f..3d8cdaacd5f 100644 --- a/pkg/config/user_config.go +++ b/pkg/config/user_config.go @@ -573,7 +573,7 @@ type OSConfig struct { // [dev] We're naming this `editInTerminal` for backwards compatibility SuspendOnEdit *bool `yaml:"editInTerminal,omitempty"` - // For opening a directory in an editor + // For opening a directory in an editor. Should contain "{{dir}}". OpenDirInEditor string `yaml:"openDirInEditor,omitempty"` // A built-in preset that sets all of the above settings. Supported presets diff --git a/pkg/gui/controllers/files_controller.go b/pkg/gui/controllers/files_controller.go index 6df28a523ed..36e245ec5db 100644 --- a/pkg/gui/controllers/files_controller.go +++ b/pkg/gui/controllers/files_controller.go @@ -90,8 +90,8 @@ func (self *FilesController) GetKeybindings(opts types.KeybindingsOpts) []*types }, { Key: opts.GetKey(opts.Config.Universal.Edit), - Handler: self.withItems(self.edit), - GetDisabledReason: self.require(self.itemsSelected(self.canEditFiles)), + Handler: self.withItems(self.editOrOpenDir), + GetDisabledReason: self.any(self.singleItemSelected(), self.itemsSelected(self.canEditFiles)), Description: self.c.Tr.Edit, Tooltip: self.c.Tr.EditFileTooltip, DisplayOnScreen: true, @@ -913,6 +913,14 @@ func (self *FilesController) edit(nodes []*filetree.FileNode) error { })) } +func (self *FilesController) editOrOpenDir(nodes []*filetree.FileNode) error { + if len(nodes) == 1 && !nodes[0].IsFile() { + return self.c.Helpers().Files.OpenDirInEditor(nodes[0].GetPath()) + } else { + return self.edit(nodes) + } +} + func (self *FilesController) canEditFiles(nodes []*filetree.FileNode) *types.DisabledReason { if lo.NoneBy(nodes, func(node *filetree.FileNode) bool { return node.IsFile() }) { return &types.DisabledReason{ diff --git a/pkg/gui/controllers/list_controller_trait.go b/pkg/gui/controllers/list_controller_trait.go index fa5fc1492f4..c9a422962c4 100644 --- a/pkg/gui/controllers/list_controller_trait.go +++ b/pkg/gui/controllers/list_controller_trait.go @@ -44,6 +44,21 @@ func (self *ListControllerTrait[T]) require(callbacks ...func() *types.DisabledR } } +// Complement to require - returns nil if any of the provided callbacks return nil. +// If all callbacks return a non-nil DisabledReason, it returns the last one encountered. +func (self *ListControllerTrait[T]) any(callbacks ...func() *types.DisabledReason) func() *types.DisabledReason { + return func() *types.DisabledReason { + var disabledReason *types.DisabledReason + for _, callback := range callbacks { + if disabledReason := callback(); disabledReason == nil { + return disabledReason + } + } + + return disabledReason + } +} + // Convenience function for enforcing that a single item is selected. // Also takes callbacks for additional disabled reasons, and passes the selected // item into each one. diff --git a/schema/config.json b/schema/config.json index 86391465f1c..570b4ba22f5 100644 --- a/schema/config.json +++ b/schema/config.json @@ -1545,7 +1545,7 @@ }, "openDirInEditor": { "type": "string", - "description": "For opening a directory in an editor" + "description": "For opening a directory in an editor. Should contain \"{{dir}}\"." }, "editPreset": { "type": "string",