Запуск 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 відкриває мій проект в улюбленому редакторі 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"

#######################
# 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 Sublime 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 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}":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. Так само встановіть Sublime Text.
 
Прошу не судити строго. Від новачка новачкам. Вбив на цей скрипт добу, вирішив поділитися (на російськомовних ресурсах подібних інструкцій не знайшов). Адекватна критика вітається (в linux я новачок, так що впевнений що код далекий від нормального).

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.