33237
neovimとtmuxを使用しています。c++でコードを書く際にcppmanでドキュメントを確認したく思ったので、<https://stackoverflow.com/a/30373736>を参考に

```

     autocmd FileType cpp set keywordprg=cppman
     command! -nargs=+ Cppman silent! call system("tmux split-window -bh cppman " . expand(<q-args>))
     autocmd FileType cpp nnoremap <silent><buffer> K <Esc>:Cppman <cword><CR>
     autocmd FileType cpp vnoremap <silent><buffer> K <Esc>:Cppman <cword><CR>
    
```

をinit.vimに追加して利用しています。しかしこの方法では、もともと横並びに2つのペインが並んでいる場合には  
(0、1が元のペイン、1からcppmanを実行すると2にcppmanが開く)

```

     cppman利用前    cppman利用中     cppman利用後
      _________      __________     _________
     | |       |    | |   |   |    |     |   |
     |0|   1   | -> |0| 2 | 1 | -> |  0  | 1 |
     |_|_______|    |_|___|___|    |_____|___|
    
```

のようにレイアウトが崩れてしまいます。tmuxのヘルプを見た所hookは使えそうかと思い

```

    1. tmux set-hook pane-exited "swap-pane"
    2. tmux set-hook -u pane-exited
    
```

を処理に挟みたいと考えたのですが、これ以上は分かりませんでした。これら(あるいはそれ以外)の方法でうまく動かす方法はありますでしょうか。
CC BY-SA 3.0
2017-03-09T09:28:18.453
33212
2017-03-10T08:26:55.690
2017-05-23T12:38:56.467
-1
20997
question
vim tmux
cppmanをtmuxの左ペインに開き、閉じる際にレイアウトを崩さない方法
かなり無理やりですが、まず以下の内容のtmux-cppmanというファイルをPATHが通っているどこかに作成して実行権を付与し、

```

    #!/bin/sh
    
    if [ -z "$TMUX_LAYOUT" ]; then
        layout=$(tmux list-windows -F "#{window_layout} #{window_active}" | awk '/ 1$/ {print $1}')
        tmux split-window -bh env TMUX_LAYOUT=$layout $0 "$@"
    else
        cppman "$@"
        tmux kill-pane \; select-layout $TMUX_LAYOUT
    fi
    
```

vimからはこのtmux-cppmanを呼ぶようにする

```

    command! -nargs=+ Cppman silent! call system("tmux-cppman " . expand(<q-args>))
    
```

というのはどうでしょうか。

戦略としては、まずlist-windowsで現在のlayoutを確認して覚えておき、cppmanが終了した後にselect-
layoutでそのlayoutに戻すという物です。  
スクリプトを二重に起動したりしているので、もっとシンプルになればいいんですけれど……
CC BY-SA 3.0
2017-03-10T08:26:55.690
33237
2017-03-10T08:26:55.690
12203
33212
answer