Quantcast
Channel: openSUSE Planet - Global
Viewing all articles
Browse latest Browse all 23298

Alexander Naumov: (fun (open-build-service (+ openSUSE stumpWM)))

$
0
0

Common Lisp – один из диалектов мультипарадигменного языка программирования Lisp. Поддерживает комбинацию процедурного, функционального и объектно-ориентированного программирования. Я начал изучать Lisp именно из-за его истинно функциальной природы. Реализация решений тех или иных задачь при использовании функционального подхода (декларативного программирования) сильно отличается от столь привычного императивного. Его использование очень расширяет горизонты программиста.

Одной из интересных возможностей Lisp-программ является возможность их изменения “на лету”. Это значит, что мне не надо их перекомпилировать или перезапускать интерпретатор. Я просто подключаюсь к запущенному процессу и меняю его поведение, внося изменения в его код. Это делает хакинг на много проще и интересней.

К сожаленью в openSUSE-репозиториях практически нет Lisp-программ. Есть Emacs, но он написан на Emacs Lisp, а это другой диалект с другими правилами. Есть Lisp-интерпретаторы, но вносить изменения в код интерпретатора и следить за изменениями в его поведении все же не столь интересно. Свои первые программы aka “hello world” изменять тоже скучно; хочется работать с большим проектом, чтение кода которого научит тебя новым трюкам этого языка и просто покажет как надо на нем программировать.

Мой выбор остановился на проекте stumpWM. Его не было в репах, так что собирать его предстояло из исходников. Собрать С/C++ или даже Python-проекты с Qt/GTK+ библиотеками не составляет особого труда для большинства из нас, но в мире Lisp все это работает несколько иначе…

Beauty of packaging

StumpWM представляет из себя фреймовый (разбивающий рабочее пространство экрана на взаимно не пересекающиеся прямоугольные области — фреймы) оконный менеджер для X11, написанный на Common Lisp и управляемый главным образом с клавиатуры. Вообще-то я доволен и Fluxbox, но, как я уже сказал, я решил попробовать сломать что-то большое, написанное на Lisp. К тому же интерес вызвало его отсутствие в OBS.
Процесс сборки занял некоторое время из-за поиска, изучения и сборки зависимостей.
Packaging – одна из интереснейших частей хакинга: ты учишь столько нового о внутреннястях и принципах работы программ, которые собираешь. Ты можешь менять её поведение или характер, указывая как именно она должна вести себя при установке, удалении или обновлении. В случае с stumpWM, Lisp открывал новый мир со своими правилами и культурой. Хочешь подключить дополнительные библиотеки к Lisp-проекту? Его интерпретатор не может сделать это сам, как например в случае с Python или при компиляции С/C++. В мире Lisp для этого используется Another System Definition Facility, даже несмотря на то, что эти библиотеки написанны на том же Lisp.
Новыми так же оказались сами библиотеки и принцип их работы. К примеру, нужно использовать протокол X Window System. Для C/C++ проекта это была бы привычная нам всем Xlib. Её же можно использовать и тут, а можно пойти другим путем и, как я и сделал, пересобрать проект с cl-clx. Ну разве не здорово? :)

Все пакеты, необходимые для запуска stumpWM, собраны и находятся в моем home-проекте.

> osc ls home:Alexander_Naumov:Lisp
asdf
cl-clx
cl-ppcre
common-lisp-controller
dh-lisp
sbcl
stumpwm

> osc ls home:Alexander_Naumov:Lisp stumpwm | grep tar
stumpwm-0.9.7.tar.gz

В процессе сборки всех этих зависимостей я обращался к ML архивам fedora и debian-проектов.

Я не планирую поддерживать проект в будущем, поэтому не собираюсь отсылать реквест о добавлении пакета в официальный windowmanager репозиторий. Я продолжаю экспериментировать, меняя или откровенно ломая периодически тот или иной механизм.

Install stumpWM

Итак, если прошлый абзац не отпугнул вас, и вы решили не собирать проект из исходников, а установить мою сборку stumpwm, то… просто подключите Lisp-репозиторий и установить пакет stumpwm. Он потянет за собой остальные пакеты из этого репозитория.

> sudo zypper ar \
http://download.opensuse.org/repositories/home:/Alexander_Naumov:/Lisp/openSUSE_12.1/ \
Lisp
> sudo zypper mr -r Lisp
> sudo zypper in stumpwm

Если все прошло гладко, то вы должны получить /usr/lib/stumpwm/stumpwm файл. После этого создаем ~/.xinitrc и делаем:

> echo "/usr/lib/stumpwm/stumpwm" >> ~/.xinitrc

Перезагружаем X сеанс (разлогиниваемся и залогиниваемся обратно). После этого должно появиться приглашение “Welcome To the Stump Window Manager”. Выглядит все это примерно вот так (на скриншоте 12.1, но на 12.2 это тоже работает ;) ) и для управления действительно не нужна мышь. Это конечно не значит, что ее работа не поддерживается и ей нельзя пользоваться.
Если не понравиться, всегда можно вернуться обратно, просто удалив/отредактировав ~/.xinitrc.

Кстати, по поводу этого файла и автоматическим переключением между окружениями. Была идея сделать процесс полносью автоматизированным, т.е. просто устанавливаем пакет, перезагружаем X, и запускается stumpWM, а после его удаления и перезагрузки X, просто загружается то, что было до него. Я не стал так пока делать, потому что планирую реализовать этот механизм через sysconfig. Редактирование ~/.xinitrc (просто добавление одной строчки или её удаление) меня пока совсем не напрягает. Надеюсь, что и для вас это не будет большой проблемой ;)

Just re-eval and GO!

Поведение stumpWM можно менять “на лету”, т.е. для того чтобы увидеть результат изменений, его не придется перезапускать. Способов сделать это есть много, но, к сожаленью, далеко не все пока поддерживаются в стандартной установке openSUSE. Для этого нужно пересобрать еще несколько проектов (на моей машине они собранны из исходников).

Самый простой – перезагрузить конфиг ~/.stumpwmrc. Файла этого после установки в системе нет, но, как и ~/.xinitrc, его можно создать, и настройки из него будут подхваченны stumpwm. Добавим, к примеру, в ~/.stumpwmrc этот код:

(defcommand yast () ()
    "Start YaST"
    (run-or-raise "/sbin/yast2" '(:class "YaST")))

(define-key *root-map* (kbd "y") "yast")

Теперь перезагружаем его командой С-t ; loadrc. Получаем сообщение “rc file loaded successfully”. Это значит, что настройки stumpwm изменены: теперь он будет реагировать на команду С-t y и запускать при этом YaST. Как вы понимаете, это просто пример; вместо YaST можно повесить любой другой процесс – браузер или что-то ещё.

Другим интересным способом является подключение непосредственно к stumpwm и изменение его кода… прямо во время его выполнения. Я расскажу об этом способе поподробнее в следующей статье, когда найду время пересобрать и протестировать еще пару нужных для этого Lisp-пакетов.



Viewing all articles
Browse latest Browse all 23298


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>