?

Log in

No account? Create an account

Previous Entry | Next Entry

Осваивая Haskell, пришлось искать средства для комфортной работы, так как специально заточенных под данный язык IDE нет. Неплохим вариантом была работа в Eclips, но волею судеб пришлось от нее отказаться – по роду деятельности бываю в долгосрочных командировках и не везде она устанавливается с полу-пинка. Потом искал просто добротный редактор хотя бы с подсветкой синтаксиса – нашел JEdit, но потребности росли и занялся проблемой вплотную. И так, какие требования выставляются нашей IDE для Haskell:

* мощный редактор;
* подсветка синтаксиса;
* ведение проектов;
* автодополнение по контексту;
* интеграция с интерпретатором и компилятором с позиционированием ошибок по тексту кода;


Ну с мощным редактором и так все ясно – Vim в *nix системах конкурирует только с emacs. Конечно, после долгого пользования drag`n`drop- ными редакторами, существует определенный порог привыкания к Vim`у. Но поверьте, это действительно удобно. Просто поверьте и попробуйте.

Что нам потребуется для превращения.
Исходники Vim – придется патчить его для интеграции с vimshell, что бы иметь возможность работать с окном интерпретатора прямо в Vim. Если у вас нет такого желания, то эту стадию можно пропустить. В принципе, можно переключатся путем screen, но мне данный способ показался удобнее. Зачем нам это надо, если существует плагин, который позволяет запускать исходный код для интерпретатора? Не знаю как кто, а я привык работать в самом интерпретаторе – тестировать функции в стиле REPL (Read-eval-print loop), существующий же плагин просто выдает информацию о ошибках.

Нужна будет сама vimshell (http://www.wana.at/vimshell/). Это патч позволяющий запускать shell в окнах vim. Собственно запускать можно что угодно, вплоть до еще одного vim`а. Автор показывает пример с irssi – консольным irc клиентом. Выглядит забавно =).

Для ведения проектов потребуется плагин Project (http://www.vim.org/scripts/script.php?script_id=69). Он используется для группировки файлов, быстрому доступу к наиболее используемым и просто для удобной навигации. Сгруппированные файлы отображаются в боковом вертикальном окне по заданным именам проекта в виде списка. Проекты могут быть вложенными.

Для удобной навигации по открытым буферам Buffer Explorer (http://www.vim.org/scripts/script.php?script_id=42). Изначально в vim реализована возможность переключаться по буферам по их номерам, что не совсем удобно. Плагин расширяет эту возможность окном навигации, в котором можно переключаться между буферами просто выбирая их названия и закрывать их из этого же окна.

Для комфортной работы с комментариями The NERD Commenter (http://www.vim.org/scripts/script.php?script_id=1218). Универсальный плагин для работы с комментариями ко многим языкам программирования. В том числе и для Haskell. Позволяет комментировать блоки, скрывать/раскрывать их, и еще много чего.

И часть из набора плагинов, написанных специально для работы с Haskell в vim, – (http://www.cs.kent.ac.uk/people/staff/cr3/toolbox/haskell/Vim/vim.html). Сам набор плагинов предоставляет богатые возможности по работе с кодом. Но заточен преимущественно под ghc. Мне отлаживать код удобнее в hugs. Впрочем я взял от туда минимальный набор – больше мне пока не понадобилось. Нам понадобится с этой страницы (http://www.cs.kent.ac.uk/people/staff/cr3/toolbox/haskell/Vim/index.html) файлы haskell.vim (скопировать в ftplugin), ghc.vim и hugs.vim (http://www.cs.kent.ac.uk/people/staff/cr3/toolbox/haskell/Vim/hugs.vim) (оба скопировать в compiler). После установки появится меню Haskell(Hugs98) со списком предаставлямых возможностей – узнать информацию типе, найти декларацию, построить список тегов и т.п. Все подробности написаны в файле haskellmode.txt.

Интегрируем с vimshell.

В папку с исходниками помещаем скаченый патч. И запускаем bzcat имя_патча | -p0 patch . Далее стандартная в таких случаях комбинация – configure & make & make install. С моей версией исходников от ASPLinux 11 (для «нормальных» исходников ниже описанные действия не нужны), после пропатчивания перед vimshell теми патчами, что идут в поставке, возникает ошибка при компиляции в файле gui.c в строке 2422 – неоткрытый #endif. Изучение кода до и после пропатчивания, говорит о том, что эта строчка просто лишняя – ее можно закомментировать. После этого все прекрасно компилится, собирается и устанавливается. Проверить наличие vimshell можно например командой :vimshell bash в командном режиме vim`а – откроется bash в текущем окне.

Устанавливаем плагины редактирования. Основы работы с палгинами.

Скачиваем плагины Project, Buffer Explorer, The NERD Commenter. Файлы копируем в соответсвии с заданной структурой – из папки doc все файлы в vim/doc, из plugin в vim/plugin. Ну и последнее что осталось сделать – добавить в справку информацию о данных плагинах – в vim`е :helptag _путь_к_vim/doc.

Плагин Project (требует отключить совместимость с vi). Для него определены следующие возможности:

* выбор проектов, элементов проекта по двойному щелчку мыши или ;
* загрузка/выгрузка файлов из проекта – команды \l, \L, \w и \W
* поиск файлов в проекте \g и \G
* поддержка запускаемых определенных пользователем скриптов для файлов в проекте – (\1 – \9, \f1 – \f9, \F1 – \F9)
* удаленная работа с |netrw| как XXXX:// по протоколам – ftp, rcp, scp и http.

Настройка проекта начинается с открытия окна проекта командой :Project (такая команда будет работать с файлом конфигурации по умолчанию – vimprojects, но настроек проектов может быть несколько – выбираются они по :Project {file}).

Создание проекта команда \C (\с – с рекурсивным обходом папок). После этого вам в интерактивном необходимо будет ответить на следующие вопросы:

Enter a name for the project – название проекта;
CD – корневая директория проекта;
Filter – фильтр отображаемых в проекте файлов (например "*.hs")

Теперь можно сохранить проект(:w) и продолжить работу.

Плагин Buffer Explorer (требует отключить совместимость с vi). Запускается по командам :be или :BufExplorer. Для него определены следующие возможности:

* / <левая-кнопка-мыши> – открывает буфер под курсором в текущем окне
* t / <правая-кнопка-мыши> – открывает буфер под курсором в новом окне
* d/D – удалить (закрыть) выбранный буфер
* p – переключает отображение путь и имя файла слитно/раздельно.
* q – выход из окна навигации
* r – реверс порядка отображаемых буферов
* R – переключает отображение абсолютный/относительный путь к файлу
* u – переключает отображение все_буфера/открытые_буфера
* s – переключает тип сортировки буферов – имя/путь/расширение

Плагин The NERD Commenter. После установки добавляет специальное меню (plugin->comment). Для него определены следующие возможности:

* ,cc – комментирует текущую строку или блок в визуальном режиме
* ,cn – комментирует с учетом отступов
* ,cm – комментирует минимальным числом символов
* ,c<пробел> – комментирует однострочными симоволами
* ,cs – комментирует с вставкой в каждую строку символа «-»
и многое, многое ...

Собственно, подробную информацию по каждому плагину можно узнать набрав :help имя_плагина

Настраиваем vimrc.

Файл vimrc это файл содержащий скрипт конфигурации при запуске Vim`а. Примерный файл я приведу. Но в начале опишу общий принцип на примере функции запускающей в новом окне hugs с текущим редактируемым буфером (" - это комментарий).
function RunHugs()
let buf_name = bufname("%") " переменной buf_name присваивается имя текущего буфера
exec 'silent new ' " создаем новое вертикальное окно
exec 'vimshell hugs' . buf_name " запускаем vimshell с hugs и именем буфера
endfunction
map < S - F9 > :call RunHugs() " связываем комбинацию клавиш Shift-F9 с вызовом нашей функции, где - это вызов нажатия

Здесь приводится конфигурационный файл с комментариями по каждой строке (именно так все и выглядит - html текст сгенерен Vim`ом):



  1 " интерсует нас именно Vim =)
  2 set nocompatible
  3 " отключаем перенос строк
  4 set nowrap
  5 " цветовая схема не напрягающая глаза
  6 colorscheme darkblue
  7 " номера строк - отображать
  8 set nu
  9 " поддержка авто отступов
 10 set autoindent
 11 " автозапись при переключении
 12 set autowrite
 13 " фолдинг отступов
 14 "set foldmethod=ident
 15 " отступы должны быть умными
 16 set smartindent
 17 " инкрементный поиск
 18 set incsearch
 19 " GUI менюшка - не понадобится
 20 set guioptions-=T
 21 " подсветка синтаксиса - нужна
 22 syntax on
 23 " включаем привычный копи-паст
 24 "vmap <C-C> "+yi
 25 "imap <C-V> <esc>"+gPi
 26 " и привычный shift-insert для работы с внешним буфером
 27 map <S-Insert> <MiddleMouse>
 28 " автозавершение по Tab
 29 function InsertTabWrapper()
 30  let col = col('.') - 1
 31  if !col || getline('.')[col - 1] !~ '\k'
 32  return "\<tab>"
 33  else
 34  return "\<c-p>"
 35  endif
 36 endfunction
 37 imap <tab> <c-r>=InsertTabWrapper()<cr>
 38 set complete=""
 39 " из буфера
 40 set complete+=.
 41 " из словаря
 42 set complete+=k
 43 " из разных буферов
 44 set complete+=b
 45 " из тегов
 46 set complete+=t
 47 " устанавливаем параметры табуляции
 48 set tabstop=4
 49 set shiftwidth=4
 50 " пробелы вместо табов
 51 set expandtab
 52 " терминал у нас темный
 53 set background=dark
 54 " меняем директорию автоматом для текущего файла
 55 autocmd BufEnter * lcd %:p:h
 56 " вешаем на F4 обозреватель проектов
 57 nmap <F4> <Esc>:Project<cr>
 58 vmap <F4> <esc>:Project<cr>
 59 imap <F4> <esc><esc>:Project<cr>
 60 " вешаем на F5 обозреватель открытых буферов
 61 nmap <F5> <Esc>:BufExplorer<cr>
 62 vmap <F5> <esc>:BufExplorer<cr>
 63 imap <F5> <esc><esc>:BufExplorer<cr>
 64 " перемещение по открытым буферам - предыдущий
 65 nmap <F6> :bn!<cr>
 66 imap <F6> <esc>:bn!<cr>
 67 " перемещение по открытым окнам 
 68 nmap <F7> <C-W><C-W>
 69 imap <F7> <esc><C-W><C-W>
 70 " вешаем на F12 обозреватель файлов
 71 map <F12> :Sex<cr>
 72 vmap <F12> <esc>:Sex<cr>i
 73 imap <F12> <esc>:Sex<cr>i
 74 " Сохранение вешаем на F2
 75 nmap <F2> :w<cr>
 76 vmap <F2> <esc>:w<cr>i
 77 imap <F2> <esc>:w<cr>i
 78 " делаем видимой колонку отступа
 79 set foldcolumn=2
 80 " автоставки для скобок их пар
 81 "imap [ []<LEFT>
 82 "imap { {}<LEFT>
 83 "imap ( ()<LEFT>
 84 " выход из vim
 85 map <C-Q> <Esc>:qa<cr>
 86 " проверка скобок
 87 set showmatch
 88 " показ заголовкой
 89 "set title
 90 " привязка типа файла к хаскель моду
 91 au BufEnter *.hs compiler hugs
 92 " прикрутим vimshell с Hugs`ом
 93 function RunHugs()
 94     let buf_name = bufname("%")
 95     exec 'silent new '
 96     exec 'vimshell hugs ' . buf_name
 97 endfunction
 98 map <S-F9> :call RunHugs()<cr>
 99 " проверка в Hugs c выдачей ошибок
100 map  <F9> :make<cr>
101 vmap <F9> <esc>:make<cr>
102 imap <F9> <esc>:make<cr>
103 " просмотр ошибок
104 nmap <F8> :copen<cr>
105 vmap <F8> <esc>:copen<cr>
106 imap <F8> <esc>:copen<cr>
107 " зaкрыть текущий буфер
108 nmap <F10> :bd<cr>
109 vmap <F10> <esc>:bd<cr>
110 imap <F10> <esc>:bd<cr>



Литература:

Ну прежде всего этот тот хэлп который предоставляется вместе с Vim – справка по настоящему богатая.
Родной сайт Vim – http://www.vim.org/
Блог о настройке – Все о Vim http://allaboutvim.blogspot.com


===========================================================
Mike, как насчет подветки на форуме посвещенной декларативному программированию? Существует огромное множество полезных и интересных языков программирования связанных так или иначе с данной тематикой и в последнее время бурно развивающихся (я имею ввиду haskell, erlang, у lisp открывается второе дыхание, Nemerle, в какой то степени python). Почему не уделить им всем хотя бы одну подветку =)

Comments

( 5 comments — Leave a comment )
mike_nov
Feb. 14th, 2008 07:23 pm (UTC)
С подсветкой вообще беда, ничего кроме PHP нормально не подсвечивается. Если есть какие модули, то могу попробовать прикрутить.

Из тех что я видел, ни один нормально не заработал.
p_thread
Feb. 14th, 2008 08:33 pm (UTC)
=) имел ввиду подветку - что то типа подраздела (подфорума) например в разделе "Общие вопросы программирования". О отедльном разделе можно только мечтать =)

Насчет подсветки попробую поискать.
p_thread
Feb. 15th, 2008 10:30 am (UTC)
На форуме vBulletin пишут что довольно просто к vBulletin прикручивается GeSHi - Generic Syntax Highlighter (http://qbnz.com/highlighter/). Список поддерживаемых языков действительно внушительный. И Haskell есть =)
shizo_gnoman
Dec. 29th, 2008 07:33 pm (UTC)
здравствуйте.
спасибо, за статью - буду в ближайшее время пробовать..
я недавно начал пользоваться vim'ом, так что ещё мало понимаю в тонких настройках.
подскажите пожалуйста, как мне пришить файл с настройками авто-отступа для haskell'а (http://www.vim.org/scripts/script.php?script_id=1968)?
я положил его в папку ~/.vim/indent/
но он не подключается автоматически.
дело в том, что если при открытом файле набрать :source ~/.vim/indent/haskell.vim - он начинает работать. но если эту строчку дописать в .vimrc - он не подключается при старте..
korshak
Jul. 4th, 2010 10:31 am (UTC)
Вот насчет projevt.tar.gz vs netrw можно поподробнее?
Я не смог завести. Исходя из логики, должно быть так:
\C > ftp > ftp://host/dir > . > *.*

Но это не работает :(
( 5 comments — Leave a comment )