SP-Forth, Linux и Vim
By exs. Monday, 1. June 2009, 09:10:22
Настройка окружения для использования SP-Forth в Linux с редактором vim (который умеет не только бибикать).
SPF под Linux существует в трёх ипостасях :
- Официальный дистрибутив на http://spf.sf.net (в исходниках и deb-пакет)
- Порт by ~mak (obsolete?)
- SPF/Win32 под wine (эмулятор WinAPI)
Далее речь пойдёт о первом варианте.
Установка
Счастливые пользователи Debian могут поставить бинарный пакет. После этого остаётся только настроить devel -- распаковываем слепок devel или берём каталог из CVS и связываем симлинком с /usr/lib/spforth4/devel. Можно не трогать системные каталоги, а добавить путь поиска в ~/.spf4.ini, например так :
H-STDOUT 0 TO H-STDOUT /full/path/to/devel/~ygrek/spf/included.f with: /full/path/to/devel/ TO H-STDOUT \ ~ygrek/lib/linux/readline.f
Джедаи собирают из исходников, что впрочем совсем не сложно. Для сборки понадобятся gcc, binutils и make. Создаём файл конфигурации сборки src/compile.ini
TRUE TO UNIX-ENVIRONMENT TRUE TO TARGET-POSIXи затем
cd src && makeДля того чтобы можно было запускать spf одной командой кидаем симлинк на бинарник в /usr/bin или в пользовательский ~/bin -- при необходимости дописать в .bashrc
if [ -d ~/bin ]; then
export PATH=~/bin:$PATH
fi
Теперь можно запускать код на выполнение с помощью spf4 forthcode.f. Также можно сделать файл с кодом исполняемым и дописать в начале shebang
#! /usr/bin/spf4после этого запускать ./forthcode.f
Замечание
В текущей версии deb-пакета есть одна неисправленная проблема. Библиотека компилированных констант не сможет найти сами файлы констант, для того чтобы обойти это просто добавьте в ~/.spf4.ini
\ workaround broken TryOpenFile : TryOpenFile >R FIND-FULLNAME R> OPEN-FILE ;Беэ этого многие системно-зависимые либы работать не будут.
Окружение
В файловом менеджере mc есть возможность назначить действия для выполнения с текущим файлом при нажатии Enter итп. F9-Команда-Файл расширений и добавляем в конец :
# Forth
shell/.f
Open=spf4 %f
Edit=sensible-editor %f
При этом не забудьте удалить настройки для фортрана которые по умолчанию захватывают расширение файлов .f.Действие Open выполняется по Enter'у, действие Edit по F4 - запускается sensible-editor который вызывает (как видно из названия) "вменяемый редактор", который определяется по переменной окружения EDITOR. Я добавил в .bashrc export EDITOR=vim для вызова Vim.
Полезные настройки vim.
(Общие настройки для облегчения ломки после FAR'а).
Для включения форт-специфичных настроек (например подсветки синтакиса) добавляем в ~/.vimrc
syntax on filetype on filetype plugin on au BufRead,BufNewFile *.f set filetype=forth au BufRead,BufNewFile *.F set filetype=forth au BufRead,BufNewFile *.spf set filetype=forthДополнительные настройки прописываем в ~/.vim/ftplugin/forth.vim :
" Cловарь для автодополнения,
set dictionary+=/full/path/to/devel/~ygrek/doc/docbook/words.dic
" Сделаем удобную навигацию по словам
set keywordprg=spf4\ \\~ygrek/doc/docbook/words.f\ help
" Проверка синтаксиса
"set makeprg=spf4\ %
set makeprg=spf4\ \\\~ygrek/spf/vim.f\ VIMINCLUDE\ %
" Формат вывода ошибок
set errorformat=%m\ at:\ %f:%l:%c:
" Полезные "быстрые шаблоны"
" Вывод отладочной информации
iabbrev dbg CR DEPTH . .S
" Открывать файл с кодом по spf-относительному пути под курсором
nmap <LocalLeader>f :call SpfOpenFile(expand("<cword>"))<CR>
" Only definitions below -- executed once
if exists("*SpfOpenFile")
finish
endif
function SpfFindFullname(filename)
let tmp = tempname()
exe "!spf4 " . shellescape(":NONAME S\" ".substitute(a:filename,'"',"","g")."\" FIND-FULLNAME TYPE CR ; CATCH BYE") . " > " . tmp
return get(readfile(tmp),0)
endfunction
function SpfOpenFile(filename)
let filename = SpfFindFullname(a:filename)
if filereadable(filename)
exe "edit" filename
endif
endfunction
Словарь для автодополнения это просто список слов собранный из SPF_DEVEL, позволяет быстро набирать часто используемые слова из devel (сочетание клавиш по умолчанию CTRL-N/CTRL-P).keywordprg определяет показ контекстной справки по слову под курсором (команда K), я использую тот же список слов что и для автодополнения со стековой нотацией к каждому слову.
makeprg вызывается командой :make, которую можно назначить например на F9:
" F9 - "make" команда map <F9> :make<cr> vmap <F9> <esc>:make<cr>i imap <F9> <esc>:make<cr>iМожно напрямую вызывать spf4\ % (знак процента заменяется на имя текущего файла), но это будет неправильно работать если имя файла содержит пробелы, также при ошибке в программе spf перейдёт в интерактивный режим, что для меня не очень удобно, поэтому используется простая обёртка, которая решает эти проблемы.
errorformat распознаёт информацию об ошибке от spf и автоматически переходит в указанную строку.
Функция SpfOpenFile (назначена на <LocalLeader>f, т.е. \f) открывает файл по его пути под курсором. Полный путь к файлу находит сам spf с помощью FIND-FULLNAME, что позволяет быстро перемещаться по REQUIRE и INCLUDED.
Заключение.
Ну и какой же блог без скриншотов?

PS: Код на скриншоте - затравка для следующего поста.







Anonymous # 18. June 2009, 08:26
можно ссылку на Порт by ~mak (obsolete?) ?
exs # 29. June 2009, 14:19
и на sf.net :
http://sourceforge.net/project/showfiles.php?group_id=17919&package_id=141388 (те файлы что за 2005 год)
Какие из них новее и как они между собой связаны я не в курсе. Михаил безусловно крут, но тягой к излишним подробностям в документации не отличается :)
ЗЫ А что, spf/linux чем-то не устраивает?
Anonymous # 18. July 2009, 14:06
хотел посмотреть как вызываются внешние ф-ции из форта, написанного на С.
http://osdir.com/ml/lang.forth.spf/2008-08/msg00007.html
(в Си (который мы вызываем) - это мудрое упрощение API-CALL я подглядел
у Миши в его варианте LinuxSPF (который вперемешку с Си). Т.е. не надо
даже никакого API-CALL - затолкал все сишные параметры в сишный стек и
делаешь обычный EXECUTE)
Anonymous # 6. August 2009, 06:44
Ubuntu 8.10 и 9.4.
Ставил из пакета, spf4 запускается, но не работает SAVE, (то же самое происходит при попытке компиляции из исходников), объектный файл создается, но линковщик вываливается с ошибкой.
...
ld завершилась по сигналу 11 [Segmentation fault]
make: *** [spf4] Ошибка 1
Попытка слинковать вручную выдает:
host:~/spforth4/src$ ld spf4.o
ld: warning: cannot find entry symbol _start; not setting start address
spf4.o:(.forth+0x21a1): undefined reference to `dlopen'
spf4.o:(.forth+0x21bd): undefined reference to `dlsym'
spf4.o:(.forth+0x21fd): undefined reference to `realloc'
spf4.o:(.forth+0x2219): undefined reference to `write'
spf4.o:(.forth+0x2d65): undefined reference to `calloc'
spf4.o:(.forth+0x21dd): undefined reference to `dlerror'
Не имею ни малейшего представления где копать, а жаль.
exs # 9. August 2009, 08:57
Смотрите
http://www.nabble.com/next-release-td21288367.html#a21673239
и
http://www.nabble.com/to-ygrek-3-td21692569.html
Если это так, то попробуйте более новую версию binutils, по крайней мере в 2.19.51.20090723-1 эту багу исправили. Наверное неплохо было бы иметь альтернативный способ получения бинарника независимо от ld/gcc чтобы избавиться от таких фокусов в будущем.
Anonymous # 10. August 2009, 07:30
Благодарю! После установки http://aist.ring.gr.jp/archives/linux/debian/debian/pool/main/b/binutils/binutils_2.19.51.20090805-1_i386.deb на Ubuntu 9.04 spf4 собрался из исходников. SAVE работает. Проверил и на установке из пакета.
Anonymous # 31. October 2009, 04:11
Ubuntu 9.04 AMD64
/Downloads/spf-4.20/src$ make
make -C posix
make[1]: Вход в каталог `/Downloads/spf-4.20/src/posix'
gcc -Wall -Werror -DSPF_SRC config.c -oconfig.gen
config.c: В функции ‘main’:
config.c:56: ошибка: ‘REG_EDI’ не описан (первое использование в этой функции)
config.c:56: ошибка: (Сообщение о неописанном идентификаторе выдается один раз
config.c:56: ошибка: для каждой функции, в которой он используется.)
config.c:58: ошибка: ‘REG_EIP’ не описан (первое использование в этой функции)
config.c:60: ошибка: ‘REG_ESP’ не описан (первое использование в этой функции)
config.c:62: ошибка: ‘REG_EAX’ не описан (первое использование в этой функции)
config.c:64: ошибка: ‘REG_EBP’ не описан (первое использование в этой функции)
make[1]: *** [config.gen] Ошибка 1
make[1]: Выход из каталога `/Downloads/spf-4.20/src/posix'
make: *** [spf4.o] Ошибка 2
Куда копать?
exs # 31. October 2009, 11:16