我們前ㄧ篇已經設定好了 Emacs 編輯 C/C++ 的程式,這裏我們用一個例子來看如何使用 irony, rtags, clang-format 套件來支援 C/C++ 程式的編輯。
我們用一個現成的函式庫 OpenCV 來做一個小小的程式,這個簡化的程式會讀進一個影像,判別影像中人臉的位置,並用框框標示出來。完成如圖
Ctrl-x Ctrl-f
開啟一個新的檔案 detectface.cpp
#inc
,這時會啟動 Emacs 的 company-irony 程式自動補全 ,檢查一下 Meta-x company-diag
,Emacs 使用 company 套件來做程式補全,詳情請看前面 company的介紹#include "ope"
,irony會把相關的函式庫列出
opencv2/o
irony 會把相關的標頭檔列出
main
snippet 展開
Meta-x yas-describe-table
可以看 C++ 模式下定義的程式片段 (snippets) 這些程式片段可以在打完關鍵字後按 Tab 鍵展開,詳情請看前面的文章 yasnippet
cv::Ca
時, company-irony 會帶出 cv相關的類別跟類別方法,
Meta .
,即可跳到它的定義檔 ,按一次 Meta ,
顯示有多少目前的函式使用到這個類別,選擇後跳回std::stri
,相關的函式跟類別都會展出
Ctrl-x ! l
來顯示錯誤跟警示
Ctrl-x ! v
, ,現在的 C++ 模式下,會使用 flycheck-irony 因為前一篇的設定 之前的文章已經介紹過如何使用 flycheck
Ctrl-x Ctrl-s
儲存後,格式自動排定 因為使用了 clang-format 設定在儲存時會自動編排美化程式完成的程式如下
#include "opencv2/opencv.hpp"
int main(int argc, char *argv[]) {
cv::CascadeClassifier cascade;
std::string imageName, cascadeName;
cv::Mat image, gray;
std::vector<cv::Rect> faces;
cv::Scalar color = cv::Scalar(0, 255, 0);
cascadeName = "./haarcascade_frontalface_default.xml";
imageName = argv[1];
// load image and classifier
if (!cascade.load(cascadeName)) {
std::cerr << "Could not load classifier cascade" << std::endl;
} else if (imageName.empty()) {
std::cout << "Could not read " << imageName << std::endl;
} else {
image = cv::imread(imageName, 1);
if (image.empty()) {
std::cout << "Could not imread image " << std::endl;
}
}
// convert to grey
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
// run face detector
cascade.detectMultiScale(image, faces, 1.1, 2, 0, cv::Size(30, 30));
// output rectangle
for (size_t i = 0; i < faces.size(); ++i) {
cv::Rect r = faces[i];
cv::rectangle(
image, cv::Point(cvRound(r.x), cvRound(r.y)),
cv::Point(cvRound(r.x + r.width - 1), cvRound(r.y + r.height - 1)),
color, 3, 8, 0);
}
// show image
cv::imshow("result", image);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
我們使用 cmake 來編譯程式,因為已經設定了 cmake-mode 使用 company-cmake,Emacs 有最簡單的補全支援
CMakeLists.txt 如下
#cmake need this
cmake_minimum_required(VERSION 3.1)
#Enable C++ 11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
#Define project name
project(detectface)
#find OpenCV
find_package(OpenCV REQUIRED)
#If package found, several variable will be set
message(STATUS "OpenCV libray status: ")
message(STATUS " config: ${OpenCV_DIR}")
message(STATUS " version: ${OenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
#declare executable target build from sources
add_executable(facedetect facedetect.cpp)
#link app to OpenCV lib
target_link_libraries(facedetect ${OpenCV_LIBS})
使用之前介紹過的 Projectile 來編譯專案,按 Ctrl-c p c
來做編譯,請事先先用 之前介紹的 Emacs Git 介面 Magit 建立專案
build
Ctrl-c p c
打入 cd ~/xxx/build && cmake ..
Ctrl-c p c
打入 cmake --build ~/xxx/build
Meta-x shell
下執行 ./facedetect harry-meghan-15.jpg
我們介紹了如何使用 Emacs 編輯 C/C++ 的程式,其中使用了之前介紹過的 company, yasnippet, flycheck, Magit, Projectile 等工具,如果不熟悉的話,建議可以再看一次,因為之後其他模式也會一直使用這些套件