diff --git a/README.md b/README.md index c417755..16ef86d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ +

difi

Review and refine Git diffs before you push

@@ -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. @@ -41,11 +42,13 @@ go install github.com/oug-t/difi/cmd/difi@latest #### AUR (Arch Linux) **Binary (pre-built):** + ```bash pikaur -S difi-bin ``` **Build from source:** + ```bash pikaur -S difi ``` @@ -81,7 +84,27 @@ difi

(back to top)

-## Neovim Integration +## Integrations + +#### 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 +} +``` + +

+ Supports vim-fugitive +

+ +#### difi.nvim Get the ultimate review experience with **[difi.nvim](https://github.com/oug-t/difi.nvim)**. @@ -105,7 +128,9 @@ To use `difi` as a native git command (e.g., `git difi`), add it as an alias in ```bash git config --global alias.difi '!difi' ``` + Now you can run it directly from git: + ```bash git difi ``` @@ -121,6 +146,7 @@ go run cmd/difi/main.go ``` Contributions are especially welcome in: + - diff.nvim rendering edge cases - UI polish and accessibility - Windows support @@ -143,13 +169,3 @@ Contributions are especially welcome in: ---

Made with ❤️ by oug-t

- - - - - - - - - - diff --git a/internal/ui/model.go b/internal/ui/model.go index 2768bf0..acaeed1 100644 --- a/internal/ui/model.go +++ b/internal/ui/model.go @@ -3,6 +3,8 @@ package ui import ( "fmt" "math" + "os" + "os/exec" "regexp" "strconv" "strings" @@ -225,13 +227,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 != "" { @@ -246,7 +249,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": @@ -370,6 +373,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 @@ -578,7 +592,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(). @@ -661,8 +675,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) }