지정된 창을 열어서 시작하도록 tmux를 설정하는 방법은 무엇입니까?


답변:


258

필요한 프로그램으로 tmux를 시작하는 작은 쉘 스크립트를 작성할 수 있습니다. dev-tmux라는 쉘 스크립트에 다음이 있습니다. 개발 환경 :

#!/bin/sh
tmux new-session -d 'vim'
tmux split-window -v 'ipython'
tmux split-window -h
tmux new-window 'mutt'
tmux -2 attach-session -d

그래서 내가 좋아하는 개발 환경을 시작하고 싶을 때마다

$ dev-tmux

4
감사! bash --rcfile특정 devtools 버전이 활성화 된 과학 리눅스에서 멋진 쉘을 얻으 려면이 작업을 수행하기 위해 끔찍한 탈출을해야했습니다 . 누군가가 똑같이하려고하면 여기에 남겨 두십시오. tmux new-window -n "git lg" "scl enable devtoolset-3 'bash --rcfile <(echo \"source \"$HOME/.bashrc\";cd ~/workspace/coolproject/;git lg\")'"
Lallen

1
두 번째 줄은 변경되어야한다고 생각합니다 .'vim '전에 -s 옵션이 필요합니다. "tmux new-session -d 'vim" "은"tmux new-session -d -s'vim ""으로 대체되어야합니다.
Ahmad Yoosofan

2
@AhmadYoosofan, vim거기는 창의 첫 번째 (그리고 그 당시에 만) 창에서 실행될 명령을 나타냅니다. 대신 세션 이름을 'vim'으로 지정하려면 그렇습니다. 맞습니다 -s. 플래그 를 사용해야합니다 . 전체 구문 : tmux new-session -d -s SessionName -n WindowName Command
Mitja

조심하십시오 : 이미 다른 곳에서 tmux 세션을 시작했다면 명령이 다른 세션에서 끝날 수 있습니다! @ waqar-lim의 답변에는이 문제가 없습니다.
haja

173

복잡한 창 격자를 만들려고했는데 창을 반복해서 전환하고 분할하는 작업을 처리해야했습니다. 내 학습 내용은 다음과 같습니다.

tmux new-session \;

새로운 세션으로 시작하십시오. 가로 또는 세로로 split-window -h또는 -v그 이후에 분할하려면 다음과 같이하십시오.

tmux new-session \; split-window -v \; split-window -h \;

다음과 같이 3 개의 창을 만듭니다.

------------
|          |
|----------|
|    |     |
------------

해당 분할 창에서 명령을 실행하려면 명령을 사용하여 send-keys 'my-command'명령을 추가하고 C-m실행하십시오.

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v \; \
  split-window -h \; \
  send-keys 'top' C-m \; 

결과 세션은 다음과 같아야합니다.

------------
|  tail    |
|----------|
|    | top |
------------

지금 어느 정도로 다시 전환하여 다시 왼쪽 하단 패널을 서브 - 분할하려고 last-pane으로 더 복잡한 창 또는에 select-pane -t 1여기서 1순서대로 패널의 번호로 시작하여 생성 0.

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v \; \
  split-window -h \; \
  send-keys 'top' C-m \; \
  select-pane -t 1 \; \
  split-window -v \; \
  send-keys 'weechat' C-m \;

것을 수행. Basicaly와 주위에 당신의 방법을 알고 split-window그리고 select-pane당신이 필요로하는 모든입니다. 또한 -p 75창의 크기를 split-window보다 잘 제어 할 수 있도록 만든 창의 크기를 백분율 로 전달하는 것이 편리 합니다.

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v -p 75 \; \
  split-window -h -p 30 \; \
  send-keys 'top' C-m \; \
  select-pane -t 1 \; \
  split-window -v \; \
  send-keys 'weechat' C-m \;

세션처럼 보이는 결과

------------------
|      tail      |
|----------------|
|          | top |
|----------|     |
| weechat  |     |
------------------

tmux미래에 열광 하는 사람들 을 돕는 희망 .


2
놀라운 지침, 분할 후 세로 패널의 너비를 조정하는 방법을 안내해 주시겠습니까?
MinhNV

2
@MinhNV -h -p 30는 사용 가능한 높이의 30 %로 가로 패널을 만듭니다. -v -p 75너비가 75 % 인 수직에 대해서도 동일합니다.
Afr

1
의 목적은 무엇입니까 \:? 나는 이것에 관계없이 스크립트가 작동하는 것을 보았습니다.
케빈 맥도 너

2
업데이트 : \;세미콜론을 bash 대신 tmux로 전달하여 명령을 한 번의 호출로 tmux에 보낼 수 있습니다. stackoverflow.com/questions/20913198/…
Kevin McDonough

96

다음 .tmux.conf과 같이 다른 세션을 소싱 할 수 있습니다 .

# initialize sessions
bind S source-file ~/.tmux/session1 
bind s source-file ~/.tmux/session2

그런 다음 필요에 따라 세션을 포맷하십시오.

#session1
new  -s SessionName -n WindowName Command
neww -n foo/bar foo
splitw -v -p 50 -t 0 bar
selectw -t 1 
selectp -t 0

그러면 2 개의 창이 열리고 두 번째 창은 foo / bar로 이름이 지정되고 foo는 bar 위에서 실행되면서 수직으로 절반 (50 %)으로 분할됩니다. 초점은 창 2 (foo / bar), 상단 창 (foo)에 있습니다.

그런 다음 원하는 tmux 세션 (이 경우 session1)을 PrefixShifts


4
추가 파일없이 .tmux.conf에서 해당 세션을 시작할 수 없습니까?
Eno

2
그들 중 하나는 이렇게 할 수 있습니다.이 방법으로 더 많은 맞춤형 세션을 쉽게 추가 할 수 있습니다 – 그리고 몇 개의 작은 텍스트 파일은 거의 오버 헤드가 아닙니다 ...
jasonwryan

1
이것이 세션 중첩이 아닌가? 나는 Prefix Shift Stmux에 있어야하고 파일을 소싱하면 tmux가 좋아하지 않고 강제로하지 않으면 수행하지 않는 새 세션을 시작하려고 시도합니다.
user35915

1
@ user35915 단순히 자식 세션을 시작하지는 않지만 별도의 세션을 사용합니다. 예를 들어 prefix-s 또는 prefix-) 및 prefix- (
sehe

1
이것은 정답입니다. 그러나 s (S 아님)에 바인딩하면 세션 나열을위한 내장 tmux 바인딩이 무시됩니다.
count0

54

사용 tmuxinator은 - 당신이 여러 세션이 구성되어 있습니다, 당신은 주어진 시간에 출시 할 하나를 선택할 수 있습니다. 특정 창이나 창에서 명령을 실행하고 창에 제목을 지정할 수 있습니다. 다음은 Django 애플리케이션 개발과 함께 사용 하는 입니다.

샘플 구성 파일 :

# ~/.tmuxinator/project_name.yml
# you can make as many tabs as you wish...

project_name: Tmuxinator
project_root: ~/code/rails_project
socket_name: foo # Not needed. Remove to use default socket
rvm: 1.9.2@rails_project
pre: sudo /etc/rc.d/mysqld start
tabs:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - #empty, will just run plain bash
        - top
  - shell: git pull
  - database: rails db
  - server: rails s
  - logs: tail -f logs/development.log
  - console: rails c
  - capistrano:
  - server: ssh me@myhost

자세한 설명은 위 링크의 README를 참조하십시오.


2
tmuxinator는 기본적으로 내가 찾던 것입니다. 감사!
저스틴 포스

3
상당히 유사하다 tmuxp도있다 : github.com/tony/tmuxp는
벤 크리시


16
:~$ tmux new-session "tmux source-file ~/session1"  

session1

neww
split-window -v 'ipython'  
split-window -h  
new-window 'mutt'  

.bashrc에 별칭을 만드십시오.

:~$ echo `alias tmux_s1='tmux new-session "tmux source-file ~/session1"'` >>~/.bashrc  
:~$ . ~/.bashrc  
:~$ tmux_s1  

~ 무엇입니까 neww? 나는 그 명령을 어디에서나 찾을 수 없습니다. ~ new-window당신이 왜 길고 짧은 형식을 모두 사용하는지 이해할 수 는 없지만 명령처럼 보입니다 .
oligofren

11

먼저 @jasonwryan 의 접근 방식이 있었지만 2 개 이상의 구성이 있으면 혼란 스러울 수 있습니다.

그래서 별칭 함수를 만들었습니다.

tmx () {
    tmux "$2" source-file "$HOME/.tmux/$1.conf";
}

에서 ~/.tmux/나는 많은 용도로 여러 세션이있다. 예를 들어 서로 개발 환경이 다른 회사에서 일합니다. 따라서 위의 별칭 기능을 사용하면 간단히 호출 할 수 있습니다 tmx company1. 필요한 구성을로드하십시오.

업데이트 :tmux 명령 후 "$ 2"의 목적은 추가 tmux 인수를 전달할 수 있다는 것입니다.


1
이것을 @ soc1c의 팁과 결합하여 슈퍼 스위트 셋업 ( github.com/fatso83/dotfiles/commit/35a7ed )을 만들었습니다 . 감사!
oligofren

기존의 tmux 세션이 아직없는 경우 (get no server running on /tmp/tmux-1000/default) 함수가 실제로 작동하지 않습니다 . 그렇기 때문에 명령을로 패치해야했습니다 tmux new-session. 참조 github.com/fatso83/dotfiles/commit/…
oligofren

1
systemd를 사용하여 tmux 설정을 수행했습니다. 따라서 부팅 후에는 항상 세션이 실행됩니다. wiki.archlinux.org/index.php/Tmux#Autostart_with_systemd 언급하지 않아 죄송합니다.
danbruegge

10

"get.all"스크립트에서 매일 아침 호출하여 추적하는 소프트웨어를 새로 고치기 위해 여러 개의 "get.XXX"작업을 실행합니다. 그들 중 일부는 자동 종료입니다. 다른 사람들은 일단 이맥스를 구축하라고 요구하는 것처럼 더 많은 상호 작용이 필요합니다.

#!/bin/sh
tmux att -t get ||
tmux \
  new -s get -n capp \; \
  send-keys 'get.capp' C-m \; \
  neww -n emacs \; \
  send-keys 'get.emacs' C-m \; \
  neww -n git \; \
  send-keys 'get.git' C-m \; \
  neww -n mini \; \
  send-keys 'get.mini' C-m \; \
  neww -n port \; \
  send-keys 'get.port' C-m \; \
  neww -n rakudo \; \
  send-keys 'get.rakudo' C-m \; \
  neww -n neil \; \
  send-keys 'get.neil && get.neil2 && exit' C-m \; \
  neww -n red \; \
  send-keys 'get.red && exit' C-m \; \
  neww -n cpan \; \
  send-keys 'get.cpan && exit' C-m \; \
  selectw -t emacs

8

두 개의 분할 창 (예 : 가로)에서 화면을 분할하려는 경우이 명령을 실행할 수 있습니다 (tmux 또는 쉘 스크립트 필요 없음).

tmux new-session \; split-window -h \;

화면은 다음과 같습니다.

[ks@localhost ~]$                      │[ks@localhost ~]$ 
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
[10] 0:ks@localhost:~*                  "localhost.localdomain" 19:51 31-янв-16

8

그리고 이것이 내가하는 방법입니다.

#!/bin/bash

function has-session {
  tmux has-session -t name_of_my_session 2>/dev/null
}

if has-session ; then
  echo "Session already exists"
else
  cd /path/to/my/project
  tmux new-session -d -s name_of_my_session 'vim'
  tmux split-window -h -p 40 start_web_server
  tmux split-window -v
  tmux attach-session -d -t name_of_my_session
fi

각 프로젝트마다 하나의 파일이 있습니다. 또한 취미 프로젝트를 위해 일하기 위해 일부를 그룹화 할 수 있습니다.

또한 당신은 그것을 이동할 수 ~/bin, 폴더에 추가 PATH주고 tmux_my_awesome_project이름을. 그런 다음 각 위치에서 실행할 수 있습니다.


4

이것은 나를 위해 작동합니다. 주어진 이름으로 5 개의 창을 만들고 창을 자동으로 선택합니다 home.

new  -n home
neww -n emacs
neww -n puppet
neww -n haskell
neww -n ruby
selectw -t 1

3

bro 시도해보십시오 . 프로젝트 부트 스트 래퍼입니다.

그것은 상호 작용하기 쉬운 API를 제공합니다 tmux .

다음과 같이 보입니다.

#!/bin/sh
# @ project_name/tasks/init.sh
structure project_name
  window editor
    run 'vim'
  window terminal
    run 'echo happy coding ...'
focus editor
connect project_name

프로젝트를 시작하려면 모두 다음 명령을 실행하십시오.

bro start <project_name>

아래의 스크린 캐스트를 확인하면 API를 시작 bro하고 사용 하는 방법을 보여줍니다 tmux.

https://user-images.githubusercontent.com/8296449/50532502-2cf3e400-0b6e-11e9-84af-c5f77a04e5cc.gif


2

이를위한 tmux 플러그인이 있습니다.

tmux-resurrect를 확인하십시오

시스템 재시작 후 tmux 환경을 복원하십시오.

컴퓨터를 다시 시작해야 할 때를 제외하고 Tmux는 훌륭합니다. 실행중인 모든 프로그램, 작업 디렉토리, 창 레이아웃 등이 손실됩니다. 유용한 관리 도구가 있지만 워크 플로가 발전하거나 새 프로젝트를 시작할 때 초기 구성 및 지속적인 업데이트가 필요합니다.

tmux-resurrect는 tmux 환경의 모든 작은 세부 사항을 저장하므로 시스템을 다시 시작한 후 (또는 마음에들 때) 완전히 복원 할 수 있습니다. 구성이 필요하지 않습니다. tmux를 종료하지 않은 것처럼 느껴집니다.

또는 tmux-continuum

풍모:

  • tmux 환경의 지속적인 절약
  • 컴퓨터 / 서버가 켜질 때 자동 tmux 시작
  • tmux가 시작될 때 자동 복원

1

다음과 같이 tmux 구성 파일 ( ~/.tmux.conf) 에 지정해야합니다 .

new mocp
neww mutt

new -d
neww
neww

(mocp를 사용하여 두 개의 창을 가진 하나의 세션을 먼저 열고 두 번째로 음소거를하고 다른 분리 된 세션을 세 개의 빈 창으로 엽니 다).


1

이 스크립트를 만들었습니다 . 그것은 tmuxinator, 루비 등이 필요하지 않습니다. 구성 가능한 bash 스크립트 일뿐입니다.

config라는 파일에는 다음과 같은 내용이 포함되어야합니다.

combo=()
combo+=('logs' 'cd /var/log; clear; pwd')
combo+=('home' 'cd ~; clear; pwd')

bash 코드는 다음과 같아야합니다.

#!/bin/bash

if [ -r config ]; then
    echo ""
    echo "Loading custom file"
    . config
else
    . config.dist
fi

tmux start-server

window=0
windownumber=-1

for i in "${combo[@]}"; do

    if [ $((window%2)) == 0 ]; then
        name=${i}
        ((windownumber++))
    else
        command=${i}
    fi

    if [ ${combo[0]} == "${i}" ]; then
        tmux new-session -d -s StarTmux -n "${name}"
    else
        if [ $((window%2)) == 0 ]; then
            tmux new-window -tStarTmux:$windownumber -n "${name}"
        fi
    fi

    if [ $((window%2)) == 1 ]; then
        tmux send-keys -tStarTmux:$windownumber "${command}" C-m
    fi

    ((window++))
done

tmux select-window -tStarTmux:0
tmux attach-session -d -tStarTmux

안녕하세요 sensorario,이 링크는 질문에 대답 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다. 여기를 살펴보십시오 : 답변이 삭제되는 이유와 방법은 무엇입니까?
bummi

놀랍게도 tmux start_server서버 자체를 시작하지는 않습니다. github.com/tmux/tmux/issues/182
Jack Wasey

1

tmuxp 는 JSON 또는 YAML 세션 구성 및 Python API를 지원합니다. YAML 구문으로 새 세션을 생성하는 간단한 tmuxp 구성 파일은 다음과 같습니다.

session_name: 2-pane-vertical
windows:
  - window_name: my test window
    panes:
      - pwd
      - pwd

1

플러그인 tmux-continuum 은 tmux 세션을 자동 저장하고 다음에 tmux가 시작될 때로드합니다. 여기에서 일부 사용자 정의 스크립트 솔루션보다 설정이 더 쉬워야합니다.

풍모:

  • tmux 환경의 지속적인 절약
  • 컴퓨터 / 서버가 켜질 때 자동 tmux 시작
  • tmux가 시작될 때 자동 복원

요청에 따라 세션을 저장하려면 tmux-resurrect 플러그인을 사용할 수 있습니다 . tmux- continuum 을 실행하려면 tmux-resurrect 도 필요합니다

tmux-resurrect는 tmux 환경의 모든 작은 세부 사항을 저장하므로 시스템을 다시 시작한 후 (또는 마음에들 때) 완전히 복원 할 수 있습니다. 구성이 필요하지 않습니다. tmux를 종료하지 않은 것처럼 느껴집니다.


1

tmux 후크 를 사용 하여 새 세션이 작성 될 때 명령을 실행할 수 있습니다 . 특히, 이것은 session-created후크를 사용하여 달성됩니다 .

예를 들어, 오른쪽 아래에서 htop을 실행하여 화면을 세 가지 방법으로 분할하려면 ~/.tmux.conf파일에 다음 줄을 추가 할 수 있습니다 .

set-hook -g session-created 'split -h ; split -v top'

이 방법의 장점은 원하는 결과를 얻기 위해 특별한 방법 (예 : 쉘 스크립트 또는 별명)으로 tmux를 실행할 필요가 없다는 것입니다. 후크 명령이 후속 첨부 파일이 아닌 처음 세션을 작성할 때만 실행되도록 이 다른 답변tmux new-session -A -s mysession 에서 설명한 것과 이것을 결합 할 수도 있습니다.

이 기능은 2016 년 d15d54c2c 에 의해 추가되었습니다 . 포함 된 첫 번째 릴리스는 2.4입니다.


0

나는이 페이지의 모든 아이디어를 사용하려고 시도했지만 그중 하나를 좋아하지 않았습니다. 터미널을 열 때 특정 창 세트로 tmux를 시작한 솔루션을 원했습니다. 또한 새로운 터미널 창을 열면 이전 세션에서 tmux 세션을 대신합니다.

위의 솔루션은 종종 여러 tmux 세션을 여는 경향이 있으며 하나만 원합니다. 먼저, 나는 이것을 내 추가했다 ~/.bash_profile:

tmux start-server
if [[ -z "$TMUX" ]]
then
  exec tmux attach -d -t default
fi

그런 다음에 다음을 추가했습니다 ~/.tmux.conf.

new -s default -n emacs /usr/local/bin/emacs
neww -n shell /usr/local/bin/bash
neww -n shell /usr/local/bin/bash
selectw -t 1

이제 터미널을 시작하거나 tmux 등을 시작할 때마다 기존의 원하는 설정 (세션 default)에 다시 연결 하거나 해당 설정으로 새 세션을 만듭니다.


놀랍게도 tmux start_server서버 자체를 시작하지는 않습니다. github.com/tmux/tmux/issues/182
Jack Wasey

0

이 스크립트는 "e"라는 이름과 세 개의 창으로 세션을 시작합니다

#!/bin/sh 
tmux new-session -s e   -n etc -d 'cd /etc; bash -i'
tmux new-window  -t e:1 -n home   'cd ~; bash -i'
tmux new-window  -t e:2 -n log   'cd /var/log; bash -i'

tmux select-window -t e:1
tmux -2 attach-session -t e
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.