mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-14 11:23:09 +02:00
aa74239f05
This allows us to jump back to the parent neovim process when we want to edit a file, rather than opening a new neovim process within lazygit. Arguably this should be the default, but I'm not familiar with the various ways people use lazygit with neovim.
144 lines
4.9 KiB
Go
144 lines
4.9 KiB
Go
package config
|
|
|
|
func GetEditTemplate(osConfig *OSConfig, guessDefaultEditor func() string) (string, bool) {
|
|
preset := getPreset(osConfig, guessDefaultEditor)
|
|
template := osConfig.Edit
|
|
if template == "" {
|
|
template = preset.editTemplate
|
|
}
|
|
|
|
return template, getEditInTerminal(osConfig, preset)
|
|
}
|
|
|
|
func GetEditAtLineTemplate(osConfig *OSConfig, guessDefaultEditor func() string) (string, bool) {
|
|
preset := getPreset(osConfig, guessDefaultEditor)
|
|
template := osConfig.EditAtLine
|
|
if template == "" {
|
|
template = preset.editAtLineTemplate
|
|
}
|
|
return template, getEditInTerminal(osConfig, preset)
|
|
}
|
|
|
|
func GetEditAtLineAndWaitTemplate(osConfig *OSConfig, guessDefaultEditor func() string) string {
|
|
preset := getPreset(osConfig, guessDefaultEditor)
|
|
template := osConfig.EditAtLineAndWait
|
|
if template == "" {
|
|
template = preset.editAtLineAndWaitTemplate
|
|
}
|
|
return template
|
|
}
|
|
|
|
func GetOpenDirInEditorTemplate(osConfig *OSConfig, guessDefaultEditor func() string) (string, bool) {
|
|
preset := getPreset(osConfig, guessDefaultEditor)
|
|
template := osConfig.OpenDirInEditor
|
|
if template == "" {
|
|
template = preset.openDirInEditorTemplate
|
|
}
|
|
return template, getEditInTerminal(osConfig, preset)
|
|
}
|
|
|
|
type editPreset struct {
|
|
editTemplate string
|
|
editAtLineTemplate string
|
|
editAtLineAndWaitTemplate string
|
|
openDirInEditorTemplate string
|
|
editInTerminal bool
|
|
}
|
|
|
|
// IF YOU ADD A PRESET TO THIS FUNCTION YOU MUST UPDATE THE `Supported presets` SECTION OF docs/Config.md
|
|
func getPreset(osConfig *OSConfig, guessDefaultEditor func() string) *editPreset {
|
|
presets := map[string]*editPreset{
|
|
"vi": standardTerminalEditorPreset("vi"),
|
|
"vim": standardTerminalEditorPreset("vim"),
|
|
"nvim": standardTerminalEditorPreset("nvim"),
|
|
"nvim-remote": {
|
|
editTemplate: `nvim --server "$NVIM" --remote-tab {{filename}}`,
|
|
editAtLineTemplate: `nvim --server "$NVIM" --remote-tab {{filename}}; [ -z "$NVIM" ] || nvim --server "$NVIM" --remote-send ":{{line}}<CR>"`,
|
|
// No remote-wait support yet. See https://github.com/neovim/neovim/pull/17856
|
|
editAtLineAndWaitTemplate: `nvim +{{line}} {{filename}}`,
|
|
openDirInEditorTemplate: `nvim --server "$NVIM" --remote-tab {{dir}}`,
|
|
editInTerminal: false,
|
|
},
|
|
"emacs": standardTerminalEditorPreset("emacs"),
|
|
"nano": standardTerminalEditorPreset("nano"),
|
|
"kakoune": standardTerminalEditorPreset("kak"),
|
|
"helix": {
|
|
editTemplate: "hx -- {{filename}}",
|
|
editAtLineTemplate: "hx -- {{filename}}:{{line}}",
|
|
editAtLineAndWaitTemplate: "hx -- {{filename}}:{{line}}",
|
|
openDirInEditorTemplate: "hx -- {{dir}}",
|
|
editInTerminal: true,
|
|
},
|
|
"vscode": {
|
|
editTemplate: "code --reuse-window -- {{filename}}",
|
|
editAtLineTemplate: "code --reuse-window --goto -- {{filename}}:{{line}}",
|
|
editAtLineAndWaitTemplate: "code --reuse-window --goto --wait -- {{filename}}:{{line}}",
|
|
openDirInEditorTemplate: "code -- {{dir}}",
|
|
editInTerminal: false,
|
|
},
|
|
"sublime": {
|
|
editTemplate: "subl -- {{filename}}",
|
|
editAtLineTemplate: "subl -- {{filename}}:{{line}}",
|
|
editAtLineAndWaitTemplate: "subl --wait -- {{filename}}:{{line}}",
|
|
openDirInEditorTemplate: "subl -- {{dir}}",
|
|
editInTerminal: false,
|
|
},
|
|
"bbedit": {
|
|
editTemplate: "bbedit -- {{filename}}",
|
|
editAtLineTemplate: "bbedit +{{line}} -- {{filename}}",
|
|
editAtLineAndWaitTemplate: "bbedit +{{line}} --wait -- {{filename}}",
|
|
openDirInEditorTemplate: "bbedit -- {{dir}}",
|
|
editInTerminal: false,
|
|
},
|
|
"xcode": {
|
|
editTemplate: "xed -- {{filename}}",
|
|
editAtLineTemplate: "xed --line {{line}} -- {{filename}}",
|
|
editAtLineAndWaitTemplate: "xed --line {{line}} --wait -- {{filename}}",
|
|
openDirInEditorTemplate: "xed -- {{dir}}",
|
|
editInTerminal: false,
|
|
},
|
|
}
|
|
|
|
// Some of our presets have a different name than the editor they are using.
|
|
editorToPreset := map[string]string{
|
|
"kak": "kakoune",
|
|
"hx": "helix",
|
|
"code": "vscode",
|
|
"subl": "sublime",
|
|
"xed": "xcode",
|
|
}
|
|
|
|
presetName := osConfig.EditPreset
|
|
if presetName == "" {
|
|
defaultEditor := guessDefaultEditor()
|
|
if presets[defaultEditor] != nil {
|
|
presetName = defaultEditor
|
|
} else if p := editorToPreset[defaultEditor]; p != "" {
|
|
presetName = p
|
|
}
|
|
}
|
|
|
|
if presetName == "" || presets[presetName] == nil {
|
|
presetName = "vim"
|
|
}
|
|
|
|
return presets[presetName]
|
|
}
|
|
|
|
func standardTerminalEditorPreset(editor string) *editPreset {
|
|
return &editPreset{
|
|
editTemplate: editor + " -- {{filename}}",
|
|
editAtLineTemplate: editor + " +{{line}} -- {{filename}}",
|
|
editAtLineAndWaitTemplate: editor + " +{{line}} -- {{filename}}",
|
|
openDirInEditorTemplate: editor + " -- {{dir}}",
|
|
editInTerminal: true,
|
|
}
|
|
}
|
|
|
|
func getEditInTerminal(osConfig *OSConfig, preset *editPreset) bool {
|
|
if osConfig.EditInTerminal != nil {
|
|
return *osConfig.EditInTerminal
|
|
}
|
|
return preset.editInTerminal
|
|
}
|