mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-07-31 14:24:25 +03:00
Support editing multiple files at once using range selection
We pass all of them to a single editor command, hoping that the editor will be able to handle multiple files (VS Code and vim do). We ignore directories that happen to be in the selection range; this makes it easier to edit multiple files in different folders in tree view. We show an error if only directories are selected, though.
This commit is contained in:
@ -65,8 +65,8 @@ func (self *CommitFilesController) GetKeybindings(opts types.KeybindingsOpts) []
|
||||
},
|
||||
{
|
||||
Key: opts.GetKey(opts.Config.Universal.Edit),
|
||||
Handler: self.withItem(self.edit),
|
||||
GetDisabledReason: self.require(self.singleItemSelected()),
|
||||
Handler: self.withItems(self.edit),
|
||||
GetDisabledReason: self.require(self.itemsSelected(self.canEditFiles)),
|
||||
Description: self.c.Tr.Edit,
|
||||
Tooltip: self.c.Tr.EditFileTooltip,
|
||||
DisplayOnScreen: true,
|
||||
@ -230,12 +230,22 @@ func (self *CommitFilesController) open(node *filetree.CommitFileNode) error {
|
||||
return self.c.Helpers().Files.OpenFile(node.GetPath())
|
||||
}
|
||||
|
||||
func (self *CommitFilesController) edit(node *filetree.CommitFileNode) error {
|
||||
if node.File == nil {
|
||||
return self.c.ErrorMsg(self.c.Tr.ErrCannotEditDirectory)
|
||||
func (self *CommitFilesController) edit(nodes []*filetree.CommitFileNode) error {
|
||||
return self.c.Helpers().Files.EditFiles(lo.FilterMap(nodes,
|
||||
func(node *filetree.CommitFileNode, _ int) (string, bool) {
|
||||
return node.GetPath(), node.IsFile()
|
||||
}))
|
||||
}
|
||||
|
||||
func (self *CommitFilesController) canEditFiles(nodes []*filetree.CommitFileNode) *types.DisabledReason {
|
||||
if lo.NoneBy(nodes, func(node *filetree.CommitFileNode) bool { return node.IsFile() }) {
|
||||
return &types.DisabledReason{
|
||||
Text: self.c.Tr.ErrCannotEditDirectory,
|
||||
ShowErrorInPanel: true,
|
||||
}
|
||||
}
|
||||
|
||||
return self.c.Helpers().Files.EditFile(node.GetPath())
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *CommitFilesController) openDiffTool(node *filetree.CommitFileNode) error {
|
||||
|
@ -86,8 +86,8 @@ func (self *FilesController) GetKeybindings(opts types.KeybindingsOpts) []*types
|
||||
},
|
||||
{
|
||||
Key: opts.GetKey(opts.Config.Universal.Edit),
|
||||
Handler: self.withItem(self.edit),
|
||||
GetDisabledReason: self.require(self.singleItemSelected()),
|
||||
Handler: self.withItems(self.edit),
|
||||
GetDisabledReason: self.require(self.itemsSelected(self.canEditFiles)),
|
||||
Description: self.c.Tr.Edit,
|
||||
Tooltip: self.c.Tr.EditFileTooltip,
|
||||
DisplayOnScreen: true,
|
||||
@ -714,12 +714,22 @@ func (self *FilesController) setStatusFiltering(filter filetree.FileTreeDisplayF
|
||||
return self.c.PostRefreshUpdate(self.context())
|
||||
}
|
||||
|
||||
func (self *FilesController) edit(node *filetree.FileNode) error {
|
||||
if node.File == nil {
|
||||
return self.c.ErrorMsg(self.c.Tr.ErrCannotEditDirectory)
|
||||
func (self *FilesController) edit(nodes []*filetree.FileNode) error {
|
||||
return self.c.Helpers().Files.EditFiles(lo.FilterMap(nodes,
|
||||
func(node *filetree.FileNode, _ int) (string, bool) {
|
||||
return node.GetPath(), node.IsFile()
|
||||
}))
|
||||
}
|
||||
|
||||
func (self *FilesController) canEditFiles(nodes []*filetree.FileNode) *types.DisabledReason {
|
||||
if lo.NoneBy(nodes, func(node *filetree.FileNode) bool { return node.IsFile() }) {
|
||||
return &types.DisabledReason{
|
||||
Text: self.c.Tr.ErrCannotEditDirectory,
|
||||
ShowErrorInPanel: true,
|
||||
}
|
||||
}
|
||||
|
||||
return self.c.Helpers().Files.EditFile(node.GetPath())
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *FilesController) Open() error {
|
||||
|
@ -2,10 +2,12 @@ package helpers
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
|
||||
"github.com/samber/lo"
|
||||
)
|
||||
|
||||
type IFilesHelper interface {
|
||||
EditFile(filename string) error
|
||||
EditFiles(filenames []string) error
|
||||
EditFileAtLine(filename string, lineNumber int) error
|
||||
OpenFile(filename string) error
|
||||
}
|
||||
@ -22,12 +24,15 @@ func NewFilesHelper(c *HelperCommon) *FilesHelper {
|
||||
|
||||
var _ IFilesHelper = &FilesHelper{}
|
||||
|
||||
func (self *FilesHelper) EditFile(filename string) error {
|
||||
absPath, err := filepath.Abs(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
cmdStr, suspend := self.c.Git().File.GetEditCmdStr(absPath)
|
||||
func (self *FilesHelper) EditFiles(filenames []string) error {
|
||||
absPaths := lo.Map(filenames, func(filename string, _ int) string {
|
||||
absPath, err := filepath.Abs(filename)
|
||||
if err != nil {
|
||||
return filename
|
||||
}
|
||||
return absPath
|
||||
})
|
||||
cmdStr, suspend := self.c.Git().File.GetEditCmdStr(absPaths)
|
||||
return self.callEditor(cmdStr, suspend)
|
||||
}
|
||||
|
||||
|
@ -217,7 +217,9 @@ func (self *StatusController) openConfig() error {
|
||||
}
|
||||
|
||||
func (self *StatusController) editConfig() error {
|
||||
return self.askForConfigFile(self.c.Helpers().Files.EditFile)
|
||||
return self.askForConfigFile(func(file string) error {
|
||||
return self.c.Helpers().Files.EditFiles([]string{file})
|
||||
})
|
||||
}
|
||||
|
||||
func (self *StatusController) showAllBranchLogs() error {
|
||||
|
Reference in New Issue
Block a user