作为一个notepad++的使用者,你是否想过,在一步简单的操作中,就可以利用关联的编译器来编译代码?
你或者已经利用nppExec扩展来编译文件,但是如果要自动执行又该如何?如果你想用tcc编译c文件,用g++编译cpp文件,用gawk自动解释awk文件,而不用调用编译器或者解释器,又将如何?这些都可能吗?
是的,nppExec已经足够你做到这些。你只需要一点想象力和简单的几步。我将在下面说明什么是需要做的。
让我们以一些理论问题作为开始。
首先,nppExec如何从你目前的文档中看出哪个编译器或者解释器是你需要的?nppExec不是一个编译器,它从你的文件中得不到任何信息,因此并不知道如何处理它。更重要的是,Notepad++自身不是一个像Visual C++ 或者Dev C++的IDE,它不包含任何编译器,不知道如何处理你的文件。
因此,在Notepad++(在这里是nppExec)中利用相应编译器编译文件的唯一方法是告诉它使用哪个编译器以及如何使用。
这也许是你已经使用的方法——明确使用含有这些代码的编译器/解释器。例如,你可能想用tcc编译和运行你的c文件,一个简单的nppExec脚本如下:
"C:toolstcctcc.exe" "$(FULL_CURRENT_PATH)" –run
完整的路径"C:toolstcctcc.exe"是所需要编译器的路径。notepad++的环境变量"$(FULL_CURRENT_PATH)" 是你目前源文件的完整路径。tcc的命令行“-run”意为“运行编译的代码”。完整的路径一般通过引用的方式给出,因为一般情况下,里面会含有空格。
现在,我们来看nppExec的脚本。它假定脚本已经创建,并且保存的名字可以确认是哪一种脚本。如果你不确定nppExec的脚本生成保存过程,那么请往下看。
我们按照以下步骤来创建和保存nppExec脚本:
打开nppExec的“Execute"窗口。使用快捷键(默认是F6),或者在主菜单中选择Plugins-> NppExec -> Execute
在“Execute”窗口中输入你的脚本。例如: "C:toolstcctcc.exe" "$(FULL_CURRENT_PATH)" -run
保存脚本。按下“Save”按钮,输入文件名(比如“run@.c”)并按下“Save”
现在你可以在notepad++中编译和运行单个c文件。按下F6(“Execute”窗口的默认快捷键),选择组合框中的"run@.c”,然后按下“确定”。
你也可以使用Ctrl+F6组合键重新执行脚本而不显示“Execute”窗口。
可以看到,现在我们使用“run@.c”明确地编译和运行c代码。因此,要编译运行其他语言(cpp,asm,php,lua...)的代码,你必须使用相关联的脚本。(最后一句假定你已经为使用的编程语言创建了独立的nppExec脚本。)
但是,我们不想明确地使用需要的脚本。我们希望nppExec为c文件使用“run@.C”文件,而为其他的编程语言自动使用相应不同的脚本。
问题是:怎样才能实现这个功能?
解决方案的第一部分是编程语言的扩展。用notepad++打开的文件中,有这样一个环境变量$(EXT_PART)包含了源代码的扩展。
解决方案的第二部分是nppExec的内部命令NPP_EXEC。你可能已经知道,这个命令期望得到已经存在的脚本名称或者脚本文件名称作为它的第一个变量。这个命令的目的是执行特定的脚本。
因此,如果你使用NPP_EXEC命令,它的第一个变量(要执行的脚本)取决于目前文件的扩展,你可以在一个脚本中调用不同的脚本。
下面我们在细节上检验一下。
我们接下来将要创建一个脚本,这个脚本允许我们为不同编程语言的文件调用不同的脚本(取决于编程语言的扩展)。换句话说,我们使用NPP_EXEC命令调用需要的脚本,脚本名字取决于目前语言的扩展。上面脚本“run@.c”包含两部分,第一部分“run@”和扩展“.c”。文件的扩展名可以从notepad++中得到,脚本的一般形式如下:“run@$(EXT_PART)”。
不难理解当使用cpp源代码时,脚本名字变为“run@.cpp”,使用lua时,脚本名字编程“run@.lua”.
现在让我们来创建一个通用的编译/运行脚本,它可以编译和运行任何语言的文件。
// construct the script name to be called
SET Compiler = run@$(EXT_PART)
// call the script
NPP_EXEC "$(Compiler)"
保存上述脚本,名为“compile_or_run”。现在它是你的启动脚本,可以编译任何语言的文件。按下F6,选择“compile_or_run”并确定。但是,不要忘记对所有你希望编译的脚本,这个启动脚本需要已经存在的脚本。因此,“run@.cpp”必须存在来编译一个cpp文件,“run@.php”必须来编译一个php文件,诸如此类。
可以看一下的例子:
// run@.c
"C:toolstcctcc.exe" "$(FULL_CURRENT_PATH)" -run
// run@.cpp
SET g++ = C:Dev-Cppbing++.exe
SET obj = $(CURRENT_DIRECTORY)$(NAME_PART)
"$(g++)" -c "$(FULL_CURRENT_PATH)" -o "$(obj).o"
"$(g++)" "$(obj).o" -o "$(obj).exe"
NPP_RUN "$(obj).exe"
UNSET obj
UNSET g++
// run@.awk
"C:toolsgawkgawk.exe" -f "$(FULL_CURRENT_PATH)"
对于任何.c,.cpp,.awk文件,这些脚本在选择“compile_or_run”时都会自动执行。你可以创建更多“run@...”脚本来编译任何你需要的文件。
现在让我们返回“compile_or_run”脚本。它使用NPP_EXEC命令来把读取的文件名作为第一个变量。这意味着什么?这说明你是从文件中执行NPP_EXEC脚本。
你也可以看到,“compile_or_run”脚本的实现需要很多额外的“run@...”脚本,它们可能和你明确调用的脚本存在一起。与此同时,你不会明确调用“run@...”。因此,“run@...”脚本在NPP_EXEC的执行组合框里也许已经不再需要。
因此,你需要修改脚本,使得可以调用不同的文件而非内部的脚本。例如:
// compile_or_run
SET Compiler = C:toolsNppExec Scriptsrun@$(EXT_PART).txt
NPP_EXEC "$(Compiler)"
现在你必须创建一个目录“C:toolsNppExec Scripts”,它包含了下列文件:“run@.cpp.txt”,“run@.c.txt”或者“run@.awk.txt”。这些文件的文本必须同脚本“run@.c”、"run@.cpp”、“run@.awk”一致。比如文件"C:toolsNppExec Scriptsrun@.awk.txt"必须包含 "C:toolsgawkgawk.exe" -f "$(FULL_CURRENT_PATH)"。
关于NPP_EXEC命令的更多信息,在notepad++打开NppExec's Console,输入
help npp_exec
要得到NppExec的帮助信息,仅仅需要输入help即可。
下面是perl在notepad++中的设置,可以作为参考。
* Type F6 to open the execute window
* write the following commands:
o npp_save <-- Saves the current document
o CD $(CURRENT_DIRECTORY) <-- Moves to the current directory
o perl.exe -c -w "$(FILE_NAME)" <-- executes the command perl.exe -c -w <filename>, example: perl.exe -c -w test.pl (-c = compile -w = warnings)
* Click on Save
* Type a name to save the script (ie Perl Compile)
* Go to Menu Plugins -> Nppexec -> advanced options -> Menu Item
* In the combobox select the script recently created and click ok -> ok
* Restart Notepad
* Go to Menu Settings -> Shortcut mappter -> Plugins -> search for the script name
* Select the shortcut to use (ie ctrl + 1), click ok
* Verify that you can now run the script created with the shortcut selected
UPDATE 2010-07-08:
共享一下我的lua和python配置脚本
Lua:
npp_save
CD $(CURRENT_DIRECTORY)
C:Program FilesLua5.1lua.exe "$(FULL_CURRENT_PATH)"
python
npp_save
CD $(CURRENT_DIRECTORY)
C:Python31python.exe "$(FULL_CURRENT_PATH)"