【原創,轉載請註明來自公眾號『數據挖掘機養成記』】
前言一年前,我在公眾號裡寫過一篇文章 『windows下用Notepad++開發Python、C/C++』,大概講了如何用notepad++內置的運行命令來編譯運行相應程序,現在看來,略顯簡陋了
如今,我將分享一個前陣子琢磨了一整天寫的 notepad++ 腳本給大家,可以一鍵編譯或運行Python/C/C++/Java 程序,理論上還可以根據你的需要擴展到更多語言
談談編輯器與IDE在進入正題前,先聊聊開發環境,各位根據實際情況選擇是否真的要用notepad++做開發(P.S. notepad++打開文本文件的速度還是相當快的,即便不用它做開發,用來打開文件也是極好的)
一般而言,開發環境無非兩類,編輯器(如notepad++、sublime、vim、emacs)和IDE (如IDEA、Eclipse、VisualStudio、Pycharm),談談我對這兩者的理解:
恰逢七夕,若以戀愛做比,編輯器就是一個單純又不諳世事的少女,你得手把手「調教」她,告訴她你需要什麼,挖掘她的潛力,而「調教」的過程也會給你帶來莫大的成就感;IDE則是八面玲瓏的交際花,會察言觀色,能猜到你的心思,你只需稍加點撥,她便可助你直上青雲。
所以,我建議: 初學者可以先嘗試用編輯器,熟悉語言的語法、編譯和運行方式,打下基礎,也可以用來快速測試一些簡單碎片化的代碼;但如果開發比較大型的項目,尤其是需要同步協作的時候,還是用IDE更便捷且穩定高效。
鑑於不少網站私自爬取我的原創文章,我決定在文中插入二維碼以維護來源,希望不會打擾到各位閱讀
以下操作皆在notepad++中進行,所以請先安裝notepad++
Step 1. 安裝NppExec插件notepad++菜單欄->插件->plugin manager->show plugin manager,點擊進入,找到Nppexec,安裝。安裝成功後重啟notepad++,會在菜單欄->插件中出現NppExec
Step 2. 腳本:判斷文件是否存在這個腳本的功能是判斷文件是否存在。在之前,我一直以為NppExec的語法跟Windows的DOS一樣,但看了文檔後發現它只支持很少的DOS指令。所以在DOS中一句IF EXIST就可以完成的功能,在NppExec中需要自己寫
本節參考https://sourceforge.net/p/npp-plugins/discussion/672146/thread/e3275948/,具體地:點擊 notepad++菜單欄->插件->NppExec->Excute,在腳本編輯框中輸入以下代碼:
set FILEEXISTS = 0npe_console v+cmd /c if exist $(ARGV) echo Existsif "$(OUTPUTL)" != "Exists" goto ...set FILEEXISTS = 1:...npe_console v-
點擊下面按鈕保存腳本,起一個名字叫CheckFileExists
Step 3. 腳本:編譯和運行高潮來了,接下來這個腳本是我在通讀NppExec文檔基礎上完全自己造的輪子,可以針對不同後綴名的程序文件,執行不同的編譯和運行操作,目前支持Python/C/C++/Java,可自行擴展。
跟上一節一樣,先進入NppExec的腳本編輯框,輸入以下代碼(有興趣的可以看代碼注釋,方便以後自己擴展)
npp_console disable // 關閉顯示,否則執行時腳本時會在console窗口顯示每條腳本語句,有礙觀感cd "$(CURRENT_DIRECTORY)"if $(EXT_PART) == .java goto javaif $(EXT_PART) == .py goto pythonif $(EXT_PART) == .cpp goto cppif $(EXT_PART) == .c goto cgoto error1 // 當非c/c++/python/java文件時,直接報錯// 下面是java的編譯、執行、報錯,與後面c/c++類似label java npp_save // 保存當前程序文件cmd /c if exist $(NAME_PART).class (del $(NAME_PART).class) // 調用cmd窗口刪除上次程序執行時編譯的結果,/c是表示執行完cmd指令後關閉窗口,不加/c會使窗口一直打開,無法向下執行腳本npp_console enable //打開顯示,可以查看下面語句執行結果javac -encoding UTF8 $(FILE_NAME) // 設置javac的編碼格式為UTF8,否則代碼中含有中文注釋會報錯npp_console disable // 再次關閉顯示,因為下面的語句沒必要呈現在console窗口npp_exec CheckFileExists $(NAME_PART).class // 調用自己寫的腳本判斷是否存在.class文件if $(FILEEXISTS)==1 goto j1 // 編譯成功執行運行,不成功拋錯goto error2label j1npp_console enablejava $(NAME_PART)npp_console disablegoto endlabel cppnpp_savecmd /c if exist $(NAME_PART).exe (del $(NAME_PART).exe)npp_console enableg++ -o $(NAME_PART).exe $(FILE_NAME)npp_console disablenpp_exec CheckFileExists $(NAME_PART).exeif $(FILEEXISTS)==1 goto c1goto error2label c1npp_console enable$(NAME_PART)npp_console disablegoto endlabel cnpp_savecmd /c if exist $(NAME_PART).exe (del $(NAME_PART).exe)npp_console enablegcc -o $(NAME_PART).exe $(FILE_NAME)npp_console disablenpp_exec CheckFileExists $(NAME_PART).exeif $(FILEEXISTS)==1 goto c2goto error2label c2npp_console enable$(NAME_PART)npp_console disablegoto endlabel pythonnpp_savenpp_console enablepython $(FILE_NAME)npp_console disablegoto endlabel error1npp_console enableecho 錯誤:非程序文件npp_console disablegoto endlabel error2npp_console enableecho 錯誤:編譯未通過npp_console disablegoto endlabel endnpp_console enable
保存腳本,我起的名字叫Run Any Program,然後在 Notepad++菜單欄 -> 運行-> 管理快捷鍵 -> Plugin commands 下找到Run Any Program,並設置快捷鍵用來運行這個腳本(比如Ctrl+D),大功告成!
Step 4. 運行腳本用notepad++編輯代碼文件時,建議選擇UTF-8編碼,點擊菜單欄->格式->以UTF-8無BOM格式編碼。以免運行時出現編碼錯誤
Python
當你用notepad++編輯一個.py結尾的python腳本時,按下Ctrl+D
運行失敗:
運行成功:
Java
同上,當編輯.java結尾的java文件時,按下Ctrl+D
編譯失敗:
編譯、運行成功:
C/C++
同上,編輯以.c結尾的C文件或以.cpp結尾的C++文件時,按下Ctrl+D
編譯失敗:
編譯、運行成功:
非以上程序文件
當運行一個非以上後綴結尾的程序文件時,按下Ctrl+D:
聊聊我為何萌生寫這個腳本的念頭,以及遇到的一些坑,不感興趣的可以直接略過~
起因
在我之前寫的『windows下用Notepad++開發Python、C/C++』一文中提到過運行命令,然而只能輸入一行shell指令,功能極大受限
運行中輸入指令時,系統默認當前路徑是notepad++的安裝路徑,而不是程序文件所在路徑,這一點很不方便。即便加了cd "$(CURRENT_DIRECTORY)"希望能跳轉到當前代碼文件所在路徑,但也不太work
當在notepad++中編輯某個代碼文件時,對於不同程序語言,一般人都會在運行或者NppExec中寫不同的腳本、設置不同的快捷鍵來看編譯運行效果,非常不便
理想
在NppExec中寫DOS命令行,取代所有運行的命令即可
現實
仔細閱讀了NppExec的說明文檔,發現它只支持部分DOS命令(if, del, goto)而像 else, exist根本不支持,特別蛋疼,想了很多方法才搞定;另外用 del老提示找不到文件,只能專門用NppExec寫個腳本判斷文件是否存在;還有就是 if 判斷完了必須用goto跳轉,增加代碼量和代碼邏輯。Anyway,最後總算解決了
所以,其實我現在更喜歡在Mac下用Sublime Text 3,Mac大法好;-P
Bonus最近幾篇文章我都是用Markdown寫的,可以直接生成pdf,但公眾號平臺無法插入附件,另外公眾號對Markdown支持不好,呈現出來的文章容易代碼縮進混亂,有些特性也不支持。
所以我準備提供pdf下載連結,具體將在明天發布的『數據挖掘比賽通用框架』一文中放出,敬請期待