日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多窗口管理器Tmux - 从入门到精通

發(fā)布時間:2024/2/28 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多窗口管理器Tmux - 从入门到精通 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們先來理解下 tmux 的幾個元素。tmux 的主要元素分為三層

  • Session 一組窗口的集合,通常用來概括同一個任務(wù)。session 可以有自己的名字便于任務(wù)之間的切換。
  • Window 單個可見窗口。Windows 有自己的編號,也可以認(rèn)為和 ITerm2 中的 Tab 類似。
  • Pane 窗格,被劃分成小塊的窗口,類似于 Vim 中 C-w +v 后的效果。

下面是三個元素在 tmux 中的具體展現(xiàn)

安裝需求

如果要安裝 tmux, 需要先安裝 libevent 2.0 以上版本

否則會出現(xiàn)如下錯誤:

control.c: In function ‘control_callback’: control.c:63: warning: implicit declaration of function ‘evbuffer_readln’ control.c:63: error: ‘EVBUFFER_EOL_LF’ undeclared (first use in this function) control.c:63: error: (Each undeclared identifier is reported only once control.c:63: error: for each function it appears in.) control.c:63: warning: assignment makes pointer from integer without a cast make: *** [control.o] Error 1

安裝 tmux

下載 tmux

https://github.com/tmux/tmux/releases/download/2.0/tmux-2.0.tar.gz

下載 libevent

http://sourceforge.net/projects/levent/?source=typ_redirect

編譯安裝 libevent

./configure --prefix=/home/harriszh/app && make && make install

因?yàn)榭紤]到很多用戶在服務(wù)器上沒有 root 權(quán)限,所以這里安裝到 home 目錄下

編譯安裝 tmux

setenv CFLAGS?"-L/home/harriszh/app/lib -I/home/harriszh/app/include"?&& ./configure --prefix=/home/harriszh/app && make && make install

如果沒有前面的 setenv, 那么會遇到下面的錯誤

alerts.o: In function `alerts_queue': alerts.c:(.text+0xa0): undefined reference to `event_initialized' cmd-capture-pane.o: In function `cmd_capture_pane_exec': cmd-capture-pane.c:(.text+0x549): undefined reference to `evbuffer_pullup' cmd-capture-pane.c:(.text+0x554): undefined reference to `evbuffer_get_length' cmd-load-buffer.o: In function `cmd_load_buffer_callback': cmd-load-buffer.c:(.text+0x2cd): undefined reference to `evbuffer_get_length' cmd-load-buffer.c:(.text+0x2f9): undefined reference to `evbuffer_pullup' cmd-pipe-pane.o: In function `cmd_pipe_pane_exec': cmd-pipe-pane.c:(.text+0x221): undefined reference to `evbuffer_get_length' cmd-run-shell.o: In function `cmd_run_shell_callback': cmd-run-shell.c:(.text+0x297): undefined reference to `evbuffer_get_length' cmd-run-shell.c:(.text+0x33a): undefined reference to `evbuffer_pullup' control-notify.o: In function `control_notify_input': control-notify.c:(.text+0x4f0): undefined reference to `evbuffer_pullup' control-notify.c:(.text+0x4fb): undefined reference to `evbuffer_get_length' control.o: In function `control_callback': control.c:(.text+0x26): undefined reference to `evbuffer_readln' format.o: In function `format_cb_pane_tabs': format.c:(.text+0x69c): undefined reference to `evbuffer_get_length' format.c:(.text+0x6c8): undefined reference to `evbuffer_get_length' format.c:(.text+0x6da): undefined reference to `evbuffer_pullup' format.o: In function `format_job_complete': format.c:(.text+0xb1c): undefined reference to `evbuffer_get_length' format.c:(.text+0xb52): undefined reference to `evbuffer_pullup' format.o: In function `format_create': format.c:(.text+0x3a0a): undefined reference to `event_initialized' ...

配置使用

下面是 cshell 的環(huán)境配置

setenv LD_LIBRARY_PATH /home/harriszh/app/lib set path=(/home/harriszh/app/bin:$path)

打開 tmux

在命令行輸入 tmux, 看看能否打開。
我遇到了 tmux 配置文件的問題,我在~/.tmux.conf 里把不支持的命令注釋掉了

定制化

可以直接使用 gpakosz 的 tmux, 安裝方法如下

$ cd $ rm -rf .tmux $ git clone https://github.com/gpakosz/.tmux.git $ ln -s .tmux/.tmux.conf $ cp .tmux/.tmux.conf.local .

要獲取效果,可以直接tmux source ~/.tmux.conf

如果要使用近似 powerline 效果,可以在~/.tmux.conf.local 里注釋 129-132 行, 打開 133-136 行

使用

console 命令

開啟會話:?tmux new -s <session-name>
斷開會話:?tmux deattach
接入之前的會話:?tmux a -t <session-name>
關(guān)閉會話:?tmux kill-session -t <session-name>
關(guān)閉窗口:?tmux kill-session -t <session-name>
關(guān)閉 tmux:?tmux killall
創(chuàng)建一個新的 window:?tmux new-window
列出窗口:?tmux list-windows
0-9 根據(jù)索引轉(zhuǎn)到該 window:?tmux select-window -t
重命名當(dāng)前 window:?tmux rename-window
將 window 垂直劃分為兩個 pane:?tmux split-window
將 window 水平劃分為兩個 pane:?tmux split-window -h
在指定的方向交換 pane:?tmux swap-pane -[UDLR]
在指定的方向選擇下一個 pane:?tmux select-pane -[UDLR]
查看全局設(shè)定:?tmux show-options -g
查看窗口設(shè)定:?tmux show-options -w
查看remote設(shè)定:?tmux show-options -s

下面的命令需要先按 prefix 鍵

基礎(chǔ)

? 獲取幫助信息

會話管理

s 列出所有會話
$ 重命名當(dāng)前的會話
d 斷開當(dāng)前的會話
D 選擇要脫離的會話;在同時開啟多個會話時使用
[ 復(fù)制模式,光標(biāo)移動到復(fù)制內(nèi)容位置,空格鍵開始,方向鍵選擇復(fù)制,回車確認(rèn),q/Esc 退出
] 粘貼模式,粘貼之前復(fù)制的內(nèi)容,按 q/Esc 退出
t 顯示當(dāng)前時間

窗口管理

c 創(chuàng)建一個新窗口
& 關(guān)閉當(dāng)前窗口
l 前后窗口間互相切換
. 修改當(dāng)前窗口編號,相當(dāng)于重新排序
f 在所有窗口中查找關(guān)鍵詞
, 重命名當(dāng)前窗口
w 列出所有窗口
% 水平分割窗口
" 豎直分割窗口
n 選擇下一個窗口
p 選擇上一個窗口
0~9 選擇 0~9 對應(yīng)的窗口

窗格管理

% 創(chuàng)建一個水平窗格
" 創(chuàng)建一個豎直窗格
h 將光標(biāo)移入左側(cè)的窗格*
j 將光標(biāo)移入下方的窗格*
l 將光標(biāo)移入右側(cè)的窗格*
k 將光標(biāo)移入上方的窗格*
q 顯示窗格的編號
o 在窗格間切換
} 與下一個窗格交換位置
{ 與上一個窗格交換位置
ctrl+方向鍵 以 1 個單元格為單位移動邊緣以調(diào)整當(dāng)前窗格大小
alt+方向鍵 以 5 個單元格為單位移動邊緣以調(diào)整當(dāng)前窗格大小
alt+o 逆時針旋轉(zhuǎn)當(dāng)前窗格
ctrl+o 順時針旋轉(zhuǎn)當(dāng)前窗格
z 最大化當(dāng)前所在窗格
Page up 向上滾動屏幕,q 退出
Page down 向下滾動屏幕,q 退出
! 在新窗口中顯示當(dāng)前窗格
x 關(guān)閉當(dāng)前窗格> 要使用帶“*”的快捷鍵需要提前配置,配置方法可以參考上文的“在窗格間移動光標(biāo)”一節(jié)。——譯者注

其他

t 在當(dāng)前窗格顯示時間
[ 進(jìn)入 copy-paste 模式,這時可以滾動窗口來選擇

copy mode

在gpakosz/.tmux.git里的配置里已經(jīng)為copy mode重設(shè)了類vi快捷鍵
但在我的某個環(huán)境里它們一直不工作,我花了幾個小時終于搞清楚了原因
在源代碼key-bindings.c里,有下面chars

"bind -Tcopy-mode C-Space send -X begin-selection","bind -Tcopy-mode C-a send -X start-of-line","bind -Tcopy-mode C-c send -X cancel","bind -Tcopy-mode C-e send -X end-of-line","bind -Tcopy-mode C-f send -X cursor-right","bind -Tcopy-mode C-b send -X cursor-left","bind -Tcopy-mode C-g send -X clear-selection","bind -Tcopy-mode C-k send -X copy-end-of-line","bind -Tcopy-mode C-n send -X cursor-down",..."bind -Tcopy-mode-vi Space send -X begin-selection","bind -Tcopy-mode-vi '$' send -X end-of-line","bind -Tcopy-mode-vi , send -X jump-reverse","bind -Tcopy-mode-vi / command-prompt -p'(search down)' 'send -X search-forward \"%%%\"'","bind -Tcopy-mode-vi 0 send -X start-of-line",

一開始我通過C-a :來手工輸入bind -Tcopy-mode-vi Space send -X begin-selection,但發(fā)現(xiàn)還是沒用, 特別是后來我注意到要用C-Space, 而不是Space, 我才意識到有兩種模式,?copy-mode和copy-mode-vi. 試了一下手工輸入bind -Tcopy-mode Space send -X begin-selection果然就行了。 再通過網(wǎng)上查到了進(jìn)入vi mode(set-window-option -g mode-keys vi)的方法并打入到.tmux.conf后,一切問題迎刃而解。

安裝 tmuxinator

tmuxinator 是 tmux 的配置管理工具, 解決了 tmux 服務(wù)器關(guān)機(jī)后 session 丟失問題。tmuxinator 可以根據(jù)配置文件快速創(chuàng)建 tmux 的 session。

gem?install?tmuxinator

在$HOME/.tmuinator/.tmuxinator.bash 里新建

#!/usr/bin/env bash_tmuxinator() {COMPREPLY=()local wordword="${COMP_WORDS[COMP_CWORD]}"if [ "$COMP_CWORD" -eq 1 ]; thenlocal commands="$(compgen -W "$(tmuxinator commands)" -- "$word")"local projects="$(compgen -W "$(tmuxinator completions start)" -- "$word")"COMPREPLY=( $commands $projects )elif [ "$COMP_CWORD" -eq 2 ]; thenlocal wordswords=("${COMP_WORDS[@]}")unset words[0]unset words[$COMP_CWORD]local completionscompletions=$(tmuxinator completions "${words[@]}")COMPREPLY=( $(compgen -W "$completions" -- "$word") )fi }complete -F _tmuxinator tmuxinator mux

然后在$HOME/.bashrc 里增加

source $HOME/.tmuxinator/.tmuxinator.bash export EDITOR='vim'

source $HOME/.bashrc 使其生效

如果用的是 zhs, 使用下面文件

_tmuxinator() {local commands projectscommands=(${(f)"$(tmuxinator commands zsh)"})projects=(${(f)"$(tmuxinator completions start)"})if (( CURRENT == 2 )); then_describe -t commands "tmuxinator subcommands" commands_describe -t projects "tmuxinator projects" projectselif (( CURRENT == 3)); thencase $words[2] incopy|debug|delete|open|start)_arguments '*:projects:($projects)';;esacfireturn }

tmuxinator 常用命令

mux n ws # 創(chuàng)建工程 ws
mux o ws # 打開工程 ws 的配置文件
mux e ws # 同上
mux c ws ws1 # 復(fù)制 ws 工程到 ws1
mux d ws # 刪除 ws 工程
mux l # 顯示所有工程
mux ws # 開啟 ws 工程

配置

在 new 一個工程后,會打開一個文本

name: ws # session名稱 root: ~/ # 工程根目錄,活動Pane會首先cd到此目錄windows:- editor: # 第1個名為Editor的Windowlayout: main-vertical # Pane的布局panes: # 各個Pane- vim # 第一個Pane運(yùn)行vim命令- guard # 第二個Pane運(yùn)行g(shù)uard命令- server: bundle exec rails s # 第2個名為server的Window,運(yùn)行命令為bundle- logs: tail -f log/development.log # 第3個名為logs的Window,運(yùn)行命令為tail

可以修改上面的 editor, server, logs (window 名)
或者 panes 下面的各個 panes 要執(zhí)行的命令, 如果什么也不執(zhí)行,就寫上-

bug fix

在 tmuxinator 里,刪除工程時會報如下錯誤

$ tmuxinator d ws Are you sure you want to delete ws?(y/n) y /usr/local/lib/ruby/gems/2.4.0/gems/tmuxinator-0.9.0/lib/tmuxinator/cli.rb:220:in `block in delete': uninitialized constant Tmuxinator::Cli::FileUtils (NameError) Did you mean? FileTestfrom /usr/local/lib/ruby/gems/2.4.0/gems/tmuxinator-0.9.0/lib/tmuxinator/cli.rb:215:in `each'from /usr/local/lib/ruby/gems/2.4.0/gems/tmuxinator-0.9.0/lib/tmuxinator/cli.rb:215:in `delete'from /usr/local/lib/ruby/gems/2.4.0/gems/thor-0.20.0/lib/thor/command.rb:27:in `run'from /usr/local/lib/ruby/gems/2.4.0/gems/thor-0.20.0/lib/thor/invocation.rb:126:in `invoke_command'from /usr/local/lib/ruby/gems/2.4.0/gems/thor-0.20.0/lib/thor.rb:387:in `dispatch'from /usr/local/lib/ruby/gems/2.4.0/gems/thor-0.20.0/lib/thor/base.rb:466:in `start'from /usr/local/lib/ruby/gems/2.4.0/gems/tmuxinator-0.9.0/bin/tmuxinator:15:in `<top (required)>'from /usr/local/bin/tmuxinator:23:in `load'from /usr/local/bin/tmuxinator:23:in `<main>'

需要在/usr/local/lib/ruby/gems/2.4.0/gems/tmuxinator-0.9.0/lib/tmuxinator/cli.rb 第 2 行加上

require 'fileutils'

總結(jié)

tmux最大的好處是可以保存狀態(tài),對于登錄到服務(wù)器工作的人,可以節(jié)省大量時間,而且多窗口省去了開非常多窗口切換的時間。使用它可以極大提高工作效率。而且可定制化,相較于同類瓦片式窗口管理器,提供了更多的定制和快捷鍵,是同類軟件中的佼佼者。

超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的多窗口管理器Tmux - 从入门到精通的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。