(開発6)vim+tmux環境の構成

# ■概略
オープンソースエンジニア歴30年超の筆者が2023年からIBMiを学びだした学習記録です
IBMiの開発環境をvim+tmuxで構築します
筆者はあまりSEUに詳しくありませんが、行単位でコピー&ペーストできるところとか、
I{数字}で行の挿入ができるところとかvimに通じるところがあると感じています
SEUユーザはVSCodeよりvimの方が馴染むのでは…？(ちょっと無理やりかも…)

# <u>■vim+tmuxの使い方</u>
### 1) starttmux.bash(後述)を起動すると以下の画面になる
筆者はWindows Terminalでフォント大きめ、1つ目のタブでvim+tmux、
2つ目をコンパイル用で開いている
```
$ ./starttmux.bash
```
![vim+tmux01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/729a2b08-983b-2390-c921-13551cb3acef.png)

### 2) windowの切り替え
[Ctrl-e]+[w] で下記windowの切り替え画面が表示される  
[k] で上 [j]で下に移動し、[enter]で切替えるwindowを選択する  
筆者はQFFRPG編集用、bashスクリプト編集用、git作業用、md(README.md等)用の
windowを用意している
bashスクリプト実行用はコンパイルリストが長くスクロールが必要なので別タブに
している

![vim+tmux02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/9f1a4f3c-99dc-6190-6f8c-e4799efcf0c5.png)

### 3) vimの起動とvimfilerの起動

windowを切り替えたら、vimを起動する  
```
$ vim
```

vim内で :e . でvimfilerを起動すると以下の画面になり選択したファイルを開ける
```
:e .
```
![vim+tmux03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/67365604-49d5-eff9-b8f1-b344d53bac23.png)

<u>◯vimfilerの操作</u>  
<table border="1" style="border-collapse:collapse;width:500px">
<tr bgcolor=silver><th>キー</th><th>操作内容</th></tr>
<tr align=center><td>h</td><td>親ディレクトリに移動</td></tr>
<tr align=center><td>t</td><td>ディレクトリを展開</td></tr>
<tr align=center><td>[enter]</td><td>ファイルを開く/ディレクトリに入る</td></tr>
<tr align=center><td>N</td><td>ファイルを新規作成</td></tr>
<tr align=center><td>K</td><td>ディレクトリを新規作成</td></tr>
<tr align=center><td>cc</td><td>ファイルをコピー</td></tr>
<tr align=center><td>r</td><td>ファイルをリネーム</td></tr>
</table>

### 4) vimの操作
vimmerはそれぞれの操作を持っているが、筆者のよく利用する操作は以下
特に左右分割が便利

<u>■vimの操作</u>  
<table border="1" style="border-collapse:collapse;width:500px">
<tr bgcolor=silver><th>キー</th><th>操作内容</th></tr>
<tr align=center><td>h</td><td>親ディレクトリに移動</td></tr>
<tr align=center><td>hjkl</td><td>カーソル移動 </td></tr>
<tr align=center><td>yyかy{n}y</td><td>コピー </td></tr>
<tr align=center><td>p</td><td>ペースト </td></tr>
<tr align=center><td>[shift]-[k]か[j]</td><td>行選択 </td></tr>
<tr align=center><td>[Ctrl-v]-[h][j][k][l]</td><td>矩形選択 </td></tr>
<tr align=center><td>^</td><td>行先頭移動 </td></tr>
<tr align=center><td>$</td><td>行末移動 </td></tr>
<tr align=center><td>:1</td><td>ファイル先頭移動 </td></tr>
<tr align=center><td>G</td><td>ファイル末尾移動 </td></tr>
<tr align=center><td>:set number</td><td>行番号表示 </td></tr>
<tr align=center><td>:vs</td><td>左右分割 </td></tr>
<tr align=center><td>[Ctrl-w]-[h]か[l]</td><td>左右ペイン移動 </td></tr>
<tr align=center><td>:sp</td><td>上下分割 </td></tr>
<tr align=center><td>[Ctrl-w]-[j]か[k]</td><td>上下ペイン移動 </td></tr>
<tr align=center><td>:q</td><td>ペイン終了 </td></tr>
</table>

### 5) tmuxを抜ける
[Ctrl-e]+[d] でtmuxを抜け、$に戻るのでログアウト等する  
  
### 6) 再度ログインし、tmuxに接続する
再度sshログインし $ になったら、以下コマンドで残っているtmuxセッションに
再接続する  
```
$ tmux a -t as400dev
```

### 7) RPGLEソース(桁位置固定)を開いた時
VSCodeで縦線を表示したように、vimでも縦線を表示できる
![vim+tmux04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/0fda584f-b113-6039-f5b3-3acf2cec70bc.png)

◯設定手順
~/.vim/ftdetectディレクトリに各拡張子用の設定を作成する
```
｛ユーザ}@as400dev:~/.vim/ftdetect$ pwd
/home/{ユーザ}/.vim/ftdetect
｛ユーザ}@as400dev:~/.vim/ftdetect$ ls
clp.vim  rpg.vim  rpgle.vim
```

clp.vim
```
" my filetype file
augroup filetypedetect
    au! BufRead,BufNewFile *.clp          setfiletype clp
    au! BufRead,BufNewFile *.CLP          setfiletype clp
    au! BufRead,BufNewFile *.clle         setfiletype clp
    au! BufRead,BufNewFile *.CLLE         setfiletype clp
augroup END
```

rpgle.vim
```
" my filetype file
augroup filetypedetect
    au! BufRead,BufNewFile *.rpgle        setfiletype rpgle
    au! BufRead,BufNewFile *.sqlrpgle     setfiletype rpgle
    au! BufRead,BufNewFile *.RPGLE        setfiletype rpgle
    au! BufRead,BufNewFile *.SQLRPGLE     setfiletype rpgle
augroup END
```

.vimrcにどの桁位置に色をつけるか設定する
```
" ### 縦線を引く
autocmd FileType clp   set colorcolumn=14,70
autocmd FileType clp   highlight ColorColumn term=reverse ctermfg=white ctermbg=2
autocmd FileType rpgle set colorcolumn=6,12,26,36,50,68,81
autocmd FileType rpgle highlight ColorColumn term=reverse ctermfg=white ctermbg=2
```

# <u>■vimの設定</u>
筆者は古い人なのでNeoBundleを今でも使っています
### 1) /home/{ユーザ}/.vimrcに以下を作成する 
```
set enc=utf-8
set fenc=utf-8
set nobackup
set noswapfile
set ambiwidth=double
set paste

" ### 縦線を引く
autocmd FileType clp   set colorcolumn=14,70
autocmd FileType clp   highlight ColorColumn term=reverse ctermfg=white ctermbg=2
autocmd FileType rpgle set colorcolumn=6,12,26,36,50,68,81 
autocmd FileType rpgle highlight ColorColumn term=reverse ctermfg=white ctermbg=2

" #### ステータスライン
" 現在列数
set statusline=[COL=%c]\ 
" ファイル名
set statusline=%F
" 変更チェック表示
set statusline+=%m
" 読み込み専用かどうか表示
set statusline+=%r
" ヘルプページなら[HELP]と表示
set statusline+=%h
" プレビューウインドウなら[Prevew]と表示
set statusline+=%w
" これ以降は右寄せ表示
set statusline+=%=
" file encoding
set statusline+=[ENC=%{&fileencoding}]
" 現在行数/全行数
set statusline+=[LOW=%l/%L]
" ステータスラインを常に表示(0:表示しない、1:2つ以上ウィンドウがある時だけ表示)
set laststatus=2

" #### NeoBundle用設定
if has('vim_starting')
   " 初回起動時のみruntimepathにneobundleのパスを指定する
   set runtimepath+=/home/{ユーザ名}/.vim/bundle/neobundle.vim/
endif

" NeoBundleを初期化
call neobundle#begin(expand('/home/{ユーザ名}/.vim/bundle/'))

"""" インストールするプラグインをここに記述
" vimfiler {{{
    NeoBundle 'Shougo/vimfiler'
    "vimデフォルトのエクスプローラをvimfilerで置き換える
    let g:vimfiler_as_default_explorer = 1
    "セーフモードを無効にした状態で起動する
    let g:vimfiler_safe_mode_by_default = 0
    "現在開いているバッファをIDE風に開く
    nnoremap <silent> [unite]i :<C-u>VimFilerBufferDir -split -simple -winwidth=35 -no-quit<CR>

    "デフォルトのキーマッピングを変更
    augroup vimrc
        autocmd FileType vimfiler call s:vimfiler_my_settings()
    augroup END
    function! s:vimfiler_my_settings()
        nmap <buffer> <ESC> <Plug>(vimfiler_exit)
        nmap <buffer> q <Plug>(vimfiler_exit)
        nmap <buffer> Q <Plug>(vimfiler_hide)
    endfunction
"}}}

" vim-indent-guides {{{
    NeoBundle "nathanaelkane/vim-indent-guides"
    colorscheme default
    set tabstop=4
    set expandtab
    set shiftwidth=4
    let s:hooks = neobundle#get_hooks("vim-indent-guides")
    let g:indent_guides_enable_on_vim_startup=1
    function! s:hooks.on_source(bundle)
        let g:indent_guides_guide_size = 1
    endfunction
" }}}

call neobundle#end()
""""
" NeoBundleの後に必要な設定
filetype plugin indent on
syntax on
```

### 2)NeoBundleインストール
```
$ mkdir ~/.vim
$ mkdir ~/.vim/bundle
$ git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```
### 3) NeoBundleプラグイン(vimfiler他)をインストール
```
$ vim (NeoBundleを設定したユーザで起動する)
:NeoBundleInstall
```

### 4) vimのRPGのハイライト
https://github.com/paulpritchard68/VimRPG    
上記をダウンロードし、zipを展開して~/.vimに置く  
以下のようになるはず
```
.vim
└── syntax
    ├── clp.vim
    └── rpgle.vim
```

# <u>■tmuxの設定</u>
### 1) /home/{ユーザ}/.tmux.confを作成する
```
# キーバインドをC-eに変更する
set -g prefix C-e
unbind C-b
# bind C-e send-prefix

#set-option -g allow-rename off
## ステータスバー全体の設定
# 256色端末を使用する
set-option -g default-terminal screen-256color
# ステータスバーのUTF-8サポートを有効にする
set -g status-utf8 on
# リフレッシュの間隔(デフォルト 15秒)
set -g status-interval 60

## 左パネル
# 左パネル(ホスト名:[セッション名])
set -g status-left-length 40
set -g status-left '#[fg=black,bg=cyan,bold]#H#[fg=black]:#[fg=black][#S]#[default]'

## ウィンドウリスト
set-window-option -g automatic-rename off
set-window-option -g allow-rename off
# ウィンドウ名をstarttmux.bashで指定した名前から変えない
set-window-option -g automatic-rename off
set-window-option -g allow-rename off
# ウィンドウのインデックスを1から始める
set -g base-index 1
# ウィンドウリストの位置を中心寄せにする
set -g status-justify centre
# window-status のフォーマットを指定する。
set-window-option -g window-status-format "#[fg=colour255,bold] #I #[default]"
# ウィンドウリストの位置を左寄せにする
set -g status-justify left
# カレントウィンドウの window-status のフォーマットを指定する
set-window-option -g window-status-current-format "#[fg=colour255,bg=colour27,bold] #I #W #[default]"

## 右パネル
# 右パネル(日時)
set -g status-right '#[fg=black,bg=cyan,bold] [%Y-%m-%d(%a) %H:%M]#[default]'
```

### 2) tmuxの起動スクリプトstarttmux.bashを作成する
/home/{ユーザ}/starttmux.bashを作成する  
src1,src2や＄DIR,＄DIR/srcは自分の環境に合わせて変更する  
```
#!/bin/bash
#
# stop exist tmux
kill `ps axuw|grep 'tmux new'|awk '{print $2}'`
# start tmux
DIR="/home/{ユーザ}/"
tmux new-session -n 'bash  ' -d -s as400dev "bash"
tmux new-window  -n 'git   ' -c "$DIR" "bash"
tmux new-window  -n 'build ' -c "$DIR" "bash"
tmux new-window  -n 'src1  ' -c "$DIR/src" "bash"
tmux new-window  -n 'src2  ' -c "$DIR/src" "bash"
tmux new-window  -n 'src3  ' -c "$DIR/src" "bash"
tmux new-window  -n 'src4  ' -c "$DIR/src" "bash"
tmux attach -t as400dev
```

作成後以下で実行権限を付与する  
```
$ chmod +x starttmux.bash
```