<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 第 3 章 腳本定制 tmux 環境 在項目上工作時,你可能需要運行一大堆的工具和程序集。如果你在做一個 web 應用,你可能需要一個命令窗口,一個文本編輯器,一個數據庫命令窗口,和一個運行著你的自動化測試套件的窗口。這樣就有大一堆的窗口需要管理,一大堆的命令需要輸入。 想象一下你來到了你的工作站前剛坐下,準備開始為你的項目添加新的特性,然后只需要一個簡單的命令就可以把這些程序運行起來,每個程序都運行在一個的 tmux 會話中,擁有它自己的面板或是窗口。我們可以使用 tmux 的客戶端-服務器模型(client-server model)來創建一個定制的腳本來自動地構建開發環境、分割窗口并運行程序。我們接下來會先學習如何手動執行,然后深入學習高級的自動化工具。 ## 3.1 使用 tmux 命令創建一個自定義安裝 我們已經學習了如何使用 tmux 命令來創建新的 tmux 會話,但是 tmux 命令還有很多其它的參數可以使用。例如選擇一個運行中的會話然后把它的窗口分割成面板,改變布局,甚至是在會話內運行程序。 關鍵參數是 `-t`,也就是 target。當我們有一個已命名的 tmux 會話,可以像這樣連接到它: ``` $ tmux attach -t [session_name] ``` 我們使用這個 target 參數來引導命令指向正確的 tmux 會話。所以,如果我們創建了一個新的名為 development 的 tmux 會話,像這樣: ``` $ tmux new-session -s development ``` 然后我們使用 `PREFIX d` 從這個會話分離出來,那么可以使用這個命令讓這個會話水平分割窗口: ``` $ tmux split-window -h -t development ``` 執行完命令后,如果再連接到這個會話,我們就會發現窗口已經分割成了兩個面板。命令: ``` $ tmux attach -t development ``` 實際上,并不需要從 tmux 會話里分離出來再發送命令。可以另開一個終端然后把窗口再次分割,但是這次我們使用垂直分割,命令如下: ``` $ tmux split-window -v -t development ``` 通過這種方法可以非常簡便地自定義當前已存在的工作環境。下面來看看其它的一些命令。 ### 編寫一個項目配置腳本 在第一章,我們討論了譬如 `new-session` 和 `new-window` 的 tmux 命令。下面我們來編寫一個簡單的腳本,創建一個新的 tmux 會話,它含有多個窗口,有一個窗口會包含多個面板。最重要的是,我們讓每個面板都運行不同的程序。 我們從創建一個新的腳本文件開始,在主目錄下創建一個名為 `development` 的腳本。然后賦予這個文件可執行權限,這樣就可以運行它了。命令如下: ``` $ touch ~/development $ chmod +x ~/development ``` 在這個新的腳本文件里,首先創建一個名為 development 的 tmux 會話,內容如下: ``` tmux new-session -s development -n editor -d ``` 在創建這個會話的同時我們給它傳入了一些附加的參數。首先,創建這個會話并為它命名,使用了 `-s` 參數。然后把初始窗口命名為 editor,然后再通過 `-d` 參數立即從這個新的會話中分離。 開始使用會話時,我們希望把工作目錄變更到項目目錄。我們把項目目錄稱作 devproject。當然,在變更到這個目錄之前,最好先創建它,命令如下: ``` $ mkdir ~/devproject ``` 目錄創建之后,我們把下面一行內容添加到配置文件中,這里使用了 `send-keys` 命令: ``` tmux send-keys -t development 'cd ~/devproject' C-m ``` 我們在這行配置的最后添加了一個 `C-m`(Control-M),這樣就向 tmux 里發送了一個回車符。接下來我們就可以重復使用這條命令,在窗口里打開 Vim 編輯器。就像這樣: ``` tmux send-keys development 'vim' C-m ``` 通過這 3 個命令,我們就已經創建了一個新的會話,變更了工作目錄,并打開了一個編輯器。但是我們的工作環境還沒有配置完成。我們來分割一下主編輯窗口,這樣就能在底部擁有一個小的終端窗口。我們使用 `split-window` 命令來完成這項任務。在我們的腳本里,添加這樣一行: ``` tmux split-window -v -t development ``` 這樣就會讓主窗口水平地分割。還可以在分割時指定窗口所占的百分比,像這樣: ``` tmux split-window -v -p 10 -t development ``` 但是我們并不會這樣做,我們會把 `split-window` 命令放到一邊,然后選擇一個 tmux 默認布局—— main-horizontal ——只需要把下面的內容添加到配置中: ``` tmux select-layout -t development main-horizontal ``` 我們已經創建了第一個窗口并把它分割為兩個面板,但是我們需要讓底部的面板需要在打開時就處于項目目錄的位置。我們已經知道如何向 tmux 實例發送命令,接下來我們會學習如何向指定的面板和窗口發送命令。 ### 指定目標面板和窗口 通過例如 `send-keys` 這樣的命令,不僅可以指定目標會話,也可以指定窗口和面板。在第 2 章的配置文件里,我們指定了初始索引為 1,也就是說窗口從 1 開始編號(而不是從 0 開始)。但是這個初始索引并不會影響到面板的索引編號,這也就是我們為什么也要把面板的初始索引設置為 1 的原因。在下面的例子里當前窗口有兩個面板,如圖9(兩個面板)所示: ![document/2015-09-09/55efab36da6cd](https://box.kancloud.cn/document_2015-09-09_55efab36da6cd.jpg) 在 Pane 1 里打開了 Vim 編輯器,然后我們想在 Pane 2 里發送一個命令來改變項目路徑。可以通過這種格式來指定一個具體的面板 `[session]:[window].[pane]`,這個例子里就是 `development:1.2`,把下面這行配置添加到配置腳本里,就會得到我們想要的效果: ``` tmux send-keys -t development:1.2 'cd ~/devproject' C-m ``` 幾乎就要完成了。接下來就可以用我們學到的內容來完成配置,添加一些窗口到會話中。 ### 創建并選擇窗口 我們想要在會話里有第二個窗口并運行全屏大小的控制臺。可以通過 `new-window` 命令來創建新窗口: ``` tmux new-window -n console -t development tmux send-keys -t development:2 `cd ~/development`C-m ``` 創建窗口之后,使用 `send-keys` 命令再次把當前路徑改到項目路徑。在新窗口里只有一個面板,所以只需指定窗口的編號即可。 啟動了新會話后,我們想讓第一個窗口顯示出來,可以使用 `select-window` 命令: ``` tmux select-window -t development:1 tmux attach -t development ``` 可以繼續向這個腳本里添加命令,創建更多的窗口和面板、開始到遠程服務器的連接、追蹤日志文件、連接到數據庫控制臺、或者在開始工作時運行命令獲取最新的代碼。但是我們就講到這里,最后以連接到會話來簡單地結束我們的腳本,讓我們配置的 tmux 會話顯示在屏幕上,準備開始工作。全部腳本如下所示: ``` tmux new-session -s development -n editor -d tmux send-keys -t development 'cd ~/devproject' C-m tmux send-keys -t development 'vim' C-m tmux split-window -v -t development tmux select-layout -t development main-horizontal tmux send-keys -t development:1.2 'cd ~/devproject' C-m tmux new-window -n console -t development tmux send-keys -t development:2 'cd ~/devproject' C-m tmux select-window -t development:1 tmux attach -t development ``` 運行下面這個命令時,我們就會看到如圖10(腳本定制的開發環境)所示的效果: ``` $ ~/development ``` ![document/2015-09-09/55efab7d95c61](https://box.kancloud.cn/document_2015-09-09_55efab7d95c61.jpg) 圖10 - 腳本定制的開發環境 這種方法的缺點就是這個腳本創建了一個全新的會話。如果你之前已經創建過一個 development 會話,然后再次執行這個腳本的話它就無法正常工作。可以修改腳本,檢查是否有同名的會話存在來解決這個問題,使用 `tmux has-session` 命令來檢查,然后之后只有在這個會話不存在時才創建這個會話,就像這樣: ``` tmux has-session -t development if [ $? != 0 ] then tmux new-session -s development -n editor -d tmux send-keys -t development 'cd ~/devproject' C-m tmux send-keys -t development 'vim' C-m tmux split-window -v -t development tmux select-layout -t development main-horizontal tmux send-keys -t development:1.2 'cd ~/devproject' C-m tmux new-window -n console -t development tmux send-keys -t development:2 'cd ~/devproject' C-m tmux select-window -t development:1 fi tmux attach -t development ``` 這樣做就能使一個項目配置正常工作了。你可以修改這個腳本,讓項目名使用一個變量,這樣腳本就能變得通用,但是現在我們來看看另外一些管理多個項目的配置方法。 ## 3.2 設置使用 tmux 配置 `.tmux.conf` 文件本身可以包含命令來設置一個默認的環境。如果想讓 tmux 會話每次都在相同的默認文件夾路徑啟動,或者是想讓它自動地打開一個分割的窗口,可以把這些寫進默認配置文件里,只需使用相似的命令。 還可以指定一個配置文件,讓 tmux 實例在啟動時加載它,只需使用 `-f` 參數。這種方式就不需要改變默認的配置文件,并且可以在項目中檢查配置文件。還可以設置每個項目對應一個配置選項,比如新的鍵盤快捷鍵。 讓我們試試這個吧,現在創建一個名為 `app.conf` 的配置文件。在這個文件里,可以使用在之前章節使用的相同命令,由于是在配置文件里而不是一個 shell 腳本里,我們就無需特別指定 tmux 的每個命令都使用 `tmux` 前綴,配置文件如下: ``` source-file ~/.tmux.conf new-session -s development -n editor -d send-keys -t development 'cd ~/devproject' C-m send-keys -t development 'vim' C-m split-window -v -t development select-layout -t development main-horizontal send-keys -t development:1.1 'cd ~/devproject' C-m new-window -n console -t development send-keys -t development:2 'cd ~/devproject' C-m select-window -t development:1 ``` 請注意,在配置文件的第一行就導入了原始 `.tmux.conf` 文件。這樣就能使用之前定義的所有環境設置,包括快捷鍵和狀態欄設置。這個導入配置文件的命令并不是強制的,但是如果不導入這個文件,就必須使用所有的默認快捷鍵和默認選項,或者只能在這個文件里重新定制選項。 要使用這個配置文件,必須要傳入 `-f` 參數,后面加上配置文件的路徑。還必須使用 `attach` 命令來啟動 tmux,就象這樣: ``` $ tmux -f app.conf attach ``` 這是因為默認 tmux 在啟動時總是調用 `new-session` 命令。我們的配置文件已經創建了一個新的會話,所以如果不使用 `attach` 參數的話就會擁有 2 個 tmux 會話。 這種方法有很大的靈活性,可以通過使用一個名為 tmuxinator 的命令行工具做更多的事情。 ## 3.3 使用 tmuxinator 管理配置 tmuxinator 是一個簡單的工具,可以用它編寫并管理不同的 tmux 配置。我們使用簡單的 YAML 格式來定義窗口布局和命令,然后就可以使用 `tmuxinator` 命令登錄了。和其他方法不同,tmuxinator 為配置文件提供了一個集中的位置和一個更簡單的辦法來創建復雜的布局。它還允許在每個窗口創建之前運行特定的命令。 tmuxinator 的運行需要 Ruby 解釋器,所以你的系統上需要安裝了 Ruby 解釋器才能使用 tmuxinator。MAC OS X 的用戶已經安裝了 Ruby,Linux 用戶可以通過包管理器安裝 Ruby 解釋器。如果你打算不僅僅為了使用 tmuxinator 而安裝 Ruby 解釋器的話,強烈建議通過 RVM 安裝 Ruby,你可以依照 RVM 網站的指引來安裝 Ruby。[RVM 網站鏈接](http://rvm.beginrescueend.com/) 我們使用 Rubygems 安裝 tmuxinator,Rubygems 是 Ruby 的包管理系統。命令如下: ``` $ gem install tmuxinator ``` 如果你沒有使用 RVM,你需要 root 權限來執行這條命令或者使用 sudo 命令。 tmuxinator 需要預先定義 shell 環境變量 $EDITOR,所以如果你還沒設置的話,可以在 Linux 系統上修改你的 `.bashrc` 文件,或者在 OS X 系統上修改 `.bash_profile` 文件。例如,如果你想把 Vim 作為默認的編輯器,你需要在 Bash 配置文件里增加這條語句: ``` export EDITOR=vim ``` 現在就可以創建一個新的 tmuxinator 項目了,我們把它稱作 development。命令如下: ``` $ tmuxinator open development ``` 這會打開我們預定義的 $EDITOR 變量的編輯器并顯示默認的項目配置,就像這樣: ``` 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 windows: - 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 ``` 這是一個 Ruby on Rails 開發者使用 Git 工作的一個非常棒的工作環境。它創建了一個含有 8 個窗口的 tmux 會話。第 1 個窗口被分為 3 個面板,使用了 main-vertical 界面布局。剩下的窗口打開了一些服務器連接和控制臺,如圖11(使用 tmuxinator 默認配置的 Rails 工作環境)所示: ![document/2015-09-09/55efab9182e28](https://box.kancloud.cn/document_2015-09-09_55efab9182e28.jpg) 圖11 - 使用 tmuxinator 默認配置的 Rails 工作環境 如你所見,tmuxinator 讓定義窗口和面板變得非常簡單,而且也很容易讓它們執行獨立的命令。可以在每個窗口加載時指定它要執行的命令。讓我們移除這些配置然后構建一個開發環境,在窗口上部打開 Vim,下面顯示終端,初始化時進入 `~/devproject` 路徑中。配置如下: ``` project_name: devproject project_root: ~/devproject windows: - editor: layout: main-horizontal panes: - vim - #empty, will just run plain bash - console: # empty ``` `yml` 文件格式使用的是 2 個空格作為縮進,所以你一定要確保在寫入文件時保證文件里的縮進完全正確。 要使用新環境,我們保存剛才的配置文件然后執行下面的命令: ``` $ tmuxinator devproject ``` tmuxinator 就會自動地加載原始 `.tmux.conf` 文件,應用設置,然后使用剛才配置文件指定的窗口和面板設置。如果想再對環境有所修改,只需要再次執行這個命令: ``` $ tmuxinator open devproject ``` 默認情況下,tmuxinator 的配置文件位于 `~/.tmuxinator/` 文件夾里,所以你可以在這里找到配置文件、備份配置文件,或是將配置文件與他人一起分享。 其實,tmuxinator 只是一個構造了一個腳本來執行獨立的 tmux 命令,就像在之前在腳本文件里寫的那樣。它提供了一個非常漂亮又好記的語法。但是,要想使用 tmuxinator 你需要先安裝一個 Ruby 解釋器,所以它可能無法實現在任意環境下都使用 tmuxinator 來管理 tmux 的這種需求。 ## 3.4 接下來做什么? 你可以在 shell 里使用 tmux 的每個命令,這就意味著你可以編寫腳本來自動化 tmux 的幾乎所有功能,包括運行會話等。例如,創建一個快捷鍵來運行一個 shell 腳本文件,這個腳本文件把當前的窗口分割為兩個面板并把你的行為寫入到 Web 和數據庫的生產服務器的日志中。我們會在第 6 章討論這些技術細節。 我們已經探討了編寫 tmux 腳本的 3 種不同方式,而且已經數次優化了配置。我們現在知道如何設置項目、在面板和窗口之間來回切換以及登錄控制臺。但是當我們在 tmux 會話里使用應用程序時,程序日志或者是測試結果會開始不停的刷屏。所以在接下來我們會學習如何處理輸出緩沖區以及如何復制、粘貼文本。 ### 以備查閱 #### 可腳本化的 tmux 命令 |命令 | 描述| |---|---| |`tmux new-session -s development -n editor`| 創建一個名為 development 的會話,將第一個窗口命名為 editor | |`tmux attach -t development`| 連接到一個名為 development 的會話 | |`tmux send-keys -t development '[keys]' C-m`| 向 development 會話的活動窗口或面板發送鍵盤命令,`C-m` 相當于按下回車鍵 | |`tmux send-keys -t development:1.0 '[keys]' C-m `| 向 development 會話的第 1 個窗口和第 1 個面板發送鍵盤命令,`C-m` 相當于按下回車鍵 | |`tmux select-window -t development:1`| 選擇 development 會話的第 1 個窗口,讓它作為活動窗口 | |`tmux split-window -v -p 10 -t development`| 在 development 會話里垂直地分割當前窗口,把它分為水平的 2 個面板并設置它的高度為總窗口大小的 10% | |`tmux select-layout -t development main-horizontal`| 設置 development 會話的布局為 main-horizontal | |`tmux -f app.conf attach`| 加載配置文件 app.conf 并連接到由這個配置文件所創建的一個會話 | |`tmuxinator open [name]`| 在項目名 [name] 路徑下使用默認的編輯器打開配置文件。如果不存在就創建一個新的配置文件 | |`tmuxinator [name]`| 對指定項目加載 tmux 會話。如果會話不存在或無法連接到會話就根據項目的配置文件創建一個新會話 | |`tmuxinator list`| 列出當前的項目 | |`tmuxinator copy [source] [destination]`| 復制一個項目配置文件 | |`tmuxinator delete [name]`| 刪除指定的項目 | |`tmuxinator implode`| 刪除當前所有的項目 | |`tmuxinator doctor`| 使用 tmuxinator 和系統配置查找問題 |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看