Добрый день. С недавних пор стал изучать Ruby on Rails. До этого год программировал на c# (asp.net). Переход на руби означал также переход на Ubuntu и тесное взаимодействие с терминалом. Руби изучаю по данному онлайн-учебнику: railstutorial.ru. На борту имею Ubuntu 13.04.
Работа с RoR бод Ubuntu подразумевает много терминальных окон. В одном rails сервер, в другом Guard со Spork, в третьем Ruby-консоль и пр. В интернете наткнулся на программу под названием tmux. Не вдаваясь в подробности скажу, что она позволяем в одном терминальном окне работать с несколькими консолями (да простят меня линуксоиды за терминологию). На картинке это выглядит примерно так:

После установки tmux (
На просторах интернета было найдено несколько решений, которые предлагали сохранять сессию отдельным скриптом через cron. Для меня, как для новичка, все эти танцы с бубном были сложны, не понятны и не функциональны. Подумав, решил писать bash-скрипт, который запускал бы новую сессию tmux с нужными мне 3-мя окнами и принимал несколько параметров.
Параметры захотел такие:
Почитав мануал по tmux и немножко узнав о bash-скриптах добавил в ~/.bash_aliases следующие строки:
Тут все просто. Я добавил несколько сокращений для упрощенного доступа к моему проекту (sample_app), а так же несколько сокращений для tmux.
Дальше я создал файл tmux-s в папке /bin (
Всё. Открываем новый терминал, в нем набираем
Прошу не судить строго. От новичка новичкам. Убил на этот скрипт сутки, решил поделиться (на русскоязычных ресурсах подобных инструкций не нашел). Адекватная критика приветствуется (в linux я новичок, так что уверен что код далек от нормального).
Работа с RoR бод Ubuntu подразумевает много терминальных окон. В одном rails сервер, в другом Guard со Spork, в третьем Ruby-консоль и пр. В интернете наткнулся на программу под названием tmux. Не вдаваясь в подробности скажу, что она позволяем в одном терминальном окне работать с несколькими консолями (да простят меня линуксоиды за терминологию). На картинке это выглядит примерно так:

После установки tmux (
sudo apt-get install tmux) и изучения основ я влюбился в этот мультиплексор. Все в нем хорошо. Есть одно «но» — после каждой перезагрузки необходимо заново перенастраивать окно tmux. А это 5 лишних минут! Неужели нельзя сохранять состояние tmux окна! На просторах интернета было найдено несколько решений, которые предлагали сохранять сессию отдельным скриптом через cron. Для меня, как для новичка, все эти танцы с бубном были сложны, не понятны и не функциональны. Подумав, решил писать bash-скрипт, который запускал бы новую сессию tmux с нужными мне 3-мя окнами и принимал несколько параметров.
Параметры захотел такие:
- запуск без параметров создает новую сессию tmux, новое окно и разбивает его на три панели (фокус в первом окне первой панели)
- -s запускает во второй панели Rails сервер
- -t запускает в третей панели Guard+Spork (среда TDD RSpec)
- -o открывает мой проект в любимом редакторе Sublime Text 3
- -c в первой панели запускается Rails-консоль
Почитав мануал по tmux и немножко узнав о bash-скриптах добавил в ~/.bash_aliases следующие строки:
alias rapp='cd ~/work/ruby/Apps/sample_app' alias rappo='cd ~/work/ruby/Apps/sample_app && subl .' alias rapps='/bin/bash --login' alias tmux-k='tmux kill-session' alias tmux-ko='tmux kill-server' alias tmux-l='tmux ls'
Тут все просто. Я добавил несколько сокращений для упрощенного доступа к моему проекту (sample_app), а так же несколько сокращений для tmux.
Дальше я создал файл tmux-s в папке /bin (
sudo touch tmux-s) и сделал его исполняемым (sudo chmod +x tmux-s). Собственно говоря в этом файле и будет код, который поднимет сессию tmux с необходимыми мне панелями и окнами, а так же примимает необходимые параметрами. Содержание файла следующее:#!/bin/bash ####################### # Constants flag='0' ####################### # Config Variables session_name="rails" first_window_name="first" second_window_name="second" base_pane_command="rapp && rapps" server_start_comand="rails s" tests_start_comand="guard" project_open_command="rappo" console_open_command="rails c" ####################### # Addpanes add_panes() { tmux split-window -h -t "${session_name}" tmux split-window -v -t "${session_name}" tmux send-keys -t "${session_name}":"${first_window_name}".1 "${base_pane_command}" C-m tmux send-keys -t "${session_name}":"${first_window_name}".2 "${base_pane_command}" C-m tmux send-keys -t "${session_name}":"${first_window_name}".3 "${base_pane_command}" C-m tmux send-keys -t "${session_name}":"${first_window_name}".2 "${server_start_comand}" tmux send-keys -t "${session_name}":"${first_window_name}".3 "${tests_start_comand}" } ####################### # Tmux server start tmux_session_start() { if [ "${flag}" != '1' ] ;then echo "Session ${session_name} start..." tmux new-session -s ${session_name} -n ${first_window_name} -d add_panes fi } ####################### # Rails server start rails_server_start() { tmux send-keys -t "${session_name}":"${first_window_name}".2 C-m } ####################### # Guard start guard_tests_start() { tmux send-keys -t "${session_name}":"${first_window_name}".3 C-m } ####################### # Open project in Sublime Text open_project() { tmux send-keys -t "${session_name}":"${first_window_name}".1 "${project_open_command}" C-m } ####################### # Ruby console start ruby_console_start() { tmux send-keys -t "${session_name}":"${first_window_name}".1 "${console_open_command}" C-m } ####################### # error_param error_param() { tmux kill-session echo "Session ${session_name} killed..." echo "Parameter is incorrect! Avaliable parameters: -s for start Rails server -t for start Gusrd server -o for open project in Sublime Text -c for open Ruby concole" exit 1 } if [ ! ${1} ] ;then tmux_session_start fi while [ ${1} ] ;do case ${1} in -s) tmux_session_start rails_server_start flag='1' shift 1 ;; -t) tmux_session_start guard_tests_start flag='1' shift 1 ;; -o) tmux_session_start open_project flag='1' shift 1 ;; -c) tmux_session_start ruby_console_start flag='1' shift 1 ;; *) error_param ;; esac done echo "Success!" tmux select-pane -L -t "${session_name}" tmux resize-pane -R -t "${session_name}":"${first_window_name}".1 25 tmux new-window -n "${second_window_name}" -t "${session_name}" tmux select-window -t "${session_name}":"${first_window_name}" tmux attach -t "${session_name}"
Блок «Config Variables» содержит пользовательские настройки
Так же для корректной работы советую создать файл ~/.tmux.conf и вписать в него настройки отсюда: пользовательские настройки tmux
Всё. Открываем новый терминал, в нем набираем
tmux-s и получаем удобное окно tmux, готовое к работе с Ruby on Rails. Можно и с параметрами поиграть — они тоже работают. Важно лишь правильно настроить алиасы из ~/.bash_aliases, чтобы пути были прописаны к вашему проекту. И помните, скрипт написан в помощь тем, кто учится по книге railstutorial.ru. Если у вас нет Guard, то скрипт будет работать не корректно при параметре -t. Так же установите Sublime Text.Прошу не судить строго. От новичка новичкам. Убил на этот скрипт сутки, решил поделиться (на русскоязычных ресурсах подобных инструкций не нашел). Адекватная критика приветствуется (в linux я новичок, так что уверен что код далек от нормального).
