libag - The Silver Searcher ที่มีชื่อเสียง แต่เป็นห้องสมุด
เมื่อไม่กี่สัปดาห์ที่ผ่านมา เพื่อนคนหนึ่งถามฉันว่าฉันรู้จักเครื่องมือสำหรับการค้นหานิพจน์ทั่วไปแบบเรียกซ้ำในไฟล์ข้อความและไบนารีหรือไม่ Ag เข้ามาในใจฉันทันที แต่น่าเสียดายที่ ag(1) เป็นโปรแกรม ไม่ใช่ห้องสมุด
แม้จะเป็นไปไม่ได้ แต่การแยกวิเคราะห์เอาต์พุต Ag อาจทำให้ปวดหัวเล็กน้อย อีกทั้งการสร้างกระบวนการใหม่สำหรับการค้นหาทุกครั้งฟังดูน่าเบื่อ เครื่องมือที่คล้ายกันเช่น ripgrep(1) สามารถส่งออกในรูปแบบ JSON ซึ่งทำให้ง่ายขึ้นมากอย่างแน่นอน แต่เรายังคงพูดถึงกระบวนการวางไข่และการแยกวิเคราะห์เอาต์พุต
นั่นคือวิธีที่ libag ถือกำเนิด Libag อนุญาตให้คุณใช้เครื่องมือค้นหา ag (และสิ่งอำนวยความสะดวกต่างๆ ของเครื่องมือค้นหา) แต่ในทางที่ถูกต้อง (หรือเกือบเป็นเช่นนั้น)
Libag ได้รับการออกแบบมาให้เรียบง่ายที่สุดเท่าที่จะเป็นไปได้ ดังนั้นจึงแบ่งกระบวนการค้นหาออกเป็นสามขั้นตอนง่ายๆ:
เริ่มต้นโครงสร้าง ag ภายในทั้งหมด (ผ่าน ag_init()
)
ทำการค้นหาได้มากเท่าที่คุณต้องการ (ผ่าน ag_search()
)
ทำความสะอาดทรัพยากร (ผ่าน ag_finish()
)
การตั้งค่าการค้นหาที่กำหนดเองทำได้ผ่าน ag_init_config()
และ ag_set_config()
ผลลัพธ์คือรายการของ struct ag_result* ซึ่งมีไฟล์ รายการการจับคู่ (ประกอบด้วยการจับคู่และออฟเซ็ตไฟล์ที่สอดคล้องกับการจับคู่) และแฟล็ก
(ดูตัวอย่างทั้งหมดได้ใน example/)
#include <libag.h>
...
struct ag_result * * results ;
size_t nresults ;
char * query = "foo" ;
char * paths [ 1 ] = { "." };
/* Initiate Ag library with default options. */
ag_init ();
/* Searches for foo in the current path. */
results = ag_search ( query , 1 , paths , & nresults );
if (! results ) {
printf ( "No result foundn" );
return ( 1 );
}
printf ( "%zu results found\n" , nresults );
/* Show them on the screen, if any. */
for ( size_t i = 0 ; i < nresults ; i ++ ) {
for ( size_t j = 0 ; j < results [ i ] -> nmatches ; j ++ ) {
printf ( "file: %s, match: %sn" ,
results [ i ] -> file , results [ i ] -> matches [ j ] -> match ,
}
}
/* Free all results. */
ag_free_all_results ( results , nresults );
/* Release Ag resources. */
ag_finish ();
...
Libag ตั้งใจที่จะสนับสนุนฟีเจอร์ทั้งหมด (อยู่ระหว่างดำเนินการ) ของ ag (หรืออย่างน้อย ฟีเจอร์ที่เหมาะสมกับห้องสมุด) นอกจากนี้ยังช่วยให้สามารถควบคุมเธรดของผู้ปฏิบัติงานได้โดยละเอียดผ่านทาง ag_start_workers()
และ ag_stop_workers()
(ดูเอกสารสำหรับรายละเอียดเพิ่มเติม)
Libag มีการเชื่อมโยง (ทดลอง) รองรับภาษาการเขียนโปรแกรมอื่นๆ: Python และ Node.js สำหรับข้อมูลเพิ่มเติมและเอกสารรายละเอียดเพิ่มเติม โปรดดูที่การผูก/หลามและการผูก/จาวาสคริปต์
Libag ต้องการการขึ้นต่อกันเช่นเดียวกับคอมไพเลอร์และไลบรารี ag: c99: zlib, lzma และ pcre ไลบรารีเหล่านี้สามารถติดตั้งได้ทีละไลบรารีหรือโดยตัวจัดการแพ็คเกจของคุณ
สำหรับการแจกแจงแบบ Debian บางอย่างเช่น:
$ sudo apt install libpcre3-dev zlib1g-dev liblzma-dev
(หรือปฏิบัติตามคำแนะนำของ Ag ที่นี่)
เมื่อแก้ไขการขึ้นต่อกันแล้ว ให้โคลนพื้นที่เก็บข้อมูลและสร้าง Libag รองรับ Makefile และ CMake เลือกอันที่เหมาะกับความต้องการของคุณมากที่สุด:
$ git clone https://github.com/Theldus/libag.git
$ cd libag/
$ make -j4
# Optionally (if you want to install):
$ make install # (PREFIX and DESTDIR allowed here, defaults to /usr/local/)
$ mkdir build/ && cd build/
$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make -j4
# Optionally (if you want to install):
$ make install
เอกสารโดยละเอียดของแต่ละรูทีนมีอยู่ในหน้าคู่มือ นอกจากนี้ซอร์สโค้ดยังมีการแสดงความคิดเห็นอย่างกว้างขวาง (libag.h เป็นสิ่งที่ต้องอ่าน!) สามารถดูเอกสารประกอบเกี่ยวกับการเข้าเล่มและตัวอย่างได้ที่นี่
ตัวอย่างที่สมบูรณ์ยังมีอยู่ใน examples/ โฟลเดอร์ และสร้างขึ้นพร้อมกับไลบรารีโดยอัตโนมัติเพื่อความสะดวกของคุณ ;-)
Libag เปิดรับชุมชนเสมอและยินดีที่จะยอมรับการมีส่วนร่วม ไม่ว่าจะเกี่ยวกับปัญหา เอกสาร การทดสอบ คุณสมบัติใหม่ การแก้ไขข้อบกพร่อง การพิมพ์ผิด ฯลฯ ยินดีต้อนรับเข้าสู่ต่างประเทศ
Libag ได้รับอนุญาตภายใต้ใบอนุญาต Apache v2