VSCode設定メモ: カレントタブのディレクトリのMakefileを一発で呼ぶ

# Notepad++からVS Codeへ
今まで様々なテキストエディタを試してきて, 満足するエディタは`Notepad++`だけだった. 
だが, 最近`VS Code`と`拡張機能`の組み合わせにより, 同等の機能が実現できたため, 入力補完が優秀な`VS Code`へ移行した. 
## Notepad++
これまで, テキスト編集からプログラミング, LaTeXまで全てNotepad++でやってきた. 
`NppExec`というプラグインが優秀で, Notepad++にターミナル環境を与えてくれていた. 
<img width="913" alt="notepad++.png" src="https://qiita-image-store.s3.amazonaws.com/0/294661/51a0d2a8-fd08-2f7b-bee4-b9ae96294b6e.png">
さらに, `Follow ${CURRENT_DIRECTORY}`という神がかったオプションまであった. 
この機能は, 下のターミナルのディレクトリが, 現在開いているタブの階層になるというものだ. 

しかも`F6`キーで登録したコマンドを実行可能だった. 
なので, いつも`make`を登録しておき, カレントディレクトリを気にすることなく`F6`を押すだけでコンパイルができていた. 


### LaTeX用Makefile
カレントディレクトリの全ての`.tex`ファイルをコンパイルする. 

```makefile:Makefile
FILE = $(wildcard *.tex)
PDF  = $(FILE:.tex=.pdf)
DVI  = $(FILE:.tex=.dvi)

.PHONY:run
run:$(PDF) $(DVI)

%.pdf: %.dvi
	dvipdfmx $<
	# cmd /c start $@

%.dvi: %.tex
	platex $<
	# pbibtex $*

#クリーンして実行
.PHONY: all
all: clean run

#クリーン
.PHONY:clean
clean: 
	rm -f $(PDF) $(DVI)
```

- `cmd /c start $@`のコメントアウトを外せば, コンパイル後PDFを開く
- `pbibtex $*`は, .bib用

### C++用Makefile
cppコンパイル用. 

```makefile:Makefile

###################################################
# Makefile (*.cppをコンパイルする場合)
# コンパイルしたいソースがあるフォルダと同じところに置く
# ディレクトリ階層図
# this
# |--- *.cpp          (コンパイルしたいソースファイル)
# |--- Makefile
# |--- run.exe        (生成される実行ファイル)
# |--- obj            (生成されるフォルダ)
#      |--- *.o       (生成されるオブジェクトファイル)
#      |--- *.d       (生成される依存関係ファイル)
#
# 実行コマンド
# make         (更新されたファイルのみコンパイル)
# make all     (クリーンしてビルド)
# make clean   (クリーン)
###################################################
AR       = ar
ARFLAGS  = rus

CXX      = g++
CXXFLAGS = -g -MMD -MP -Wall -Wextra -Winit-self -Wno-unused-parameter -std=c++11 -O3

RM       = rm -f
LDFLAGS  =
LIBS     =
INCLUDE  = 
#実行ファイル
TARGET   = ./run.exe
#オブジェクトファイル保存フォルダ
OBJDIR   = ./obj
#ソースファイル
SOURCES  = $(wildcard *.cpp)
#オブジェクトファイル
OBJECTS  = $(addprefix $(OBJDIR)/, $(SOURCES:.cpp=.o))
#依存関係ファイル
DEPENDS  = $(OBJECTS:.o=.d)
#実行ファイル作成
$(TARGET): $(OBJECTS) $(LIBS)
	$(CXX) -o $@ $^ $(LDFLAGS)
#ソースファイルをコンパイル
$(OBJDIR)/%.o: %.cpp
	@if [ ! -d $(OBJDIR) ];\
	then echo "mkdir -p $(OBJDIR)";mkdir -p $(OBJDIR);\
	fi
	$(CXX) $(CXXFLAGS) $(INCLUDE) -o $@ -c $<

#クリーンしてビルド
.PHONY: all
all: clean $(TARGET)

#クリーン
.PHONY:clean
clean:
	$(RM) $(OBJECTS) $(DEPENDS) $(TARGET)

-include $(DEPENDS)
```

※MakefileのインデントはすべてTabです. 
コピペするとSpace4つになるので, `\t`に置換してください.

- **参考文献**: [シンプルで応用の効くmakefileとその解説](http://urin.github.io/posts/2013/simple-makefile-for-clang)

## VS Code
VS Codeにはもともとターミナルがついているが, `nppExec`のような現在のタブに従うような機能はない. 
`Ctrl+@`でターミナルを開くと, 特に設定していない場合, `$HOME`で開くだろう. 

しかし, 拡張機能`terminal-command-keys`を使えば, `nppExec`に近いことが行える. 
拡張機能をインストール後, `Ctrl+K, Ctrl+S`の`keybindings.json`に以下を追加. 

```json
    {
        "key": "F5",
        "command": "terminalCommandKeys.run",
        "args": {
            "cmd": "cd `dirname \"${file}\"`;make"
        }
    },
    {
        "key": "ctrl+F5",
        "command": "terminalCommandKeys.run",
        "args": {
            "cmd": "cd `dirname \"${file}\"`"
        }
    },
    {
        "key": "shift+F5",
        "command": "terminalCommandKeys.run",
        "args": {
            "cmd": "!!"
        }
    },
```

この例では`F5`を押すと, カレントタブのディレクトリで`make`を実行する. 
`Ctrl + F5`で, カレントタブのディレクトリに移動できる. 
このようにしておけば, ターミナルのディレクトリを意識することなく`make`を実行できる. 
`Shift + F5`で, 直前のコマンドを実行できる. (`!!`: 直前のコマンド実行を表す. )


また, 現在のキャレットがエディタ側になく, ターミナル側にある場合にも実行を可能にするには, `Ctrl+,`で`settings.json`に以下の設定が必要. 
`"terminal.integrated.commandsToSkipShell":`の項目のリストに,  `"terminalCommandKeys.run"`を追加. 

## その他の設定
### settings.json

- 文字コード自動判定ON
 - `"files.autoGuessEncoding": true,`
- LaTeX Workshop自動コンパイルOFF
 - ~~`"latex-workshop.latex.autoBuild.onSave.enabled": false,`~~
 - `"latex-workshop.latex.autoBuild.run": "never",`
- Cygwin terminalへ変更
 - `"terminal.integrated.shell.windows": "C:\\cygwin64\\bin\\bash.exe",`
 - `"terminal.integrated.shellArgs.windows": ["--login", "-i"],`
- スペース表示
 - `"editor.renderWhitespace": "all",`
- フォントサイズ変更
 - `"editor.fontSize": 13, `
 - `"terminal.integrated.fontSize": 13,`
- タイトルバーにフルパス表示
 - `"window.title": "${activeEditorLong} - VS Code",`

### keybindings.json

- タブ切り替えで, 見た目順に動くようにする (履歴順解除)

```json

    {
        "key": "ctrl+tab",
        "command": "workbench.action.nextEditor"
    },
    {
        "key": "ctrl+shift+tab",
        "command": "workbench.action.previousEditor"
    },
```

### 拡張機能

- Bracket Pair Colorizer
- C/C++
- Japanese Language Pack for VS Code
- LaTeX Workshop
- Matlab
- Python
- Rainbow CSV
- Reopen Closed Tab
- terminal-command-keys
- Python Docstring Generator
- TabNine
- Remote ssh