一般的方法都是直接在 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 進行編譯


NotepadPP_Portable_Compiler_C1  


以上的程式碼 (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 後即可執行程式



NotepadPP_Portable_Compiler_C2  








以上的 NppExec 執行碼 和 Compile.bat 被我在 2012-04-20 重新編輯過

舊版的參數會被程式路徑的空格干擾,功能也較少,也不人性化

這次試過了很多 包含空格的 路徑 和 參數,都沒有問題,如果你發現存在任何問題,請不吝回覆



, , , , ,

Posted by Ebolaman at 痞客邦 PIXNET 留言(0) 引用(0) 人氣()