VSCodeでタスクを作成して、テンプレの召喚やコンパイルをする

#はじめに
こんにちは、今回はvscodeで作業を効率化するために、自分でタスクを作成したときのことを記します。
c++を例に書いてますが、他の設定でも参考になると思います。

今回は、フォルダごとの設定で、taskの作成をしてみます

まず作業フォルダとして、myworkフォルダを作成します。
vscodeではフォルダを開く->myworkを選択します。
そしてmyworkフォルダ以下に.vscodeフォルダを作成し、そこにtasks.jsonを作成します。
ソースコードはmywork/source以下に置くことにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/fb249edb-97c7-4be7-e840-6c29c6e7fcff.png)

#タスクでコンパイルさせる
以下のようなコードをコンパイルしたいとき

```cpp:main.cpp
#include <iostream>

int main(){
    std::cout<<"Hello Task"<<"\n";
}
```

```bash:PowerShell
g++ source/main.cpp -o program
```
とコマンドを実行してやれば、program.exeがmywork下にできる。

これをTaskでやることを考える。

```json:tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "cppCompile",
            "command": "g++",
            "args": [
                "${file}",
                "-o",
                "program"
            ],
            "group":"none",
        },
    ]

}
```
.vscode/tasks.jsonに上の用に書いておくと、
main.cppをエディタで開いているときに
Ctrl+Shift+Pでコマンドパレットを開きRunTask
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/968cbf4d-e435-9446-5ca1-87d7d5b0c40c.png)
そうすると上で追加したタスクがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/2309634d-7621-daf2-17e1-0184872b030f.png)
それを実行すると、
program.exeができている。

これは、mywork以下のどこにあるコードでも可能です。
tasks.jsonのコードが、現在エディタで開いているコードに対して、
コンパイルし、mywork下にprogram.exeとして実行ファイルを作成するよう書かれているからです。

これはvscodeが現在のファイルなどを示す変数を定義してくれており便利にかけます。

https://code.visualstudio.com/docs/editor/variables-reference
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/1d45a49c-ca9c-f36a-39c4-47c2be6638ca.png)

Taskで実行するコマンドの引数に${file}を指定すれば、現在開いているファイルに対する
コンパイルなどなんらかのことができます。

#テンプレ召喚

```cpp:People.txt
class People{
public:
void Plus(int num);
private:
int m_age;
string m_name;
}

```
コードを書いているとき、上のようなclassが欲しくなったとします。
今回はコーディング中に上のPeople.txtを好きな位置に召喚するタスクを考えます。

まず、main.txtのN行目にtmp.txtをコピペするようなスクリプトを考えます。

```python:cptemp.py
import sys
#How to use
# cptemp.py 編集中ファイル　行  テンプレが書かれたファイル
fname=sys.argv[1]
f1name=sys.argv[3]
linenum=sys.argv[2]
with open(fname) as f:
    data = f.readlines()
linenum=(int)(linenum)-1
with open(f1name) as f:
    predata = f.readlines()
kaki=''
for i in predata:
    kaki+=i
data.insert(linenum,kaki)
with open(fname,mode='w') as f:
    f.writelines(data)
```

上のcptemp.pyを実行すると、指定行に指定したファイルを貼り付けます。
toolsというフォルダを作り、このスクリプトをおいておき、
Taskから呼び出し、テンプレを呼び出します。
cptemp.py引数にはvscodeでもともと定義された${file},${lineNumber}などを与えれば、
うまくいきそうだ。


ここまでのファイル構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/7b46c62f-747f-d1fc-3003-570d80dd93e2.png)


そして、tasks.jsonにadd Peopleというタスクを追記します。

```tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "cppCompile",
            "command": "g++",
            "args": [
                "${file}",
                "-o",
                "program"
            ],
            "group":"none",
        },
        {
            "type": "shell",
            "label": "add people",
            "command": "python3",
            "args": [
                "${workspaceFolder}/tools/cptemp.py",
                "${file}",
                "${lineNumber}",
                "${workspaceFolder}/template/People.txt",
            ],
            "group":"none",
        },
    ]

}
```

これでmain.cpp編集中に、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/bb0c2b60-03ee-79ab-242a-66e01b9e198b.png)
Ctrl+Shift+Pでコマンドパレットを開きRunTask
からadd Peopleを選択して実行すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/92a61f3b-2eea-f091-7781-c128bd37649b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763301/b53aecfc-6d9a-d7a0-e1fc-53b8eb9aeff6.png)

上記のように追加されました！！！

#おわりに
とりあえず、とくやる作業をタスクとして呼び出せるようにしたいという目的で
やったことをまとめました。

当然最適なやり方ではないですし、
Taskの書き方なども適当なので、他の方の記事も読んだほうがいいと思います。
ありがとうございました。