При разработке проекта удобно всегда иметь актуальную документацию по методам. После добавления нового метода и сохранения файла приходится вручную запускать скрипт обновления документации.
У vim есть возможность выполнять команды по собственным событиям, но нельзя просто выполнять команды фоном без блокировки работы.
Вспомогательная прога
В Linux есть средство для организации взаимодействия между разными программами — D-Bus. Vim может с помощью dbus-send
передавать сигналы во вспомогательную программу, которая в свою очередь и будет выполнять скрипт обновления документации.
Есть готовый пример на python-е для выполнения функций при получении сигнала, адаптируем его для выполнения внешних команд:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import gobject import dbus import dbus.service import dbus.mainloop.glib import os class Runner(dbus.service.Object): @dbus.service.method("info.gnedov.Runner", in_signature='s', out_signature='') def Execute(self, cmd): os.system(cmd) @dbus.service.method("info.gnedov.Runner", in_signature='', out_signature='') def Exit(self): mainloop.quit() if __name__ == '__main__': dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) session_bus = dbus.SessionBus() name = dbus.service.BusName("info.gnedov.Runner", session_bus) object = Runner(session_bus, '/Runner') mainloop = gobject.MainLoop() print "Running" #print usage mainloop.run() # vim: set ts=4 sw=4 noet |
Запуск:
1 |
python runner.py |
Эту команду можно разместить в автозапуске вашей среды рабочего стола
Теперь чтобы передать команду на выполнение воспользуемся программой dbus-send:
1 |
dbus-send --print-reply --dest=info.gnedov.Runner /Runner info.gnedov.Runner.Execute string:"xterm &" |
Настройка vim
Есть событие «BufWritePost», которое срабатывает при сохранении. Им и настрою обновление документации с помощью vim-скрипта специфичного для проекта:
1 2 |
autocmd BufWritePost *.js execute("silent !dbus-send --print-reply --dest=info.gnedov.Runner /Runner info.gnedov.Runner.Execute string:\"/path/to/project/update-client.sh &\"") autocmd BufWritePost *.php execute("silent !dbus-send --print-reply --dest=info.gnedov.Runner /Runner info.gnedov.Runner.Execute string:\"/path/to/project/update-server.sh &\"") |