VIM в качестве IDE
Салом КулХацкер!
VIM в качестве IDE, изображение №1
В самом начале пути девелопера, осознавшего что все это время он жил неправильно пока не начал использовать VIM, подстерегают страшные вещи. Одна из них - первичная настройка VIM в качестве IDE. Вооружившись клавой он заходит в гугл - и там ему советуют поставить, значит NerdTree чтобы православно переключаться между файлами - и cscope, чтобы иметь возможность использовать все эти автодополнения кода.
Но тут возникает вопрос. Я же не все время сижу и нашлепываю что-то на C++. Иногда мне надо и html нашлепать и python тоже, и вообще таксказать latex я тоже юзаю. Как жить дальше ?
Сегодня меня наконец достали этим вопросом и я так подумал-подумал и нашлепал вот такой краткий ликбез.
1) Vim на самом деле умеет замечательно распознавать типы файлов. Он магическим образом узнает где тут html а где latex (ну не таким уж и магическим - но не важно). А еще у него есть такая замечательная возможность: использовать для разных файлов свой конфиг.
Для этого, внутри директории с настройками (для Linux это ~/.vim) необходимо создать путь after/ftplugin. Внутри ftplugin можно создавать такие конфиги. Имя этого конфига должно совпадать с типом файла, для которого он предназначен и расширением .vim. Так, для просмотра манов - это man.vim, для Си - это c.vim, LaTex - tex.vim, ассемблер - asm.vim и.т.д.
Вот внутри этих файлов совершенно не напрягаясь и не мудрствуя лукаво можно назначать сочетания клавиш для того чтобы скомпилить/запустить все что угодно.
Для примера - вот что у меня находится в c.vim:
Code:
map <F5> :wall \| make<Cr>:!cscope -R -b<Cr>:cscope add cscope.out<Cr><Cr>:cl<Cr>
А вот tex.vim
Code:
map <F5> :!pdflatex <C-R>%<CR>
Соответственно для разных файлов кнопалка F5 работает по разному. HTML открывает в браузере, компиляет c++, собирает PDF из tex и так далее.
==========================
2) Цветовые схемы. Многие из тех кто пытался найти схему под себя сталкивались с тем что это сделать не так просто как хотелось - бы. Некоторые просто не подходят, некоторые другие работают непредсказуемо. Тоесть при переключении одной на другую появляются всякие чудеса, некоторый текст оказывается темно-синим на черном фоне что доставляет особое удовольствие.
Казалось-бы штука незначительная - но напрягает. А решается она точно так же. В каждом конфиге из п.1 просто прописываем нужную тему. А саму тему создаем сами: ~/.vim/colors/MyCoolName.vim
Начало можно спереть из какой-нибудь другой темы, скажем так:
Code:
highlight clear
if exists("syntax_on")
syntax reset
endif
set background=dark
set t_Co=256
let g:colors_name="DartPhoenix"
let python_highlight_all = 1
let c_gnu = 1
hi Normal ctermfg=253 ctermbg=234 cterm=None
hi Cursor ctermfg=253 ctermbg=57 cterm=None
hi SpecialKey ctermfg=70 ctermbg=None cterm=None
hi Directory ctermfg=57 ctermbg=254 cterm=None
hi ErrorMsg ctermfg=160 ctermbg=245 cterm=None
hi PreProc ctermfg=243 ctermbg=None cterm=Bold
hi Search ctermfg=234 ctermbg=3 cterm=Bold
hi Type ctermfg=166 ctermbg=None cterm=Bold
hi Statement ctermfg=172 ctermbg=None cterm=Bold
hi Comment ctermfg=240 ctermbg=None cterm=None
hi LineNr ctermfg=244 ctermbg=233 cterm=None
hi NonText ctermfg=105 ctermbg=None cterm=Bold
hi DiffText ctermfg=165 ctermbg=244 cterm=None
hi Constant ctermfg=76 ctermbg=None cterm=None
hi Todo ctermfg=162 ctermbg=None cterm=Bold
hi Identifier ctermfg=142 ctermbg=None cterm=Bold
hi Error ctermfg=None ctermbg=196 cterm=Bold
hi Special ctermfg=172 ctermbg=None cterm=Bold
hi Ignore ctermfg=221 ctermbg=None cterm=Bold
hi Underline ctermfg=147 ctermbg=None cterm=Italic
hi FoldColumn ctermfg=132 ctermbg=None cterm=None
hi Folded ctermfg=132 ctermbg=None cterm=Bold
hi Visual ctermfg=248 ctermbg=238 cterm=None
а потом - мутить уже свои настройки.
В формате ничего страшного нет, пишем hi НазваниеЭлемента и далее цвета ctermfg, ctermbg, cterm... с этим проблем быть не должно.
Вопрос: где взять название элемента и как это вообще делается.
В конфиг vimrc добавляем такой скрипт:
Code:
" Просмотр цветовой группы текущего элемента текста. Удалить, когда не будет надобности
map <F4> :call <SID>SynStack()<CR>
function! <SID>SynStack()
if !exists("*synstack")
return
endif
execute 'syntax on'
redraw
echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
endfunc
Скрипт публичный, я его только модифицировал чтобы он обновлял по F4 текущую схему и можно было видеть сразу же произведенные настройки. Это можно сделать и автоматом - но мне лишний раз надавить F4 не сложно, поэтому я не запаривался.
Итого открываем две консоли с vim. Одну с новенькой цветовой схемой - вторую с кодом на c++ например. В окне с кодом перемещаем курсор к слову int, например, и нажимаем F4 (есессно ничто не мешает назначить сею функцию на другую кнопку). В зависимости от настроек vim где-то должна вылезти подсказка "cType". Что мы делаем ? Переключаемся на окно с конфигом цветовой схемы - и там пишем
Code:
hi cType ctermfg=red ctermbg=green cterm=Underline
Сохраняем, переключаемся обратно на окно с кодом и нажимаем F4.
Получаем некое вырвиглазное зрелище.
VIM в качестве IDE, изображение №2
Вырвиглазное оно потому что нормальный человек вместо red и green напишет тот цветовой код, который ему больше нравится. А ненормальный... ему и так хорошо
В результате за часик можно намутить себе вполне приличную и приятную на глаз тему оформления.
Теперь к тому, почему при переключении этих тем могут происходить чудеса. А дело все в том что VIM при переключении этих тем не отменяет настройки, которые были сделаны предыдущей темой. И если в старой схеме есть подсветка int а в новой нет - то переключившись на новую - мы будем все еще иметь подсветку, которая была в старой. Эта проблема примитивно решается каким-то глобальным списком всех сделанных цветовых настроек, которые будут сбрасываться в дефолт. Можно сделать и похитрее - но на начальном этапе вроде-как это не требуется. Тем более ничто не мешает (кроме чувства эстетики и стремления к прекрасному) сделать таким образом одну тему на все случаи жизни.
=============================
Пока как-то так.