42

I have a file called .aliases for bash and zsh, I put this line

# vim: set filetype=bash: 

but if I make

: echo &ft

I get conf

2
  • I've tried everything here and nothing has worked. I've been using vim for 18 years. This is the first time I've failed to get modeline to work. Commented Feb 2, 2017 at 3:16
  • Figured it out. Answer below. superuser.com/a/1174296/3376 Commented Feb 2, 2017 at 4:12

10 Answers 10

51

That should work. I tried that line myself and it worked. I could be that your 'modeline' option got set to 'nomodeline'. Try executing this and see what you get.

:verbose set modeline?

That will tell you the value of the 'modeline' option and if not the default, where it was last set.

Some Linux distributions set 'nomodeline' in /etc/vimrc or /usr/share/vim/vimrc as a security measure, even though the security problems with 'modeline' have long been fixed.

4
  • modeline Last set from ~/.vimrc
    – juanpablo
    Commented Aug 16, 2011 at 5:06
  • for security, I change the modeline to add this to my ~/.vimrc au BufNewFile,BufRead .*aliases set filetype=sh
    – juanpablo
    Commented Aug 16, 2011 at 5:24
  • Not all of them have been long fixed. github.com/numirias/security/blob/master/doc/…
    – duckbrain
    Commented Jun 14, 2019 at 21:44
  • 2
    @duckbrain It is fundamentally impossible to guarantee that all security issues have ever been fixed so long as it is ever possible to include embedded instructions to be executed by the code looking at the data in the very data itself. This is why the documentation for Keith Bostic's nvi has always said of modelines that the option is UNimplemented and that it never will be. This is just like all the security bugs stemming from file-embedded commands or macro instructions to run in PDF, Word, Excel, &c&c&c.
    – tchrist
    Commented Jun 17, 2019 at 19:16
25

I describe a full debug checklist in this other answer.

I was REALLY stumped on this one because the documentation is not entirely true.

It turns out that in version 8 (and maybe earlier) you cannot use the word set in your modeline. The documentation describes "the second form" as being /* vim: set ai tw=75: */ but this does not work. You have to use "the first form" // vim: ai tw=75

Note: You can use either of those kinds of comment indicators. Or none at all.

6
  • This is not necessarily true for all vim installs. The form with set works fine for me on vim 8.0 (although not on 7.4). Also worth noting that with the second form // vim: ai tw=75, there cannot be any other characters at the end of the line, or vim will complain and ignore the modeline.
    – ash
    Commented Apr 12, 2017 at 15:56
  • This should be definitely reported as a bug (or as outdated documentations). I reproduced on VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48) Inklusive der Korrekturen: 1-1689 Extra-Patches: 8.0.0056 Verändert von [email protected] Übersetzt von [email protected] Riesige Version mit GTK2-GNOME GUI. (The last lines mean modified by ..., compiled by ..., huge version ...). Commented Sep 10, 2017 at 8:36
  • I tried to address it on the mailing list. They disagreed. Commented Sep 11, 2017 at 21:03
  • 1
    @BrunoBronosky do you have link to the mail thread? Would like to read their reasoning.
    – graywolf
    Commented Sep 15, 2017 at 12:37
  • Here is a link to the thread. groups.google.com/d/msg/vim_dev/aFh3X0etB7c/zl0Vi-MuFQAJ I didn't really take the time to understand their reasoning. Commented Oct 30, 2017 at 23:40
18

set modelines=1 (or any non-0 value) in my ~/.vimrc got it working for me.

3
  • 5
    This has no effect if modeline is not also set (which it is by default in Vim unless you're root)
    – kynan
    Commented Sep 5, 2013 at 12:10
  • Gentoo has a system-wide set nomodeline in /etc/vimrc due to all the vulnerabilities with modelines handling in vim.
    – MattBianco
    Commented May 23, 2014 at 13:43
  • In my case, I also had to set modelines to a non-zero value. The help says the default is 5, so that's what I set it to and that did the trick for me. The states that, If 'modeline' is on 'modelines' gives the number of lines that is checked for set commands. If 'modeline' is off or 'modelines' is zero no lines are checked.
    – Ben
    Commented Jun 10, 2016 at 15:59
12

in ~/.vimrc you need to set following:

set nocompatible 
filetype plugin on
set modeline 
1
  • Those lines work in Debian 9. Thank you!
    – caligari
    Commented Jun 14, 2018 at 7:13
8

Adding just the following to my ~/.vimrc worked for me on my Funtoo Linux box:

set modeline
1
  • 1
    Does not work in mac !
    – KRoy
    Commented Jan 5, 2018 at 14:59
4

Since this seems to come up in searches:

I had the same problem:

# vim: set filetype=sh:

didn't work, resulting in ft=conf as well. without the modeline in my ~/.bash_alias, ft is empty, so something changes.

while

# vim: filetype=sh:

worked. the last ":" presence seems to be irrelevant.

I'm on OSX with a Vim8 brewed version, for the records.

it's weird because from the modeline help both

[text]{white}{vi:|vim:|ex:}[white]{options}

and

[text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]

seem to be supported.

The output of

verbose set ft?

with "vim:filetype=sh" is

filetype=sh
      Last set from modeline

without modeline:

filetype=

with "vim:set filetype=sh"

filetype=conf
     Last set from /usr/local/Cellar/vim/8.0.1350/share/vim/vim80/filetype.vim

There might be a side effect somewhere in my conf, but the non compatible modeline syntax is the only one that works as expected for me.

3

/usr/share/vim/vim80/debian.vim from vim-common on Debian-based distros disables modeline by default.

" modelines have historically been a source of security/resource
" vulnerabilities -- disable by default, even when 'nocompatible' is set
set nomodeline

You have to enable modeline explicitly in your .vimrc or ~/.vim/vimrc file.

set modeline
6
  • Thanks, and it must be after set nocompatible if you use that. On Ubuntu 18.04 and vim version 8.0.1453
    – 244an
    Commented Mar 11, 2020 at 11:43
  • Should that be ~/.vim/.vimrc? Saving as ~/.vim/vimrc didn't work for me.
    – mrhd
    Commented Mar 12, 2020 at 19:44
  • @user727089 ~/.vimrc prioritize ~/vim/vimrc. The latter won't be used if the former is found first.
    – Simba
    Commented Mar 13, 2020 at 1:18
  • No, my question was specifically about the dot (.) in the file name. ~/.vim/.vimrc works, ~/.vim/vimrc does not.
    – mrhd
    Commented Mar 14, 2020 at 6:21
  • 2
    @user727089 No . is needed, at lease in vim 8. Referred from the help within vim 8 :help vimrc. Places for your personal initializations: Unix $HOME/.vimrc or $HOME/.vim/vimrc.
    – Simba
    Commented Mar 14, 2020 at 6:40
2

To make sure it works, set both options in your .vimrc file (and towards to bottom in case you have a more complicated .vimrc):

set modeline
set modelines=10

The 2nd option will control how many lines to check when searching for potential modeline lines. In case you need to use more than 10 such modeline lines, increase the value (10 in the example above)

And read also the NOTE in the documentation: :help modelines:

NOTE: 'modeline' is set to the Vi default value when 'compatible' is set and to the Vim default value when 'compatible' is reset.

Now depending how complicated .vimrc files one might have, changing the value of the compatible option (either directly or indirectly by certain plugins, could also influence the modeline behaviour.

But your file should listen now to such comment lines (here an example from my ~/.zshrc):

# vim: tabstop=2 shiftwidth=2 expandtab
2

Yup, even macOS, even as recent as Big Sur, still sets modelines=0 in the system-wide /usr/share/vim/vimrc. So you need to set modelines=1 in your ~/.vimrc to override this.

-1

Most probably that's due to modeline being disabled.

I work around that by:

  1. keeping it disabled generally to avoid any security issues.
  2. Installing securemodelines plugin.
  3. Whitelisting only the modelines I use.

In this case, the default whitelisted commands include filetype.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .