feat: add integration with vim-fugitive
This commit is contained in:
parent
c1db02c04e
commit
d67be9d25b
34
README.md
34
README.md
|
|
@ -1,4 +1,5 @@
|
|||
<a id="readme-top"></a>
|
||||
|
||||
<h1 align="center"><code>difi</code></h1>
|
||||
<p align="center"><em>Review and refine Git diffs before you push</em></p>
|
||||
|
||||
|
|
@ -14,7 +15,7 @@
|
|||
|
||||
## Why difi?
|
||||
|
||||
**git diff** shows changes. **difi** helps you *review* them.
|
||||
**git diff** shows changes. **difi** helps you _review_ them.
|
||||
|
||||
- ⚡️ **Instant** — Built in Go. Launches immediately with no daemon or indexing.
|
||||
- 🎨 **Structured** — A clean file tree and focused diffs for fast mental parsing.
|
||||
|
|
@ -71,7 +72,25 @@ difi
|
|||
|
||||
## Integrations
|
||||
|
||||
#### Neovim
|
||||
#### vim-fugitive
|
||||
|
||||
- **The "Unix philosophy" approach:** Uses the industry-standard Git wrapper to provide a robust, side-by-side editing experience.
|
||||
- **Side-by-Side Editing:** Instantly opens a vertical split (:Gvdiffsplit!) against the index.
|
||||
- **Merge Conflicts:** Automatically detects conflicts and opens a 3-way merge view for resolution.
|
||||
- **Config**: Add the line below to if using **lazy.nvim**.
|
||||
|
||||
```lua
|
||||
{
|
||||
"tpope/vim-fugitive",
|
||||
cmd = { "Gvdiffsplit", "Git" }, -- Add this line
|
||||
}
|
||||
```
|
||||
|
||||
<p align="left">
|
||||
<img src="https://img.shields.io/badge/Supports-vim--fugitive-4d4d4d?style=for-the-badge&logo=vim&logoColor=white" alt="Supports vim-fugitive" />
|
||||
</p>
|
||||
|
||||
#### difi.nvim
|
||||
|
||||
Get the ultimate review experience with **[difi.nvim](https://github.com/oug-t/difi.nvim)**.
|
||||
|
||||
|
|
@ -86,6 +105,8 @@ Get the ultimate review experience with **[difi.nvim](https://github.com/oug-t/d
|
|||
</a>
|
||||
</p>
|
||||
|
||||
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
||||
|
||||
## Contributing
|
||||
|
||||
```bash
|
||||
|
|
@ -95,6 +116,7 @@ go run cmd/difi/main.go
|
|||
```
|
||||
|
||||
Contributions are especially welcome in:
|
||||
|
||||
- diff.nvim rendering edge cases
|
||||
- UI polish and accessibility
|
||||
- Windows support
|
||||
|
|
@ -117,11 +139,3 @@ Contributions are especially welcome in:
|
|||
---
|
||||
|
||||
<p align="center"> Made with ❤️ by <a href="https://github.com/oug-t">oug-t</a> </p>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ package ui
|
|||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
"os/exec"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
|
@ -224,13 +226,14 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||
}
|
||||
}
|
||||
if m.selectedPath != "" {
|
||||
if i, ok := m.fileList.SelectedItem().(tree.TreeItem); ok && !i.IsDir {
|
||||
// proceed
|
||||
line := 0
|
||||
if m.focus == FocusDiff {
|
||||
line = git.CalculateFileLine(m.diffContent, m.diffCursor)
|
||||
} else {
|
||||
return m, nil
|
||||
line = git.CalculateFileLine(m.diffContent, 0)
|
||||
}
|
||||
return m, openFugitive(m.selectedPath, line)
|
||||
}
|
||||
fallthrough
|
||||
|
||||
case "e":
|
||||
if m.selectedPath != "" {
|
||||
|
|
@ -245,7 +248,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||
line = git.CalculateFileLine(m.diffContent, 0)
|
||||
}
|
||||
m.inputBuffer = ""
|
||||
return m, git.OpenEditorCmd(m.selectedPath, line, m.targetBranch)
|
||||
return m, openFugitive(m.selectedPath, line)
|
||||
}
|
||||
|
||||
case "z":
|
||||
|
|
@ -369,6 +372,17 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||
return m, tea.Batch(cmds...)
|
||||
}
|
||||
|
||||
func openFugitive(path string, line int) tea.Cmd {
|
||||
lineArg := fmt.Sprintf("+%d", line)
|
||||
c := exec.Command("nvim", lineArg, "-c", "Gvdiffsplit!", path)
|
||||
c.Stdin = os.Stdin
|
||||
c.Stdout = os.Stdout
|
||||
c.Stderr = os.Stderr
|
||||
return tea.ExecProcess(c, func(err error) tea.Msg {
|
||||
return git.EditorFinishedMsg{}
|
||||
})
|
||||
}
|
||||
|
||||
func (m *Model) centerDiffCursor() {
|
||||
halfScreen := m.diffViewport.Height / 2
|
||||
targetOffset := m.diffCursor - halfScreen
|
||||
|
|
@ -571,7 +585,7 @@ func (m Model) renderHelpDrawer() string {
|
|||
)
|
||||
col4 := lipgloss.JoinVertical(lipgloss.Left,
|
||||
HelpTextStyle.Render("H/M/L Move Cursor"),
|
||||
HelpTextStyle.Render("e Edit File"),
|
||||
HelpTextStyle.Render("e Edit File"),
|
||||
)
|
||||
|
||||
return HelpDrawerStyle.Copy().
|
||||
|
|
@ -654,8 +668,6 @@ func (m Model) renderEmptyState(w, h int, statusMsg string) string {
|
|||
guides,
|
||||
)
|
||||
|
||||
// Use lipgloss.Place to center the content in the available space
|
||||
// This automatically handles vertical and horizontal centering.
|
||||
return lipgloss.Place(w, h, lipgloss.Center, lipgloss.Center, content)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user