diff: accepted text differs from :w in corner cases of 'fileformat' and 'fileformats'

Aperta
#581 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
48/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
lua, neovim
Ambito
devtools

Direzione di ricerca

Start with the diff acceptance code and the neovim_writes oracle in tests/integration/diff_accept_crlf_spec.lua. Compare proposal splitting and joining against readfile and :w for the listed fileformat and fileformats cases, including cases 4 and 5 whose scope still awaits a maintainer decision. Done means accepted text matches :w across the reported cases and the integration tests cover them.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

needs-triage

The text that a split-layout diff accepts can differ from what :w writes for the same buffer in some corner cases of 'fileformat' and 'fileformats'. Each case below exists on main before #577 too. #577 fixes the common cases (CRLF proposals under the default 'fileformats', and an unedited proposal under any 'fileformats') and leaves these for a follow-up.

  1. ff=mac with a CR inside a line: :w writes that CR as NL, the accepted text keeps it. "a\rb\n" then :setlocal ff=mac gives "a\rb\r", while :w gives "a\nb\r". main joined with LF, which is also wrong. Codex flagged this on #577 (diff.lua, "Translate embedded CR bytes before joining Mac lines").
  2. set ffs=unix,mac: Neovim reads, for example, "a\r\nb\r\r\n" as mac, but the diff never detects mac. In 24 ff=mac edit cases, main's answer equals a file-read oracle and #577's does not. Both differ from :w of the same buffer.
  3. Empty proposal, then typed lines: 'eol' stays off (#542), so Gox gives "\nx", while :w of an empty file gives "\nx\n".
  4. 'fileformats' starting with dos and a proposal with no LF ("", "a", "a\r"): Neovim reads it as dos, the diff keeps unix, so a typed line gets LF where :w writes CRLF.
  5. set ffs=dos (one entry): Neovim reads every file as dos, an LF file too. An LF or mixed proposal stays unix, so a typed line gets LF where :w of the file writes CRLF.

Fix direction: one function that decides 'fileformat' and splits the proposal the way readfile does (empty value: 'fileformat'; one entry: forced; several entries: dos unless a lone LF, mac when there are more CRs than LFs, the first entry when there is no LF), plus a join that translates CRs for mac. The neovim_writes oracle in tests/integration/diff_accept_crlf_spec.lua (#577) can be reused.

Evidence: a probe of 1860 cases per run on Neovim 0.12.3 and 0.8.0, under 'fileformats' unix,dos, dos,unix, unix, dos and unix,mac. Mismatches with :w left on #577 (on main): 144 (748), 184 (788), 192 (304), 516 (1104), 544 (608).

The maintainer agreed to defer items 1 and 3 (and item 2, which belongs to item 1) from the README verification run. Items 4 and 5, and item 6 in the comment below, were found later and still wait for the maintainer's decision: fix them in this run or defer them here.


Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: high

Lingua principale
Lua
Stelle
3.2k
Fork
223
Merge medio
6h 7m
PR unite (30g)
210

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

  • Nessun Dockerfile né file Docker Compose
  • Nessun modello di pull request
  • Nessuna guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di coder/claudecode.nvim

Tutte le issue di coder/claudecode.nvim

Issue simili

Altre issue su Lua

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.