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

Ouverte
#581 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
48/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
Active
Stack technique
lua, neovim
Domaine
devtools

Piste de recherche

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.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

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

Langage dominant
Lua
Étoiles
3.2k
Forks
223
Merge moyen
6 h 7 min
PR mergées (30 j)
210

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

  • Aucun Dockerfile ni fichier Docker Compose
  • Aucun modèle de pull request
  • Aucun guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de coder/claudecode.nvim

Toutes les issues de coder/claudecode.nvim

Issues similaires

Plus d'issues Lua

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.