Тонкая настройка vim (делимся полезностями в .vimrc. Вопросы задавайте в отдельных темах!)
Модератор: /dev/random
-
- Сообщения: 283
- ОС: Slackware 12.2
Re: Тонкая настройка vim
Очень интересный и подробный конфиг.
http://konishchevdmitry.blogspot.com/2008/07/howto-vim.html
http://konishchevdmitry.blogspot.com/2008/07/howto-vim.html
Ich weiss, dass ich nichts weiss, aber wissen Sie es auch?
Завистники на что не взглянут,
подымут вечно лай,
А ты себе своей дорогою ступай,
Полают, да отстанут. Крылов
Завистники на что не взглянут,
подымут вечно лай,
А ты себе своей дорогою ступай,
Полают, да отстанут. Крылов
-
- Сообщения: 246
- ОС: Solaris, Debian, Ubuntu
Re: Тонкая настройка vim
mikluxo писал(а): ↑31.01.2009 18:25Очень интересный и подробный конфиг.
http://konishchevdmitry.blogspot.com/2008/07/howto-vim.html
Действительно очень полезные настройки, советы!

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

У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Сообщения: 132
- ОС: Slackware
Re: Тонкая настройка vim
Компиляция текущего исходника в объектник:
удивительное рядом - вот здесь и еще кой-чего нашлось
Код: Выделить всё
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
-
- Сообщения: 131
- ОС: Archlinux
Re: Тонкая настройка vim
спасибо за конфиг, буду разбираться.
Небольшая проблема, коменатрии на русском выглядят как крякозябы

не знаешь в чем модет быть проблема ?
ps os:offtopic
Archlinux <strike>ion3</strike>xmonad urxvt ncmpcpp emacs screen <strike>gajim</strike>qutim rtorrent
-
- Сообщения: 2579
-
- Сообщения: 30
- ОС: Debian
-
- Сообщения: 246
- ОС: Solaris, Debian, Ubuntu
Re: Тонкая настройка vim
dmeshr писал(а): ↑16.06.2009 19:26мой конфиг можно вытянуть на github
пользуйтесь и оставляйте свои предложения в http://github.com/yureg/vim-config/issues
Текстовая и графическая менюшки для кодировок понравились - слямзил себе.
-
- Сообщения: 2
Re: Тонкая настройка vim
стоят плагины
autocomplpop.vim
taglist_45
project-1.4.1
bufexplorer.zip
Marks Browser
SessionMgr
посоветуйте еще что нибудь ... программирую на с++
autocomplpop.vim
taglist_45
project-1.4.1
bufexplorer.zip
Marks Browser
SessionMgr
посоветуйте еще что нибудь ... программирую на с++
-
- Сообщения: 132
- ОС: Slackware
Re: Тонкая настройка vim
a.vim
supertab.vim
stlrefvim.vim
jptemplate.vim
slackware - linux for human brains
-
- Сообщения: 1030
- Статус: собирающий миры
- ОС: Debian
Re: Тонкая настройка vim
Прикольная штука: http://habrahabr.ru/blogs/vim/66819/ (Создание «умных» резервных копий редактируемых файлов).
Добавил себе в .vimrc
Код: Выделить всё
" включить сохранение резервных копий
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!
*offtopic* - ololo!
-
- Сообщения: 6
Re: Тонкая настройка vim
dmeshr писал(а): ↑16.06.2009 19:26мой конфиг можно вытянуть на github
пользуйтесь и оставляйте свои предложения в http://github.com/yureg/vim-config/issues
Это прекрасно, но зачем же комменты в .вимрц-е и коммиты на русском писать. Раз уж выкладываете в открытый доступ, то не забывайте, что нынче 21-ый век, и глобализация набирает темпы.
Это я к тому, что вашим конфигом могут заинтересоваться не только русскоговорящее население планеты. Мне, например, жутко неприятно, когда натыкаюсь на что-нибудь интересное, но на китайском.

-
- Сообщения: 246
- ОС: Solaris, Debian, Ubuntu
Re: Тонкая настройка vim
korey4ik писал(а): ↑24.08.2009 16:01dmeshr писал(а): ↑16.06.2009 19:26мой конфиг можно вытянуть на github
пользуйтесь и оставляйте свои предложения в http://github.com/yureg/vim-config/issues
Это прекрасно, но зачем же комменты в .вимрц-е и коммиты на русском писать. Раз уж выкладываете в открытый доступ, то не забывайте, что нынче 21-ый век, и глобализация набирает темпы.
Это я к тому, что вашим конфигом могут заинтересоваться не только русскоговорящее население планеты. Мне, например, жутко неприятно, когда натыкаюсь на что-нибудь интересное, но на китайском.
Разве знание vim'а предполагает знание английского языка?

PS: сам на англ комментарии пишу.
PPS: на случай китайского есть, например, translate.ru, translate.google.com.
-
- Сообщения: 132
- ОС: Slackware
Re: Тонкая настройка vim
очень хорошая и несложная книга: Hacking Vim
ну и вот, набросал недавно:
посмотреть svn annotate для текущего файла
ну и вот, набросал недавно:
посмотреть 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
-
- Сообщения: 355
- ОС: Gentoo
Re: Тонкая настройка vim
Обнаружил, что при «&filetype=="mail"» Vim имеет нехорошую привычку увеличивать
отступ, если строка оканчивается на запятую или в строке осталась открытая
и неэкранированная обратной косой чертой скобка. При наличии флага «a»
в «&formatoptions» этот отступ становиться неустранимым. Такое же поведение Vim
демонстрирует при «&filetype==""». Ни кто не знает, как с этим бороться. Команды
«set noautoindent» и «filetype indent off» не помогают.
UPD: Надо было писать «set noautoindent nosmartindent nocindent». Самая
неприятная опция --- последняя.
отступ, если строка оканчивается на запятую или в строке осталась открытая
и неэкранированная обратной косой чертой скобка. При наличии флага «a»
в «&formatoptions» этот отступ становиться неустранимым. Такое же поведение Vim
демонстрирует при «&filetype==""». Ни кто не знает, как с этим бороться. Команды
«set noautoindent» и «filetype indent off» не помогают.
UPD: Надо было писать «set noautoindent nosmartindent nocindent». Самая
неприятная опция --- последняя.
-
- Сообщения: 132
- ОС: основана на SlackWare
Re: Тонкая настройка vim
1. Установил эргономичную настраиваемую цветовую схему xterm16.
По ссылке вы можете посмотреть как это выглядит с разными настройками.
2. Вот такие строки для .vimrc:
Теперь при нажатии \n включается ночная расцветка, а при \d дневная.
Довольно удобно.
P.S. Это к моей давней теме про эргономичные и двуличные цветовые схемы :)
P.P.S. Выглядит это примерно так:
http://tvel.name/ru/img/Screenshot-129.png
http://tvel.name/ru/img/Screenshot-130.png
По ссылке вы можете посмотреть как это выглядит с разными настройками.
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
Время не ждет.
-
- Сообщения: 355
- ОС: Gentoo
Re: Тонкая настройка vim
Недавно набрёл на
http://vim.wikia.com/wiki/Perl_compatible_...lar_expressions, где был пример
использования «perl pie», который я, немного поковырявшись в справке, дополнил
до следующего варианта (его вы можете видеть в конце той страницы):
Прошу поковырять его на предмет незамеченных мною подлянок.
PS: мой профиль на linuxforum’е оказался на 19-ом месте в выдаче nigma по
запросу «vim pcre». Причём это было до написания данного сообщения.
UPD: Подводные камни всё же обнаружились. Новая команда:
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>
-
- Сообщения: 355
- ОС: Gentoo
Re: Тонкая настройка vim
Обнаружил, что я знаю как минимум три способа получить символ, начинающийся
с байта idx в Vim:
Первый годен только для однобайтовых строк, второй захватывает с собой
диакритику, третий нет (пр: я́ (\u044f\u0301): результаты «\xd1», «я́» и «я» для
первого, второго и третьего способов соответственно).
с байта idx в Vim:
- str[idx]
- matchstr(str, '.', idx)
- nr2char(char2nr(str[(idx):]))
Первый годен только для однобайтовых строк, второй захватывает с собой
диакритику, третий нет (пр: я́ (\u044f\u0301): результаты «\xd1», «я́» и «я» для
первого, второго и третьего способов соответственно).
-
- Администратор
- Сообщения: 5373
- ОС: Gentoo
Re: Тонкая настройка vim
i Уведомление от модератора /dev/random Начинаю потихоньку резать эту тему на отдельные топики. В будущем планируется сделать для вима отдельный подраздел, в этой теме же должны будут остаться только полезные советы.
Текущий статус: отделено 106 тем. Осталось обработать около 40% сообщений. Раздел создан.
-
- Сообщения: 428
- ОС: openSUSE 12.3
Re: Тонкая настройка vim
Может кто знает как в Vim привести код вида:
к виду:
Нажав при этом пару кнопок, >> не вариант, долго.
НАШЕЛ:
нужно набрать gg=G, по крайней мере для С++ сработало.
Код: Выделить всё
func()
{
if ()
{
smt;
}
else
{
smt;
}
}
к виду:
Код: Выделить всё
func()
{
if ()
{
smt;
}
else
{
smt;
}
}
Нажав при этом пару кнопок, >> не вариант, долго.
НАШЕЛ:
нужно набрать gg=G, по крайней мере для С++ сработало.
-
- Сообщения: 87
Re: Тонкая настройка vim
= делает реиндент, а далее как с остальными командами == для текущей строчки, при выделенном фрагменте = для реиндента выделения, соответственно =j для текущей и нижней строчки, gg=G - это gg переместить курсор на самый верх, = включить реиндент и G выполнить его до последней строчки.
-
- Сообщения: 355
- ОС: Gentoo
Re: Тонкая настройка vim
Написал скрипт для сохранения подсветки в каком угодно формате (разумеется, если вы напишете его описание), например для BBCode:
"{{{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
Код: Выделить всё
'<,'>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
Спасибо сказали:
-
- Сообщения: 2
Re: Тонкая настройка vim
Правильно ли я полагаю, что все эти if_ruby/if_perl/if_python дают очень мало возможностей?
-
- Сообщения: 355
- ОС: Gentoo
-
- Сообщения: 2
Re: Тонкая настройка vim
Говоря про if_ruby я конечно же имел в виду Vim-api

Я вот думаю начать потихоньку писать (по часику в день) vim-ruby-api ... примерно похожее я уже видел в каком-то скрипте. Конечно всё это сводится к тупому eval'у.
Но возможно создав такое апи - удастся привлечь новых людей в мир вима =)
-
- Сообщения: 355
- ОС: Gentoo
Re: Тонкая настройка vim
rbdev писал(а): ↑09.06.2010 01:48
Говоря про 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.
-
- Сообщения: 1445
- ОС: Debian Squeeze
Re: Тонкая настройка vim
Мой .gvimrc, написанный за три с половиной дня осиливания vim:
Установленные плагины - BufferExplorer, taglist, SessionMgr.
Ожидаю конструктивной критики. Извиняюсь за комментарии в стиле К.О.
PS. Комманда насчет меню синтаксис слизана с выхлопа GVim.
Код: Выделить всё
"Синтаксическая подсветка
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.
-
- Администратор
- Сообщения: 5373
- ОС: Gentoo
Re: Тонкая настройка vim
Способ переключить раскладку средствами 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()
-
- Сообщения: 59
- ОС: Ubuntu 12.04 LTS
Re: Тонкая настройка vim
Приветствую, хочу поделиться своими настройками, на мой взгляд почти дефолтный vim вполне хорош (или я просто привык), поэтому конфиг у меня небольшой,
кроме уже ставших дефолтными nocompatible, autoindent и т.п. добавлены небольшие фишки:
1. Проблема с кодировками у меня полностью решена этими строчками:
2. Иногда забываю какой режим включен, для этого использую такой сниппет:
3. Соответственно сама статусная строка, чтобы рисовалась сама и полезняшки всякие сообщала:
кроме уже ставших дефолтными 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

-
- Администратор
- Сообщения: 5373
- ОС: Gentoo
Re: Тонкая настройка vim
duduk писал(а): ↑06.03.2011 20:181. Проблема с кодировками у меня полностью решена этими строчками:
Код: Выделить всё
" так 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/'")