Pull to refresh

Запуск tmux-окна, адаптированного для удобной работы с Ruby on Rails

Reading time4 min
Views13K
Добрый день. С недавних пор стал изучать 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 открывает мой проект в любимом редакторе 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 я новичок, так что уверен что код далек от нормального).
Tags:
Hubs:
Total votes 25: ↑21 and ↓4+17
Comments45

Articles