Vimでのpaiza下準備をステップバイステップで丁寧に


# この記事の対象読者

- ドットインストールや入門書で基本の勉強を済ませたのでpaizaで問題を解いてみたい方

- vimの練習も兼ねてとりあえず最低限+αの準備をしたい方

※AtcoderやICPC等の競技プログラミングコンテストを始めてみたい方にはちょっとレベルの低い話かもしれません。
※今回はPHPで書いていますが、他の言語でも基本同じです。

本記事は[Zenn](https://zenn.dev/kumamoto/articles/e0738b762b26a2)の方にも転載済です。


# まずは実行ファイルと標準入力用のファイルを準備

Desktopに移動してpaizaというディレクトリ(フォルダのこと)を作成しましょう。
※ディレクトリ名はすきな名前でおｋです。
※DesktopでなくDocuments配下でも問題ありません。

```
$ cd ~/Desktop
$ mkdir paiza
```
※cdはchange directoryでディレクトリを移動するコマンド、mkdirはmake directoryでディレクトリを作成するコマンド

paizaディレクトリ下に実行ファイルと標準入力ファイルを作成します。

```
$ cd paiza
$ touch main.php input.dat
```
※touchは本来ファイル作成のコマンドではないが今回は説明を省略します。詳しいことを知りたい方は[Linuxコマンド集 touch](https://eng-entrance.com/linux-command-touch)を参考にしてみてください。

ちなみに.datファイルのdatは[IT用語辞典/e-Words](http://e-words.jp/w/DAT%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html)で説明されている通り『「データ」（data）の略号で、プログラムなどではなくデータを保存していることを示して』います。

# [前半]簡単にvimで実行が出来るようにする

vimを開いているときに「space + e」で設定しているシェルスクリプトが実行されるようにしましょう。

.vimrcを編集しましょう。

```

//ホームディレクトリに移動
$ cd ~/
//.vimrcを編集
vim .vimrc
```

.vimrcには下記のように書いてみましょう。

```
set number
" exec
nnoremap <space>e :wa \| !echo -e '\e[38;5;0m\e[48;5;51m --- exec ---  \e[m';./exec.sh<cr>
```

これでvimを開いているときに「space + e」でexec.sh(後ほど作っていきます！ご安心を！)に書かれているシェルスクリプトが実行されます。
またset numberのおかげでvimに行番号が自動的に入るようになります。

# [後半]簡単にvimで実行が出来るようにする

次にexec.shの中身を編集します。

```
//paizaディレクトリに移動
$ cd ~/Desktop/paiza
//exec.shを編集
$ vim exec.sh
```

main.phpにinput.datが入力されて実行し、その結果が^aファイルに書き込まれるスクリプトを書いてみましょう。

```exec.sh
php main.php < input.dat | tee ^a
```

※より正確に言えばteeコマンドは「標準出力+ファイルへの書き込み」の両方を担うものです。teeを使うことでファイルへの書き込みだけでなく出力をその場で目視出来るようになります。詳しくはターミナル上で`man tee`で読んでみてね。

# 簡単なプログラムで実験してみよう!

では簡単なプログラムを書いて上手く動くか実験してみましょう。

```input.dat
1
5
6
```

```main.php
//標準入力を受け取る
$first_data = fgets(STDIN);
echo $first_data . PHP_EOL;

$second_data = fgets(STDIN);
echo $second_data . PHP_EOL;

$third_data = fgets(STDIN);
echo $third_data . PHP_EOL;
```

main.phpを編集中に「space+e」と押してください。
1,5,6が順番に出力されるはずです。

また同じディレクトリ下に^aファイルが出来ているはずです。中身を確認すると出力結果と同じデータが入っています。

```
$ ls
exec.sh main.php input.dat ^a
$ view ^a

->^aの中身は下記のようになっているはず！
1
5
6
```

次はoutput.datというファイルを同じディレクトリの中に作ってみましょう。
まずはoutput.datの中身を^aと同じにします。

```output.dat
1
5
6
```

下記のように^aとoutput.datの中身を比較してみます。
差異がないので何も出ないはずです。
```
$ cd ~/Desktop/paiza
$ diff ^a output.dat
```

次にoutput.datの3行目だけ^aと違う数値にすると。。。

```output.dat
1
5
7
```

今回は3行目に差異が教えてくれます!!!

```
$ diff ^a output.dat
3c3
< 6
---
> 7
```

お疲れ様です！これでpaizaのスコアアップ問題を解く準備完了です！お疲れ様でした！

# この後
![スクリーンショット 2020-12-24 17.35.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403039/ec070d43-213c-cffe-baa6-46ba8ba26ed2.png)
[tmux](https://github.com/tmux/tmux/wiki)を導入してターミナルの画面を分割したり、[iTerm2](https://iterm2.com/)を入れて半透明のおしゃれな環境を構築するなどして楽しんでみてください！
=>iTerm2については筆者も[[iTerm2入門]開発効率アップの基本機能/おすすめ設定をチートシートLikeにまとめたよ](https://zenn.dev/kumamoto/articles/bb3f416e34349e9ae13f)で入門記事書いたのでぜひ参考にしてみてください。
※上記は筆者のiTerm2のスクショ。もっとツヨツヨターミナル環境な人がたくさんいるので参考程度で。

# [最後に]参考になるかもしれないサイト

- [AOJ-ICPC](http://aoj-icpc.ichyo.jp/)
paizaに比べると少しムズカシイ(最低ランクの問題でもBランク以上？)が他の人の解答が見れるのでオススメです。

- [vimtutorでVim力をアップ](https://dev.classmethod.jp/articles/vim_powerup_with_vimtutor/)
vimの練習をしたい方はまず上記で紹介されているvimチューターから始めるのがオススメです。






![スクリーンショット 2020-12-24 17.35.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403039/94a89adc-9333-2255-14bf-881a8a087a01.png)