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

в 19:21, , рубрики: bash scripting, linux, ruby on rails, tmux, Ubuntu, метки: , , ,

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

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

После установки 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 я новичок, так что уверен что код далек от нормального).

Автор: LeX_KaR

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js