...

пятница, 28 марта 2014 г.

[Из песочницы] Запуск tmux-окна, адаптированного для удобной работы с Ruby on Rails

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

Работа с 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 открывает мой проект в любимом редакторе Sublima 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"

#######################
# Addpanes
add_panes() {
tmux split-window -h -t "${session_name}"
tmux split-window -v -t "${session_name}"
tmux send-keys -t "${session_name}":1.1 'rapp && rapps' C-m
tmux send-keys -t "${session_name}":1.2 'rapp && rapps' C-m
tmux send-keys -t "${session_name}":1.3 'rapp && rapps' C-m
tmux send-keys -t "${session_name}":1.2 'rails s'
tmux send-keys -t "${session_name}":1.3 'guard'
}

#######################
# 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}":1.2 C-m
}

#######################
# Guard start
guard_tests_start() {
tmux send-keys -t "${session_name}":1.3 C-m
}

#######################
# Open project in Sublima Text
open_project() {
tmux send-keys -t "${session_name}":1.1 'rappo' C-m
}

#######################
# Ruby console start
ruby_console_start() {
tmux send-keys -t "${session_name}":1.1 'rails c' 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 Sublima 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}":1.1 25
tmux new-window -n second -t "${session_name}"
tmux select-window -t "${session_name}":1
tmux attach -t "${session_name}"


Всё. Открываем новый терминал, в нем набираем tmux-s и получаем удобное окно tmux, готовое к работе с Ruby on Rails. Можно и с параметрами поиграть — они тоже работают. Важно лишь правильно настроить алиасы из ~/.bash_aliases, чтобы пути были прописаны к вашему проекту. И помните, скрипт написан в помощь тем, кто учится по книге railstutorial.ru. Если у вас нет Guard, то скрипт будет работать не корректно при параметре -t. Так же установите Sublima Text.


Прошу не судить строго. От новичка новичкам. Убил на этот скрипт сутки, решил поделиться (на русскоязычных ресурсах подобных инструкций не нашел). Адекватная критика приветствуется (в linux я новичок, так что уверен что код далек от нормального).


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий