Статьи VIM в качестве IDE

Discussion in 'Статьи' started by DartPhoenix, 13 Mar 2021.

  1. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,105
    Likes Received:
    8,474
    Reputations:
    25
    В самом начале пути девелопера, осознавшего что все это время он жил неправильно пока не начал использовать 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.
    Получаем некое вырвиглазное зрелище.
    upload_2021-3-13_18-49-14.png

    Вырвиглазное оно потому что нормальный человек вместо red и green напишет тот цветовой код, который ему больше нравится. А ненормальный... ему и так хорошо :)

    В результате за часик можно намутить себе вполне приличную и приятную на глаз тему оформления.

    Теперь к тому, почему при переключении этих тем могут происходить чудеса. А дело все в том что VIM при переключении этих тем не отменяет настройки, которые были сделаны предыдущей темой. И если в старой схеме есть подсветка int а в новой нет - то переключившись на новую - мы будем все еще иметь подсветку, которая была в старой. Эта проблема примитивно решается каким-то глобальным списком всех сделанных цветовых настроек, которые будут сбрасываться в дефолт. Можно сделать и похитрее - но на начальном этапе вроде-как это не требуется. Тем более ничто не мешает (кроме чувства эстетики и стремления к прекрасному) сделать таким образом одну тему на все случаи жизни.
    =============================
    Пока как-то так.
     
    nynenado, MyDevil, x10 and 6 others like this.
  2. web456web

    web456web Banned

    Joined:
    4 Apr 2021
    Messages:
    27
    Likes Received:
    11
    Reputations:
    1
    [​IMG]
    Komodo Edit - редактор web-кода (html, php, css)...
     
  3. jixe

    jixe Member

    Joined:
    2 Feb 2011
    Messages:
    2
    Likes Received:
    20
    Reputations:
    0
    Emacs? :)
     
  4. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,105
    Likes Received:
    8,474
    Reputations:
    25
    Кому-как. У меня просто i3 стоит, мне окошки от emacs'а не очень-то и нужны. Какбэ i3+emacs это уже перебор.
    Но вообще я как-то попробовал кнопать на нем - не нравятся все эти сочетания клавиш от слова "вообще". Можно допилить и сделать как в vim, но зачем делать как в vim если есть vim :)
     
    CyberTro1n likes this.