Тонкая настройка vim (делимся полезностями в .vimrc. Вопросы задавайте в отдельных темах!)

и другие vi-подобные редакторы

Модератор: /dev/random

mikluxo
Сообщения: 283
ОС: Slackware 12.2

Re: Тонкая настройка vim

Сообщение mikluxo » 31.01.2009 18:25

Очень интересный и подробный конфиг.
http://konishchevdmitry.blogspot.com/2008/07/howto-vim.html
Ich weiss, dass ich nichts weiss, aber wissen Sie es auch?
Завистники на что не взглянут,
подымут вечно лай,
А ты себе своей дорогою ступай,
Полают, да отстанут. Крылов
Спасибо сказали:

Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: Тонкая настройка vim

Сообщение Luinnar » 02.02.2009 16:40

mikluxo писал(а):
31.01.2009 18:25
Очень интересный и подробный конфиг.
http://konishchevdmitry.blogspot.com/2008/07/howto-vim.html

Действительно очень полезные настройки, советы! :) Спасибо!
Спасибо сказали:

Skip
Сообщения: 30
ОС: Debian

Re: Тонкая настройка vim

Сообщение Skip » 25.02.2009 11:58

Вот мои vimrc, gvimrc, модифицированные плагины vimcu, цветовые схемы pyte, elflord.
Программирую на С в gvim. Использую 7-ю ветку.
Так же использую vim для работы с различными текстовыми файлами.
Буду рад, если мои настройки окажутся кому-нибудь полезны :)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:

Аватара пользователя
nonstop
Сообщения: 132
ОС: Slackware

Re: Тонкая настройка vim

Сообщение nonstop » 26.02.2009 09:57

Компиляция текущего исходника в объектник:

Код: Выделить всё

function Make()
    let curr_dir = expand("%:h")
    if (curr_dir == "")
        let curr_dir = "."
    endif
    echo curr_dir
    exec 'lcd ' . curr_dir
    exec 'make %:r.o'
    exec 'lcd -'
endfun

" save & make current file.o
imap <F7> <Esc>:w<CR>:call Make()<CR>
nmap <F7> :w<CR>:call Make()<CR>

удивительное рядом - вот здесь и еще кой-чего нашлось
slackware - linux for human brains
Спасибо сказали:

Аватара пользователя
Kain666
Сообщения: 131
ОС: Archlinux

Re: Тонкая настройка vim

Сообщение Kain666 » 05.03.2009 02:25

Skip писал(а):
25.02.2009 11:58
Вот мои vimrc, gvimrc, модифицированные плагины vimcu, цветовые схемы pyte, elflord.
Программирую на С в gvim. Использую 7-ю ветку.
Так же использую vim для работы с различными текстовыми файлами.
Буду рад, если мои настройки окажутся кому-нибудь полезны :)

спасибо за конфиг, буду разбираться.
Небольшая проблема, коменатрии на русском выглядят как крякозябы :(
не знаешь в чем модет быть проблема ?
ps os:offtopic
Archlinux <strike>ion3</strike>xmonad urxvt ncmpcpp emacs screen <strike>gajim</strike>qutim rtorrent
Спасибо сказали:

Flaming
Сообщения: 2579

Re: Тонкая настройка vim

Сообщение Flaming » 05.03.2009 17:17

Kain666 писал(а):
05.03.2009 02:25
Небольшая проблема, коменатрии на русском выглядят как крякозябы sad.gif

Может быть неправильно кодировка определяется? Попробуй открывать в виде :e ++enc=<кодировка> file.txt
Спасибо сказали:

Skip
Сообщения: 30
ОС: Debian

Re: Тонкая настройка vim

Сообщение Skip » 05.03.2009 21:54

Kain666 писал(а):
05.03.2009 02:25
спасибо за конфиг, буду разбираться.
Небольшая проблема, коменатрии на русском выглядят как крякозябы :(
не знаешь в чем модет быть проблема ?
ps os:offtopic

Скорее всего потому, что у меня кодировка koi8-r, попробуй её :)
Спасибо сказали:

Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: Тонкая настройка vim

Сообщение Luinnar » 24.06.2009 18:07

dmeshr писал(а):
16.06.2009 19:26
мой конфиг можно вытянуть на github
пользуйтесь и оставляйте свои предложения в http://github.com/yureg/vim-config/issues

Текстовая и графическая менюшки для кодировок понравились - слямзил себе.
Спасибо сказали:

lin07
Сообщения: 2

Re: Тонкая настройка vim

Сообщение lin07 » 01.07.2009 14:28

стоят плагины

autocomplpop.vim
taglist_45
project-1.4.1
bufexplorer.zip
Marks Browser
SessionMgr


посоветуйте еще что нибудь ... программирую на с++
Спасибо сказали:

Аватара пользователя
nonstop
Сообщения: 132
ОС: Slackware

Re: Тонкая настройка vim

Сообщение nonstop » 02.07.2009 11:20

lin07 писал(а):
01.07.2009 14:28
стоят плагины

autocomplpop.vim
taglist_45
project-1.4.1
bufexplorer.zip
Marks Browser
SessionMgr


посоветуйте еще что нибудь ... программирую на с++

a.vim
supertab.vim
stlrefvim.vim
jptemplate.vim
slackware - linux for human brains
Спасибо сказали:

Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Тонкая настройка vim

Сообщение xorader » 13.08.2009 14:42

Прикольная штука: http://habrahabr.ru/blogs/vim/66819/ (Создание «умных» резервных копий редактируемых файлов).

Код: Выделить всё

" включить сохранение резервных копий
set backup

" сохранять умные резервные копии ежедневно
function! BackupDir()
    " определим каталог для сохранения резервной копии
    let l:backupdir=$HOME.'/.vim/backup/'.
            \substitute(expand('%:p:h'), '^'.$HOME, '~', '')

    " если каталог не существует, создадим его рекурсивно
    if !isdirectory(l:backupdir)
        call mkdir(l:backupdir, 'p', 0700)
    endif

    " переопределим каталог для резервных копий
    let &backupdir=l:backupdir

    " переопределим расширение файла резервной копии
    let &backupext=strftime('~%Y-%m-%d~')
endfunction

" выполним перед записью буффера на диск
autocmd! bufwritepre * call BackupDir()


Добавил себе в .vimrc
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали:

korey4ik
Сообщения: 6

Re: Тонкая настройка vim

Сообщение korey4ik » 24.08.2009 16:01

dmeshr писал(а):
16.06.2009 19:26
мой конфиг можно вытянуть на github
пользуйтесь и оставляйте свои предложения в http://github.com/yureg/vim-config/issues


Это прекрасно, но зачем же комменты в .вимрц-е и коммиты на русском писать. Раз уж выкладываете в открытый доступ, то не забывайте, что нынче 21-ый век, и глобализация набирает темпы.
Это я к тому, что вашим конфигом могут заинтересоваться не только русскоговорящее население планеты. Мне, например, жутко неприятно, когда натыкаюсь на что-нибудь интересное, но на китайском. :cray:
Спасибо сказали:

Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: Тонкая настройка vim

Сообщение Luinnar » 25.08.2009 14:18

korey4ik писал(а):
24.08.2009 16:01
dmeshr писал(а):
16.06.2009 19:26
мой конфиг можно вытянуть на github
пользуйтесь и оставляйте свои предложения в http://github.com/yureg/vim-config/issues


Это прекрасно, но зачем же комменты в .вимрц-е и коммиты на русском писать. Раз уж выкладываете в открытый доступ, то не забывайте, что нынче 21-ый век, и глобализация набирает темпы.
Это я к тому, что вашим конфигом могут заинтересоваться не только русскоговорящее население планеты. Мне, например, жутко неприятно, когда натыкаюсь на что-нибудь интересное, но на китайском. :cray:

Разве знание vim'а предполагает знание английского языка? :)
PS: сам на англ комментарии пишу.
PPS: на случай китайского есть, например, translate.ru, translate.google.com.
Спасибо сказали:

Аватара пользователя
nonstop
Сообщения: 132
ОС: Slackware

Re: Тонкая настройка vim

Сообщение nonstop » 27.08.2009 10:25

очень хорошая и несложная книга: Hacking Vim

ну и вот, набросал недавно:
посмотреть svn annotate для текущего файла

Код: Выделить всё

function! s:svn_annotate()
    let lineNum = line('.')
    execute '1,$!svn ann %'
    execute "normal ".lineNum."gg"
endfun
command! -nargs=0 SvnAnn call s:svn_annotate()
slackware - linux for human brains
Спасибо сказали:

Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Тонкая настройка vim

Сообщение ZyX » 05.10.2009 18:31

Обнаружил, что при «&filetype=="mail"» Vim имеет нехорошую привычку увеличивать
отступ, если строка оканчивается на запятую или в строке осталась открытая
и неэкранированная обратной косой чертой скобка. При наличии флага «a»
в «&formatoptions» этот отступ становиться неустранимым. Такое же поведение Vim
демонстрирует при «&filetype==""». Ни кто не знает, как с этим бороться. Команды
«set noautoindent» и «filetype indent off» не помогают.

UPD: Надо было писать «set noautoindent nosmartindent nocindent». Самая
неприятная опция --- последняя.
Спасибо сказали:

Аватара пользователя
ТВЭЛ
Сообщения: 132
ОС: основана на SlackWare

Re: Тонкая настройка vim

Сообщение ТВЭЛ » 13.11.2009 21:12

1. Установил эргономичную настраиваемую цветовую схему xterm16.
По ссылке вы можете посмотреть как это выглядит с разными настройками.

2. Вот такие строки для .vimrc:

Код: Выделить всё

" Дневная расцветка
map <silent><leader>d :let xterm16_colormap = 'softlight'<cr>:let xterm16_brightnes = 'default'<cr>:colorscheme xterm16<cr>

" Для работы ночью
map <silent><leader>n :let xterm16_colormap = 'allblue'<cr>:let xterm16_brightnes = 'med'<cr>:colorscheme xterm16<cr>


Теперь при нажатии \n включается ночная расцветка, а при \d дневная.
Довольно удобно.

P.S. Это к моей давней теме про эргономичные и двуличные цветовые схемы :)

P.P.S. Выглядит это примерно так:
http://tvel.name/ru/img/Screenshot-129.png
http://tvel.name/ru/img/Screenshot-130.png
Время не ждет.
Спасибо сказали:

Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Тонкая настройка vim

Сообщение ZyX » 16.12.2009 06:51

Недавно набрёл на
http://vim.wikia.com/wiki/Perl_compatible_...lar_expressions, где был пример
использования «perl pie», который я, немного поковырявшись в справке, дополнил
до следующего варианта (его вы можете видеть в конце той страницы):

Код: Выделить всё

:command -range=% -nargs=+ S <line1>,<line2>!perl -pi -e "use encoding 'utf8'; "s<q-args> 2>/dev/null
" Example usage:
:S(<regex>)[<replacement>]<flags>

Прошу поковырять его на предмет незамеченных мною подлянок.

PS: мой профиль на linuxforum’е оказался на 19-ом месте в выдаче nigma по
запросу «vim pcre». Причём это было до написания данного сообщения.

UPD: Подводные камни всё же обнаружились. Новая команда:

Код: Выделить всё

function s:Substitute(sstring, line1, line2)
    execute a:line1.",".a:line2."!perl -pi -e 'use encoding \"utf8\"; s'".
                \escape(shellescape(a:sstring), '%!').
                \" 2>/dev/null"
endfunction
command -range=% -nargs=+ S call s:Substitute(<q-args>, <line1>, <line2>)
" Example usage:
S(<regex>)[<replacement>]<flags>
Спасибо сказали:

Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Тонкая настройка vim

Сообщение ZyX » 13.02.2010 06:58

Обнаружил, что я знаю как минимум три способа получить символ, начинающийся
с байта idx в Vim:

  • str[idx]
  • matchstr(str, '.', idx)
  • nr2char(char2nr(str[(idx):]))


Первый годен только для однобайтовых строк, второй захватывает с собой
диакритику, третий нет (пр: я́ (\u044f\u0301): результаты «\xd1», «я́» и «я» для
первого, второго и третьего способов соответственно).
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4839
ОС: Gentoo

Re: Тонкая настройка vim

Сообщение /dev/random » 13.03.2010 21:33

iУведомление от модератора /dev/random
Начинаю потихоньку резать эту тему на отдельные топики. В будущем планируется сделать для вима отдельный подраздел, в этой теме же должны будут остаться только полезные советы.

Текущий статус: отделено 106 тем. Осталось обработать около 40% сообщений. Раздел создан.
Спасибо сказали:

Warlornhor
Сообщения: 428
ОС: openSUSE 12.3

Re: Тонкая настройка vim

Сообщение Warlornhor » 21.05.2010 17:52

Может кто знает как в Vim привести код вида:

Код: Выделить всё

func()
{
if ()
{
smt;
}
else
{
smt;
}
}

к виду:

Код: Выделить всё

func()
{
  if ()
  {
    smt;
  }
  else
  {
    smt;
  }
}

Нажав при этом пару кнопок, >> не вариант, долго.

НАШЕЛ:
нужно набрать gg=G, по крайней мере для С++ сработало.
Спасибо сказали:

smeea
Сообщения: 87

Re: Тонкая настройка vim

Сообщение smeea » 22.05.2010 03:05

= делает реиндент, а далее как с остальными командами == для текущей строчки, при выделенном фрагменте = для реиндента выделения, соответственно =j для текущей и нижней строчки, gg=G - это gg переместить курсор на самый верх, = включить реиндент и G выполнить его до последней строчки.
Спасибо сказали:

Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Тонкая настройка vim

Сообщение ZyX » 06.06.2010 23:10

Написал скрипт для сохранения подсветки в каком угодно формате (разумеется, если вы напишете его описание), например для BBCode:

Код: Выделить всё

'<,'>FormatCommand format bbcode_unixforum_nonr


"{{{1 Защита от множественных загрузок-
if exists("b:dollarHOMEslashdotvimrcFileLoaded")
    finish
endif
let b:dollarHOMEslashdotvimrcFileLoaded=1
" set t_Co=8
" set t_Sf=^[[3%p1%dm
" set t_Sb=^[[4%p1%dm
"{{{1 Options-
"{{{2 set-
set nocompatible
set background=dark
set display+=lastline
"set iminsert=0
"set imsearch=0
set grepprg=grep\ -nH\ $*
set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4
set backspace=indent,eol,start
set autoindent
set nosmartindent
set backup
set conskey
set bioskey
set browsedir=buffer
" bomb may work bad
set nobomb
exe "set backupdir=".$HOME."/.vimbackup,."
set backupext=~
set history=32
set ruler
set showcmd
set hlsearch
set incsearch
set nocindent
set textwidth=80
set complete=.,i,d,t,w,b,u,k
" set conskey
set noconfirm
set cscopetag
set cscopetagorder=1
" set copyindent
" !may be not safe
set exrc
set secure
" set foldclose
set noswapfile
" set swapsync=sync
set fsync
set guicursor="a:block-blinkoff0"
set autowriteall
set hidden
set nojoinspaces
set nostartofline
" set virtualedit+=onemore
set lazyredraw
set visualbell
set makeef=make.##.err.log
set modelines=16
set more
set virtualedit+=block
set winaltkeys=no
set fileencodings=utf-8,cp1251,koi8-r,default
set encoding=utf-8
set list
set listchars=tab:>-,trail:-,nbsp:_
set magic
set pastetoggle=<F1>
set foldmethod=marker
set wildmenu
set wildcharm=<Tab>
set formatoptions=arcoqn12w
"set formatoptions+=t
set scrolloff=2


Адрес на vim.org: http://www.vim.org/scripts/script.php?script_id=3113
Там же теперь и мой скрипт для транслитерации: http://www.vim.org/scripts/script.php?script_id=3056
Спасибо сказали:

rbdev
Сообщения: 2

Re: Тонкая настройка vim

Сообщение rbdev » 08.06.2010 12:23

Правильно ли я полагаю, что все эти if_ruby/if_perl/if_python дают очень мало возможностей?
Спасибо сказали:

Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Тонкая настройка vim

Сообщение ZyX » 08.06.2010 16:57

rbdev писал(а):
08.06.2010 12:23
Правильно ли я полагаю, что все эти if_ruby/if_perl/if_python дают очень мало возможностей?

С +ruby и +perl не работал, но +python весьма полезен: многие вещи на python работают быстрее. Вот только в API очень мало возможностей, это да, но не в самих языках.
Спасибо сказали:

rbdev
Сообщения: 2

Re: Тонкая настройка vim

Сообщение rbdev » 09.06.2010 01:48

ZyX писал(а):
08.06.2010 16:57
rbdev писал(а):
08.06.2010 12:23
Правильно ли я полагаю, что все эти if_ruby/if_perl/if_python дают очень мало возможностей?

С +ruby и +perl не работал, но +python весьма полезен: многие вещи на python работают быстрее. Вот только в API очень мало возможностей, это да, но не в самих языках.


Говоря про if_ruby я конечно же имел в виду Vim-api :) я большой фанат руби и прекрасно вижу разницу между руби и vimscpit-ом.
Я вот думаю начать потихоньку писать (по часику в день) vim-ruby-api ... примерно похожее я уже видел в каком-то скрипте. Конечно всё это сводится к тупому eval'у.
Но возможно создав такое апи - удастся привлечь новых людей в мир вима =)
Спасибо сказали:

Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Тонкая настройка vim

Сообщение ZyX » 09.06.2010 08:15

rbdev писал(а):
09.06.2010 01:48
ZyX писал(а):
08.06.2010 16:57
rbdev писал(а):
08.06.2010 12:23
Правильно ли я полагаю, что все эти if_ruby/if_perl/if_python дают очень мало возможностей?

С +ruby и +perl не работал, но +python весьма полезен: многие вещи на python работают быстрее. Вот только в API очень мало возможностей, это да, но не в самих языках.


Говоря про if_ruby я конечно же имел в виду Vim-api :) я большой фанат руби и прекрасно вижу разницу между руби и vimscpit-ом.
Я вот думаю начать потихоньку писать (по часику в день) vim-ruby-api ... примерно похожее я уже видел в каком-то скрипте. Конечно всё это сводится к тупому eval'у.
Но возможно создав такое апи - удастся привлечь новых людей в мир вима =)

Я видел такое API для python: http://www.vim.org/scripts/script.php?script_id=840, правда оно имеет два недостатка: давно не обновлялось, в отличие от python, а также поставляющаяся с ним справка не даёт нормально пользоваться справкой, поставляющейся с Vim: большинство имён функций совпадают с именами из eval.txt.
Спасибо сказали:

Аватара пользователя
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Тонкая настройка vim

Сообщение frp » 19.10.2010 22:08

Мой .gvimrc, написанный за три с половиной дня осиливания vim:

Код: Выделить всё

"Синтаксическая подсветка
syn on
"Нумерация строк
set nu
"Ширина табов
set shiftwidth=4
set tabstop=4
"Меню "Синтаксис"
let do_syntax_sel_menu = 1|runtime! synmenu.vim|aunmenu &Syntax.&Show\ filetypes\ in\ menu
"Отсутпы C
set cin
"Выделять совпадения при поиске
set hlsearch
"F5 -> сборка
nmap <F5> :wa<CR>:make<CR>:cope<CR>
imap <F5> <ESC>:wa<CR>:make<CR>i
"Ctrl-A - шаблон acmp
imap <C-A> #include <fstream><CR>using namespace std;<CR><CR>int main()<CR>{<CR>ifstream in("input.txt");<CR>in.close();<CR>ofstream out("output.txt");<CR>out.close();<CR>}<CR>
nmap <C-A> i#include <fstream><CR>using namespace std;<CR><CR>int main()<CR>{<CR>ifstream in("input.txt");<CR>in.close();<CR>ofstream out("output.txt");<CR>out.close();<CR>}<CR><Esc>
"Зарузить сессию acmp
SessionOpen acmp
"F3 -> BufferExplorer
nmap <F3> \be
imap <F3> <ESC>\be
"Ctrl-Left, Ctrl-Right, Ctrl-Up, Ctrl-Down - переключение окон
nmap <C-Right> <C-W><Right>
nmap <C-Left> <C-W><Left>
nmap <C-Up> <C-W><Up>
nmap <C-Down> <C-W><Down>
"Открывать taglist по F2
nmap <F2> :TlistToggle<CR>
imap <F2> <ESC>:TlistToggle<CR>

Установленные плагины - BufferExplorer, taglist, SessionMgr.
Ожидаю конструктивной критики. Извиняюсь за комментарии в стиле К.О.

PS. Комманда насчет меню синтаксис слизана с выхлопа GVim.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4839
ОС: Gentoo

Re: Тонкая настройка vim

Сообщение /dev/random » 15.02.2011 21:36

Способ переключить раскладку средствами vim (iminsert) после нажатия 'r' (замена одного символа), но перед вводом последующего символа. Обычно вим не позволяет переключить в этот момент раскладку.
ZyX писал(а):
14.02.2011 23:05
... Использовать getchar() и maparg() (я не знаю, почему, но если просто трогать iminsert, то ничего не работает. Скорее всего, после r идёт что-то более сложное, чем getchar() и, соответственно, символ превращается во что-то другое до попадания оператору.):

(Created by format.vim)

function! Replace() let char=getchar() if type(char)==type(0) let char=nr2char(char) endif if char==#"\<C-^>" let &iminsert=!&iminsert return Replace() endif if &iminsert && !empty(maparg(char, 'l')) let char=maparg(char, 'l') endif return 's'.repeat(char, v:count1)."\e" endfunction nnoremap <expr> r Replace()


Спасибо сказали:

Аватара пользователя
duduk
Сообщения: 59
ОС: Ubuntu 12.04 LTS

Re: Тонкая настройка vim

Сообщение duduk » 06.03.2011 20:18

Приветствую, хочу поделиться своими настройками, на мой взгляд почти дефолтный vim вполне хорош (или я просто привык), поэтому конфиг у меня небольшой,
кроме уже ставших дефолтными nocompatible, autoindent и т.п. добавлены небольшие фишки:

1. Проблема с кодировками у меня полностью решена этими строчками:

Код: Выделить всё

" так vim кодировку файла определяет автоматом и отображает ее в вашей локали (encoding)
set fileencodings=utf-8,cp1251,koi8-r,cp866
set encoding=utf-8


2. Иногда забываю какой режим включен, для этого использую такой сниппет:

Код: Выделить всё

" цвет статусной строки меняется в зависимости от режима
au InsertEnter * hi StatusLine term=reverse ctermfg=5 ctermbg=0 gui=undercurl guisp=Magenta
au InsertLeave * hi StatusLine term=reverse ctermfg=0 ctermbg=7 gui=bold,reverse
au VimEnter * hi StatusLine term=reverse ctermfg=0 ctermbg=7 gui=bold,reverse


3. Соответственно сама статусная строка, чтобы рисовалась сама и полезняшки всякие сообщала:

Код: Выделить всё

set laststatus=2
set statusline=%<%f%h%m%r%=format=%{&fileformat}\ file=%{&fileencoding}\ enc=%{&encoding}\ %b\ 0x%B\ %l,%c%V\ %P


:drinks:
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4839
ОС: Gentoo

Re: Тонкая настройка vim

Сообщение /dev/random » 07.03.2011 01:30

duduk писал(а):
06.03.2011 20:18
1. Проблема с кодировками у меня полностью решена этими строчками:

Код: Выделить всё

" так vim кодировку файла определяет автоматом и отображает ее в вашей локали (encoding)
set fileencodings=utf-8,cp1251,koi8-r,cp866
set encoding=utf-8

Заблуждаетесь. Так он распознает только utf-8 и cp1251, а все остальные будет считать cp1251.
Поясню. Vim при открытии файла проходит по этому списку и проверяет, не содержит ли файл последовательности байтов, запрещённой в этой кодировке. Если содержит, пробует следующую, если нет, останавливается и считает, что распознал. Так вот, кодировки cp1251, koi8-r и cp866 могут содержать _любые_ последовательности байтов, на первой же из них вим останавливается _всегда_.

Способ, позволяющий распознавать любые русскоязычные кодировки, уже приводился в этой теме. Повторю его.
Нужно установить пакет enca (программа для распознавания кодировки) и вместо строки "set fileencoding..." вписать следующую:

Код: Выделить всё

autocmd BufReadPre * exec "set fileencodings=ucs-bom,utf8,".system("enca -i '".expand("%")."' | sed 's/?\\+/koi8r/'")

Что это означает: в тот момент, когда будет открыт какой-нибудь файл, выполнить шелл-команду "enca -i имяфайла | sed 's/?\+/koi8r/'", её вывод подставить в строку "set fileencodings=ucs-bom,utf8,вывод_команды" и выполнить это как команду вим.

Смысл шелл-команды: командой enca распознать кодировку; если это не удастся (команда enca выдаст набор вопросительных знаков), подставить вместо неё koi8r (можете заменить на другую, по вашему усмотрению).

Смысл вим-команды (set fileencodings...): вначале проверить, не является ли кодировка UCS2/UCS4 с BOM (BOM - маркер в начале файла, позволяющий однозначно распознать юникодовую кодировку). Если является, то её и использовать. Если не является, то проверить, не содержит ли файл последовательностей байтов, запрещённых в utf8. Если нет, то использовать utf8. Если содержит, то использовать кодировку, распознанную enca.

Update:

Код: Выделить всё

autocmd BufReadPre * exec "set fileencodings=ucs-bom,utf8,".system("enca -i '".substitute(expand("%"),"'","'\\\\''","g")."' | sed 's/?\\+/koi8r/'")
- чтобы не было проблем с апострофами в имени файла.
Спасибо сказали: