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


Notepad++からVS Codeへ

今まで様々なテキストエディタを試してきて, 満足するエディタはNotepad++だけだった.
だが, 最近VS Code拡張機能の組み合わせにより, 同等の機能が実現できたため, 入力補完が優秀なVS Codeへ移行した.

Notepad++

これまで, テキスト編集からプログラミング, LaTeXまで全てNotepad++でやってきた.
NppExecというプラグインが優秀で, Notepad++にターミナル環境を与えてくれていた.

さらに, Follow ${CURRENT_DIRECTORY}という神がかったオプションまであった.
この機能は, 下のターミナルのディレクトリが, 現在開いているタブの階層になるというものだ.

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

LaTeX用Makefile

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

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 (*.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に置換してください.

VS Code

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

しかし, 拡張機能terminal-command-keysを使えば, nppExecに近いことが行える.
拡張機能をインストール後, Ctrl+K, Ctrl+Skeybindings.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

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

    {
        "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