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

Aberta
#581 1 comentário 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
48/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Ativa
Stack de tecnologia
lua, neovim
Domínio
devtools

Direção de pesquisa

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.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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

Linguagem predominante
Lua
Estrelas
3.2k
Forks
223
Merge médio
6h 7min
PRs com merge (30d)
210

Preparar o ambiente

Abrir no Codespaces

Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.

  • Sem Dockerfile nem arquivo Docker Compose
  • Sem modelo de pull request
  • Sem guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de coder/claudecode.nvim

Todas as issues de coder/claudecode.nvim

Issues semelhantes

Mais issues de Lua

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.