Skip to content

Conversation

@Kache
Copy link

@Kache Kache commented Nov 10, 2025

Fix polyglot ftdetect as fallback for native vim

Fix ftdetect for ft ext defined only by native vim, e.g.
*.jjdescription, *.http, *.mysql_history, & others

It seems vim-polyglot loads vim-filetype.vim then clobbers it by
"resetting" with au! filetypedetect afterwards, even though
vim-polyglot intends to be a fallback, according to comments in
init.vim

This is evidenced by *.jjdescription, *.http, and .mysql_history,
filetype extensions defined in vim-filetype.vim but not
polyglot-filetype.vim:

vim -c "set filetype?" -c 'sleep 2' -c 'q!' foo.jjdescription
vim -c "set filetype?" -c 'sleep 2' -c 'q!' foo.http
vim -c "set filetype?" -c 'sleep 2' -c 'q!' .mysql_history

Compare:

vim --clean -c "set filetype?" -c 'sleep 2' -c 'q!' foo.jjdescription
vim --clean -c "set filetype?" -c 'sleep 2' -c 'q!' foo.http
vim --clean -c "set filetype?" -c 'sleep 2' -c 'q!' .mysql_history

And:

vim -c "set filetype?" -c 'sleep 2' -c 'q!' foo.py
vim -c "set filetype?" -c 'sleep 2' -c 'q!' foo.bash
vim -c "set filetype?" -c 'sleep 2' -c 'q!' foo.js

Note although vim-polyglot does not define bash.vim nor
javascript.vim, polyglot-filetype.vim does define the *.bash and
*.js extensions, so they "still work"

I'm using vim --version and vim-plug:

VIM - Vi IMproved 9.1 (2024 Jan 02, compiled May 23 2025 00:48:59)
Included patches: 1-948, 950-1230, 1242, 1244

Tried to retain original intent to first load poly-filetype.vim then
vim-filetype.vim on top. Early workarounds:

  • disable vim-polyglot ftdetect let g:polyglot_disabled = ['ftdetect']
  • init.vim: comment out au! filetypedetect
  • init.vim: comment out Load user-defined... and Prevent filetype.vim... paragraphs

Unsure how to test "vim-filetype.vim loads first case", which seems
related to handling nvim and other package managers,
which I haven't done

My print debugging output below, indentations for clarity.

Before:

poly filetype.vim start
  init.vim start
    init.vim did_load_polyglot: false
    init.vim runtime! filetype.vim
      poly filetype.vim start
	init.vim init() no-op
      poly filetype.vim end
      vim filetype.vim start
	init.vim init() no-op
      vim filetype.vim end
    init.vim init() no-op
    init.vim did_load_filetypes: true
  init.vim end
  init.vim init() no-op
poly filetype.vim end
vim filetype.vim start
vim filetype.vim finish early
polyglot.vim start
  init.vim init() no-op
polyglot.vim finish

After:

poly filetype.vim start
  init.vim start
    init.vim did_load_polyglot: false
    init.vim did_load_filetypes: false
  init.vim end
  init.vim init() no-op
poly filetype.vim end
vim filetype.vim start
  init.vim init() no-op
vim filetype.vim end
polyglot.vim start
  init.vim init() no-op
polyglot.vim finish

Related: #706, #758, #756, #871, NoahTheDuke/vim-just#125
Fix: #877, #829, #845, #817

Fix ftdetect for ft ext defined only by native vim, e.g.
`*.jjdescription`, `*.http`, `*.mysql_history`, & others

It seems vim-polyglot loads vim-`filetype.vim` then clobbers it by
"resetting" with `au! filetypedetect` afterwards, even though
vim-polyglot intends to be a fallback, according to comments in
`init.vim`

This is evidenced by `*.jjdescription`, `*.http`, and `.mysql_history`,
filetype extensions defined in vim-`filetype.vim` but not
polyglot-`filetype.vim`:

    vim -c "set filetype?" -c 'sleep 2' -c 'q!' foo.jjdescription
    vim -c "set filetype?" -c 'sleep 2' -c 'q!' foo.http
    vim -c "set filetype?" -c 'sleep 2' -c 'q!' .mysql_history

Compare:

    vim --clean -c "set filetype?" -c 'sleep 2' -c 'q!' foo.jjdescription
    vim --clean -c "set filetype?" -c 'sleep 2' -c 'q!' foo.http
    vim --clean -c "set filetype?" -c 'sleep 2' -c 'q!' .mysql_history

And:

    vim -c "set filetype?" -c 'sleep 2' -c 'q!' foo.py
    vim -c "set filetype?" -c 'sleep 2' -c 'q!' foo.bash
    vim -c "set filetype?" -c 'sleep 2' -c 'q!' foo.js

Note although vim-polyglot does not define `bash.vim` nor
`javascript.vim`, polyglot-`filetype.vim` does define the `*.bash` and
`*.js` extensions, so they "still work"

I'm using `vim --version` and vim-plug:

    VIM - Vi IMproved 9.1 (2024 Jan 02, compiled May 23 2025 00:48:59)
    Included patches: 1-948, 950-1230, 1242, 1244

Tried to retain original intent to first load poly-`filetype.vim` then
vim-`filetype.vim` on top. Early workarounds:
 * disable vim-polyglot ftdetect `let g:polyglot_disabled = ['ftdetect']`
 * `init.vim`: comment out `au! filetypedetect`
 * `init.vim`: comment out `Load user-defined...` and `Prevent filetype.vim...` paragraphs

Unsure how to test "vim-`filetype.vim` loads first case", which seems
related to [handling nvim and other package managers](sheerun/issues/706#issuecomment-826067169),
which I haven't done

My print debugging output below, indentations for clarity.

Before:
```
poly filetype.vim start
  init.vim start
    init.vim did_load_polyglot: false
    init.vim runtime! filetype.vim
      poly filetype.vim start
	init.vim init() no-op
      poly filetype.vim end
      vim filetype.vim start
	init.vim init() no-op
      vim filetype.vim end
    init.vim init() no-op
    init.vim did_load_filetypes: true
  init.vim end
  init.vim init() no-op
poly filetype.vim end
vim filetype.vim start
vim filetype.vim finish early
polyglot.vim start
  init.vim init() no-op
polyglot.vim finish
```

After:
```
poly filetype.vim start
  init.vim start
    init.vim did_load_polyglot: false
    init.vim did_load_filetypes: false
  init.vim end
  init.vim init() no-op
poly filetype.vim end
vim filetype.vim start
  init.vim init() no-op
vim filetype.vim end
polyglot.vim start
  init.vim init() no-op
polyglot.vim finish
```

Related: sheerun#706, sheerun#758, sheerun#756, sheerun#871, NoahTheDuke/vim-just#125
Fix: sheerun#877, sheerun#829, sheerun#845, sheerun#817
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

vim-polyglot fails to init as a fallback, clobbering native vim ftdetect

1 participant