Help us understand the problem. What is going on with this article?

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

Notepad++からVS Codeへ

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

Notepad++

これまで, テキスト編集からプログラミング, LaTeXまで全てNotepad++でやってきた.
NppExecというプラグインが優秀で, Notepad++にターミナル環境を与えてくれていた.
notepad++.png
さらに, 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
birdwatcher
[分野] 機械学習, 最適化, データマイニング, KDD2018, KDD2019, Neural Computation. [伝えたいこと] データ分析の場面でWindowsは避けられがちだが, 正しく設定することでMacと同等の環境を作ることができる. マウスを捨ててキーボードショートカットを覚えれば作業効率が上がる.
https://www.instagram.com/birdwatcheryt/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away