一般的方法都是直接在 NppExec 按下 Execute 時輸入 編譯器的位址 再來編譯
但是將 Notepad++ 帶到其他電腦後,那台沒裝 MinGW 編譯器時,就會變得很不方便
在此提供一個 簡單 的方法,讓你把 Notepad++ 和 MinGW 放在一起,可以存在 USB 內,到哪台電腦都可以 編譯!
以後把 Notepad++ 資料夾移動到哪都無所謂,只要用 Notepad++ 打開原始碼,按個 F9 編譯,就完成了!
Windows Only
功能
1. 可以在 Notepad++ 中指定參數 (Parameters) 編譯完後 執行傳遞給程式
2. 可以在原始碼 的 資料夾 (Source file) 創一個文字文件 "debug_param.txt" 填入 參數,編譯完後傳遞給程式
3. 可以指定額外的 Compiler flags
4. 可以選擇要不要編譯完就 自動執行,或是按 Enter 才執行
5. 可以選擇要不要先 終止 舊的處理程序
6. 可以選擇編譯前要不要先 刪除舊檔案
7. 支援原始碼檔案的路徑 包含空格,支援參數 包含空格
所需物件
(1) Notepad++ 和他的插件 NppExec
(2) TDM-GCC 編譯器 (比較推薦這個)
或是 MinGW
(3) NppExec 執行碼 (底下提供)
(4) 放在 MinGW 資料夾下的 Compile.bat 批次檔一個 (底下提供)
安裝 Notepad++ 插件 NppExec :
如果 Notepad++ 已經有裝 NppExec 那麼這步驟就 OK
沒裝的話,進入以上提供連結後 => 搜尋 NppExec 進入連結 => 再點連結 NppExec => 點最新版本 (例 : NppExec Plugin v0.4.2) => 看 Notepad++ 使用的是哪個版本 => Unicode 選 NppExec_042_dll_Unicode.zip , ASNI 選 NppExec_042_dll_ANSI.zip => 下載解壓 => 全部檔案放置到 Notepad++ 資料夾下的 \plugins\ 下
設置 MinGW 資料夾 :
(1) 如果電腦已經有裝 Dev C++ 或 CodeBlocks,可以直接把裡面的 MinGW 資料夾 放置在 Notepad++ 資料夾下 (Notepad++.exe 執行檔位置的資料夾)
(2) 沒有裝的話,點以上提供連結 TDM-GCC => Download => 選左上角的 Bundle Installer 點 exe 連結 => 下載安裝 => Create => 選擇 32bit 或 64bit => 目錄... => 安裝完成後,把安裝路徑的 MinGW 整個資料夾 複製/剪下,貼到 Notepad++ 資料夾下
NppExec 執行碼 :
| // You can create two files under directory of the source file : // "debug_flags.txt" to overload variable "flags" // "debug_param.txt" to overload "param" // ----- [Boolean : 0 or 1] Run automatically when compiling is finished ----- SET bAutorun = 0 // ----- [Boolean : 0 or 1] Kill old process before compiling ----- SET bKillOldProc = 0 // ----- [Boolean : 0 or 1] Delete old file before compiling ----- SET bDeleteOldExe = 0 // ----- [String] Flags for compiler (with double quotes) ----- SET flags = "-Wall" // ----- [String] Parameters for executing (with double quotes) ----- SET param = "" // ------ [String] Destination file name (Default : "$(NAME_PART).exe" ) ----- SET dstName= "$(NAME_PART).exe" NPP_SAVE // Save current file ECHO Calling bat file to compile and execute..... NPP_RUN "$(NPP_DIRECTORY)\MinGW\Compile.bat" $(dstName) "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(bAutorun)" "$(bKillOldProc)" "$(bDeleteOldExe)" $(flags) $(param) UNSET bAutorun UNSET bKillOldProc UNSET bDeleteOldExe UNSET flags UNSET param UNSET dstName |
說明 :
打開 Notepad++ => Plugins => NppExec => Execute... (F9)
將以上藍色的執行碼貼到空白區域,可以點 Save... 取一個好聽的名字 (例 : Compile C/C++) 儲存,以後就變成一個類似 Script 很方便
我這邊設了很多參數,是為了讓編譯更方便
bAutorun : 如果值是 1,那麼編譯完成後將會自動執行,而不會有按 Enter 才會執行的訊息
bKillOldProc : 如果值是 1,編譯前會先用 taskkill 把舊的處理程序砍掉
bDeleteOldExe : 如果值是 1,會先刪除舊的輸出執行檔
flags : 字串,必須有雙引號包住,傳遞給編譯器的額外參數 (Compiler flags),預設是 "-Wall" 代表將所有警告訊息打開 (例如變數宣告了卻沒使用,編譯器就會警告你)
param : 字串,必須有雙引號包住,傳遞給執行程式使用的參數 (Parameters)
可是在編輯多重檔案時,傳遞給每個程式的參數都可能不同,要用同一個 Script 來執行不同參數的呼叫,
改來改去可能會發瘋,所以我又額外設計一個功能 :
如果在 Source file 的資料夾下建立一個文字文件 "debug_param.txt"
那麼其中的內容就會 覆蓋到 param 的參數,如此一來可以在不同資料夾進行不同 Parameters 傳遞呼叫,不用再用 cmd 慢慢打
同理,至於是編譯器參數 (Compiler flags) 時,則是在 Source file 的資料夾下建立一個文字文件 "debug_flags.txt"
那麼其中的內容就會 覆蓋到 flags 的參數
程式的任何路徑 (MinGW 的位置、原始碼的檔案位置) 都可以接受包含空白的字串,包括 Flags, Parameters 都可以輸入空格,不過在 NPP_EXEC 的執行碼內,記得參數要用雙引號包起來
雖然說 Source file 的檔名可以接受 空白,但是還是不能包含其他會干擾 NppExec 或 BAT 檔的符號,像是 (), ^, % 等都不行
倒數第 7 行 其中有一個
"$(NPP_DIRECTORY)\MinGW\Compile.bat"
就是要利用 放在 MinGW 資料夾內的 Compile.bat 這個批次檔來完成 編譯的動作,當然如果你喜歡把他放在其他資料夾也可以,不過除了改 NppExec 執行碼,Compile.bat 內部也要改編譯器的位置
Compile.bat (放在 MinGW 資料夾下) 原始碼:
| @echo off rem ===== Definition ===== rem This bat file is called by plugin "NppExec" in Notepad++ : rem NPP_RUN "$(NPP_DIRECTORY)\MinGW\Compile.bat" $(dstName) "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(bAutorun)" "$(bKillOldProc)" "$(bDeleteOldExe)" $(flags) $(param) rem %1 [String] Source code filename (User-definable) rem %2 [String] Source code path rem %3 [String] Source code directory rem %4 [Boolean] Run automatically when compiling is finished rem %5 [Boolean] Kill old process first rem %6 [Boolean] Delete old executable file rem %7 [String] Parameters for executing rem %8 [String] Flags for compiler set compiler=%cd%\MinGW\bin\mingw32-g++.exe set exeFile="%1" set srcFullPath="%2" set srcFullDir="%3" set dstFullPath=%srcFullPath% set dstFullDir=%srcFullDir% set bAutorun=%4 set bKillOldProc=%5 set bDeleteOldExe=%6 set flags="%7" set param="%8" rem ===== Remove quotes ===== if not "%exeFile%" == """" ( set exeFile=%exeFile:"=% ) if not "%srcFullPath%" == """" ( set srcFullPath=%srcFullPath:"=% ) if not "%srcFullDir%" == """" ( set srcFullDir=%srcFullDir:"=% ) set dstFullPath=%srcFullDir%\%exeFile% set dstFullDir=%srcFullDir% if not "%flags%" == """" ( set flags=%flags:"=% ) if not "%param%" == """" ( set param=%param:"=% ) rem ===== Find source path configuration file ===== if exist "%srcFullDir%\debug_param.txt" ( set /p param= < "%srcFullDir%\debug_param.txt" echo * Has overloaded Parameters from "debug_param.txt" echo. ) if exist "%srcFullDir%\debug_flags.txt" ( set /p flags= < "%srcFullDir%\debug_flags.txt" echo * Has overloaded Flags from "debug_flags.txt" echo. ) rem ===== Info. ===== echo * [Compiler] "%compiler%" echo * [Source path] "%srcFullPath%" echo * [Output path] "%dstFullPath%" if not "%flags%" == """" ( echo * [Flags] "%flags%" ) else ( echo * [Flags] NULL ) if not "%param%" == """" ( echo * [Parameters] "%param%" ) else ( echo * [Parameters] NULL ) echo. rem ===== Kill old process ===== if "%bKillOldProc%" == "1" ( echo. echo Killing old process "%exeFile%" ..... taskkill /IM "%exeFile%" 2>nul ) rem ===== Delete old executable file ===== if "%bDeleteOldExe%" == "1" ( echo. echo Deleting old executable file ..... del "%dstFullPath%" ) rem ===== Compile ===== echo. echo Compiling "%exeFile%", please wait ..... echo. echo ========== Messages from compiler ========== if "%flags%" == """" ( call "%compiler%" -o "%dstFullPath%" "%srcFullPath%" ) else ( call "%compiler%" -o "%dstFullPath%" "%srcFullPath%" "%flags%" ) echo __________________________________________________ rem ===== Ready to execute ===== echo. echo. echo Done. echo. if not exist "%dstFullPath%" goto jump_notExist if not "%bAutorun%" == "1" ( title "----- Ready -----" echo Press ^<ENTER^> to execute "%exeFile%" echo. pause >nul ) rem ===== Execute ===== start "%dstFullPath%" /d "%dstFullDir%" "%dstFullPath%" %param% exit : jump_notExist title "----- Error -----" echo Couldn't start "%dstFullPath%". File doesn't exist. pause >nul exit |
說明 :
在 Notepad++ 資料夾下的 MinGW 資料夾 內新增一個 Compile.bat 內容如以上原始碼
程式編譯後將會 把同檔名的執行檔放到 和原始碼同一個資料夾內
之前的 NppExec 執行碼就是利用這個 Compile.bat 來編譯的,NppExec 執行碼只是將一些參數傳遞給 這個 BAT 檔案
所有編譯的動作都是藉由這個 BAT 檔完成,所以這只能在 Windows 下使用
如果要移動這個 BAT 檔案到其他資料夾,只需要改 其中一行 set compiler=%cd%\MinGW\bin\mingw32-g++.exe 設定編譯器的位置即可
其他 BAT 內的參數都是從 NppExec 呼叫得來的
編譯方法
▼ 打開 Notepad++ => Plugins => NppExec => Execute... (F9) => OK 進行編譯
以上的程式碼 (C 語言) :
這程式碼是用來 顯示所有的呼叫參數 (Parameters),可以改 NppExec 執行碼的 "param" 來看看不同的結果
#include <stdio.h> int main(int ctArg, char **pStrArg) { int iUnused; for (int i = 1; i < ctArg; ++i) printf("Arg[%d] = \"%s\"\n", i, pStrArg[i]); getchar(); return 0; } |
▼ 編譯完成,Flags 使用 "-Wall" 出現了警告訊息
按下 Enter 後即可執行程式
以上的 NppExec 執行碼 和 Compile.bat 被我在 2012-04-20 重新編輯過
舊版的參數會被程式路徑的空格干擾,功能也較少,也不人性化
這次試過了很多 包含空格的 路徑 和 參數,都沒有問題,如果你發現存在任何問題,請不吝回覆

Computer (5)