modeline tidak bekerja di vim

19

Saya memiliki file yang dipanggil .aliasesuntuk bash dan zsh, saya meletakkan baris ini

# vim: set filetype=bash: 

tetapi jika saya membuat

: echo &ft

saya mendapat conf

juanpablo
sumber
Saya sudah mencoba semuanya di sini dan tidak ada yang berhasil. Saya telah menggunakan vim selama 18 tahun. Ini adalah pertama kalinya saya gagal membuat modeline bekerja.
Bruno Bronosky
Menemukannya. Jawab di bawah. superuser.com/a/1174296/3376
Bruno Bronosky

Jawaban:

28

Itu seharusnya bekerja. Saya mencoba jalur itu sendiri dan berhasil. Saya bisa jadi pilihan 'modeline' Anda diatur ke 'nomodeline'. Coba jalankan ini dan lihat apa yang Anda dapatkan.

:verbose set modeline?

Itu akan memberi tahu Anda nilai opsi 'modeline' dan jika bukan default, di mana itu ditetapkan terakhir.

Beberapa distribusi Linux menetapkan 'nomodeline' di / etc / vimrc atau / usr / share / vim / vimrc sebagai langkah keamanan, meskipun masalah keamanan dengan 'modeline' telah lama diperbaiki.

garyjohn
sumber
modeline Set terakhir dari ~ / .vimrc
juanpablo
untuk keamanan, saya mengubah modeline untuk menambahkan ini ke ~ / .vimrc au BufNewFile, BufRead. * alias set filetype = sh
juanpablo
Tidak semua dari mereka telah lama diperbaiki. github.com/numirias/security/blob/master/doc/…
duckbrain
@duckbrain Pada dasarnya tidak mungkin untuk menjamin bahwa semua masalah keamanan telah diperbaiki selama masih mungkin untuk memasukkan instruksi yang tertanam untuk dieksekusi oleh kode yang melihat data dalam data itu sendiri. Inilah sebabnya mengapa dokumentasi untuk Keith Bostic's nvi selalu mengatakan modelinesbahwa opsi tersebut tidak diterapkan dan tidak akan pernah ada. Ini seperti semua bug keamanan yang berasal dari perintah yang tertanam file atau instruksi makro untuk dijalankan dalam PDF, Word, Excel, & c & c & c.
tchrist
14

Saya menggambarkan daftar periksa debug lengkap dalam jawaban lain ini .

Saya benar-benar bingung untuk yang satu ini karena dokumentasi ini tidak sepenuhnya benar.

Ternyata dalam versi 8 (dan mungkin sebelumnya) Anda tidak dapat menggunakan kata setdalam modeline Anda. Dokumentasi menggambarkan "bentuk kedua" sebagai /* vim: set ai tw=75: */tetapi ini tidak bekerja. Anda harus menggunakan "formulir pertama"// vim: ai tw=75

Catatan: Anda dapat menggunakan salah satu dari indikator komentar tersebut. Atau tidak sama sekali.

Bruno Bronosky
sumber
Ini belum tentu benar untuk semua pemasangan vim. Formulir dengan setberfungsi baik untuk saya pada vim 8.0 (walaupun tidak pada 7.4). Juga perlu dicatat bahwa dengan bentuk kedua // vim: ai tw=75, tidak mungkin ada karakter lain di akhir baris, atau vim akan mengeluh dan mengabaikan modeline.
Josh
Ini harus dilaporkan sebagai bug (atau sebagai dokumentasi yang sudah ketinggalan zaman). Saya mereproduksi pada 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. (Baris terakhir berarti dimodifikasi oleh ... , dikompilasi oleh ... , versi besar ... ).
LittleByBlue
Saya mencoba mengatasinya di milis. Mereka tidak setuju.
Bruno Bronosky
@BrunoBronosky apakah Anda memiliki tautan ke utas surat? Ingin membaca alasan mereka.
graywolf
Berikut ini tautan ke utas. groups.google.com/d/msg/vim_dev/aFh3X0etB7c/zl0Vi-MuFQAJ Saya tidak benar-benar meluangkan waktu untuk memahami alasan mereka.
Bruno Bronosky
11

set modelines=1 (atau nilai non-0) di my ~ / .vimrc membuatnya berfungsi untuk saya.

Asad R.
sumber
5
Ini tidak berpengaruh jika modelinetidak juga disetel (yang secara default di Vim kecuali Anda root)
kynan
Gentoo memiliki sistem-lebar set nomodelinedi /etc/vimrckarena semua kerentanan dengan modelines penanganan di vim.
MattBianco
Dalam kasus saya, saya juga harus mengatur modelineske nilai bukan nol. Bantuan mengatakan defaultnya adalah 5, jadi itulah yang saya atur dan itulah yang membantu saya. Menyatakan bahwa,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
9

di ~ / .vimrc Anda perlu mengatur yang berikut:

set nocompatible 
filetype plugin on
set modeline 
vahagn34
sumber
Garis-garis itu berfungsi di Debian 9. Terima kasih!
caligari
7

Menambahkan hanya berikut ini untuk saya yang ~/.vimrcbekerja untuk saya di kotak Funtoo Linux saya:

set modeline
scifisamurai
sumber
Tidak berfungsi di mac!
shuva
1

Karena ini tampaknya muncul dalam pencarian:

Saya memiliki masalah yang sama:

# vim: set filetype=sh:

tidak berfungsi, menghasilkan ft = conf juga. tanpa modeline di ~ / .bash_alias saya, ft kosong, jadi sesuatu berubah.

sementara

# vim: filetype=sh:

bekerja. kehadiran ":" terakhir tampaknya tidak relevan.

Saya menggunakan OSX dengan versi Vim8 yang diseduh, sebagai catatan.

ini aneh karena dari modeline membantu keduanya

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

dan

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

tampaknya didukung.

Output dari

verbose set ft?

dengan "vim: filetype = sh" is

filetype=sh
      Last set from modeline

tanpa modeline:

filetype=

dengan "vim: set filetype = sh"

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

Mungkin ada efek samping di conf saya, tetapi sintaks modeline yang tidak kompatibel adalah satu-satunya yang berfungsi seperti yang diharapkan untuk saya.

kalfa
sumber
1

/usr/share/vim/vim80/debian.vimdari vim-commonpada distro berbasis Debian menonaktifkan modelinesecara default.

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

Anda harus mengaktifkan modelinesecara eksplisit di file .vimrcatau Anda ~/.vim/vimrc.

set modeline
Simba
sumber
0

Kemungkinan besar itu karena modeline dinonaktifkan.

Saya mengatasinya dengan:

  1. menjaganya tetap dinonaktifkan untuk menghindari masalah keamanan.
  2. Menginstal plugin securemodelines .
  3. Daftar putih hanya modelines yang saya gunakan.

Dalam hal ini, perintah daftar putih default termasuk filetype.

manusia biasa
sumber