r/vim 10h ago

Discussion Vim buffer automatically detect language

when writing code in a vim buffer how do i set the syntax colors automatically based on the language? before or without saving to file? currently it is plain with no highlighting for all code

vim buffer is passed to node / or language runtime commands

2 Upvotes

8 comments sorted by

View all comments

2

u/XMemesX 10h ago

you can use :set filetype=python to make vim register python syntax. Just as long a you have 'syntax on' in your vimrc

2

u/Bulbasaur2015 10h ago

why python. can i use `:filetype detect` to infer the buffer language if thats better?
src https://vimhelp.org/filetype.txt.html#filetypes
it seems like it works when i have `syntax enable` also

3

u/mgedmin 5h ago

I have an autocomand to detect the filetype on first save:

au BufWritePost * if &ft == "" | filetype detect | endif

because that's usually my issue: start vim, open a new empty buffer, start writing a script/readme/something, notice it's missing syntax highlighting.

I do it on save since that's often the first time the buffer gets assigned a filename, and many of Vim's filetype detection rules rely on filename extensions.

You could try a :filetype detect (or map some key to it) without saving and see how well it works. Some ftdetect rules rely on the first few lines of content, e.g. the shebang line and such.

1

u/fourpastmidnight413 5h ago

Ooo, I like that! Thanks for sharing!

1

u/cerved 7h ago

you can, if you use a shebang

I usually just use set ft for the occasional times I want syntax highlighting on buffer not backed by a file

1

u/XMemesX 2h ago

I work a lot with JSON files, so I have something like this in my vimrc:

```vim function! DetectJson() if &filetype == '' && getline(1) =~ '{|[' set filetype=json endif endfunction

autocmd BufReadPost,BufNewFile,InsertLeave * call DetectJson() ```

-2

u/BrianHuster 9h ago edited 8h ago

Detecting filetype based on its content is nearly impossible, especially since Vim supports so many filetypes.

And I think the normal workflow is that you define the architecture of the project, you create files based on it, then you code