libvim
คืออะไร? libvim
เป็นทางแยกของ Vim โดยมีเป้าหมายในการจัดหา API ที่ใช้ C ขั้นต่ำ และสร้างแบบจำลองการแก้ไข Modal ของ Vim มันไม่ได้รวมอินเทอร์เฟซผู้ใช้ใดๆ เลย (แม้แต่ UI เทอร์มินัล) และมีหน้าที่หลักในการทำหน้าที่เป็นกลไกการจัดการบัฟเฟอร์ที่รวดเร็ว ซึ่งยึดถือกับการกดแป้น Vim ยังคงอยู่ในระหว่างดำเนินการและยังมีงานเหลืออีกมากที่ต้องรักษาเสถียรภาพ
หากคุณกำลังมองหา Terminal Vim ลองดู neovim หรือ GUI Vim ลองดู Onivim 2
libvim
มีไว้สำหรับ Onivim 2 เป็นหลัก หลังจากใช้ 'UI Vims' ซ้ำหลายครั้งระหว่าง v1, v2 และโปรเจ็กต์อื่น ๆ สิ่งที่เป็นนามธรรมที่ฉันอยากได้คือ Vim การทำงานล้วนๆ ซึ่งแยกออกจาก Terminal UI โดยสิ้นเชิง - โดยที่ 'vim ' เป็นฟังก์ชันของ (editor state, input) => (new editor state)
เนื่องจาก Onivim 2 จัดการเลเยอร์การเรนเดอร์อย่างสมบูรณ์ ฟังก์ชัน Vim-modelled-as-a-pure-นี้สามารถมุ่งเน้นไปที่การจัดการบัฟเฟอร์เท่านั้น
ด้วยเหตุนี้ libvim
จึงเปิดเผย C API อย่างง่ายสำหรับการทำงานกับ Vim และรองรับการฟังการเปลี่ยนแปลงบัฟเฟอร์ ข้อความ ฯลฯ
มีหน้าที่รับผิดชอบในการ:
มัน ไม่ รับผิดชอบสำหรับ:
ทั้งหมดนี้มีวัตถุประสงค์เพื่อให้ผู้บริโภคของไลบรารีจัดการ - ปล่อยให้ libvim
มุ่งเน้นไปที่งานการจัดการบัฟเฟอร์ที่รวดเร็ว
libvim
สร้างข้ามแพลตฟอร์ม (เนื่องจาก Onivim 2 จำเป็นต้องใช้!) เช่นเดียวกับ WebAssembly เราต้องการย้ายบทช่วยสอน v1 ของเราไปยังประสบการณ์บนเบราว์เซอร์
มีแอปพลิเคชันที่น่าสนใจอื่น ๆ ของ 'กลุ่มที่เป็นนามธรรม' เช่น:
readline
เป็นต้น สำหรับตัวอย่างการใช้งาน API โปรดดูที่ apitest เช่น Normal_mode_motion API ฉบับเต็มมีอยู่ที่นี่: libvim.h
หัวใจของ API คือ vimInput
ซึ่งรับคีย์เดียวและได้รับการประมวลผลแบบซิงโครนัสโดยเครื่องสถานะ 'ผลข้างเคียง' เช่น การอัปเดตบัฟเฟอร์ ข้อความ ฯลฯ สามารถสมัครรับข้อมูลผ่านการโทรกลับเช่น vimSetBufferUpdateCallback
ไลบรารีนี้อยู่ระหว่างการพัฒนาและขณะนี้เราไม่รับประกันเกี่ยวกับความเข้ากันได้แบบย้อนหลัง ใช้ API ด้วยความเสี่ยงของคุณเอง
esy
ก็เหมือนกับ npm
สำหรับโค้ดเนทีฟ หากคุณยังไม่มี ให้ติดตั้งโดยเรียกใช้:
npm install -g [email protected]
git clone https://github.com/onivim/libvim
cd src
esy install
esy '@test' install
esy build
esy '@test' build
เวิร์กโฟลว์ esy
ใช้งานได้ดีสำหรับบิวด์ครั้งเดียว แต่จะสร้างโลกใหม่ทุกครั้ง ดังนั้นในระหว่างการพัฒนา จะดีกว่าที่จะมีเวิร์กโฟลว์ส่วนเพิ่ม
cd src
make apitest/autoindent.test.exe
cd apitest
./autoindent.test.exe
คุณสามารถทดสอบ libvim
ที่สร้างขึ้นในเครื่องกับ Onivim 2 ที่สร้างขึ้นในเครื่องได้โดยการเพิ่มความละเอียดใน Onivim 2 package.json
เช่น:
"resolutions" : {
...
"libvim" : " link:../libvim/src "
}
เพียงตรวจสอบให้แน่ใจว่ามันชี้ไปที่โฟลเดอร์ libvim/src
หมายเหตุ: เราพบปัญหาเกี่ยวกับเวิร์กโฟลว์นี้ซึ่งไบนารีอาจล้าสมัยใน Onivim 2 ได้ ดังนั้นเราขอแนะนำให้รัน
rm -rf _esy && esy i
หลังจากการเปลี่ยนแปลงแต่ละครั้งเพื่อสร้างการขึ้นต่อกันใหม่
libvim
จึงใช้ Vim และไม่ใช่ Neovim ฉันเป็นแฟนตัวยงของงานที่ทีม Neovim กำลังทำอยู่ (และทีมงานก็ให้การสนับสนุนโครงการ Onivim อย่างไม่น่าเชื่อ) ตามหลักการแล้ว เราคงจะติดอยู่กับ Neovim หรือใช้ libvim
ตาม libnvim
อันที่จริง ครั้งแรกที่ฉันพยายามสร้าง 'นามธรรมขั้นต่ำ' นี้ - ฉันพยายามสร้างมันขึ้นมาจาก libnvim
ของ Neovim ฉันแบ่งเวลาการตรวจสอบเป็น 2 วัน และพบกับอุปสรรคร้ายแรง - สภาพแวดล้อมการสร้างของเราค่อนข้างท้าทายบน Windows (มันขึ้นอยู่กับ Cygwin + MingW cross-compiler toolchain) - ฉันพบปัญหาหลายประการในการทำให้ Neovim + deps สร้างในสภาพแวดล้อมนั้น . จากจำนวนที่เพิ่มขึ้นอย่างรวดเร็ว ฉันคาดว่าจะใช้เวลาประมาณ 3-4 สัปดาห์ในการทำให้มันทำงานใน Toolchain นั้น
โปรดทราบว่านี่ไม่ใช่ปัญหาของ Neovim การใช้การพึ่งพาและการใช้ประโยชน์จาก CMake
เป็นการตัดสินใจที่ดี ซึ่งเป็นผลมาจากระบบการสร้าง OCaml ของเรา ห่วงโซ่เครื่องมือคอมไพเลอร์ข้าม Cygwin + MingW ไม่ได้รับการจัดการอย่างดีจากการขึ้นต่อกันทั้งหมด (เนื่องจากเป็นลูกผสมแปลก ๆ ของ Win32 และ Unix มักเป็นกรณีที่ #ifdefs ผิด การขึ้นต่อกันที่ไม่ถูกต้องถูกดึงเข้ามา และอาจทำให้เสียเวลามาก แก้ไขปัญหาเหล่านี้)
ในทางตรงกันข้าม Vim สามารถคอมไพล์ในสภาพแวดล้อมนั้นได้อย่างง่ายดาย (หมายเหตุ: หากใครสนใจที่จะสร้างแพ็คเกจ Neovim ที่เปิดใช้งาน esy
ข้ามแพลตฟอร์ม เราก็สามารถกลับมาดูสิ่งนี้ได้อีกครั้ง!) ฉันยังสนใจในการสร้าง WebAssembly สำหรับการย้ายบทช่วยสอน Onivim v1 ไปยังเว็บ ซึ่งไลบรารี C-abstracted ที่คอมไพล์ไปยัง WebAssembly จะเหมาะสมอย่างยิ่ง
นอกเหนือจากปัญหาด้านบิวด์ ทั้ง Neovim และ Vim จะต้องมีการปรับโครงสร้างใหม่เพื่อจัดเตรียม API การทำงานแบบซิงโครนัส:
แรงจูงใจของงานทั้งหมดนี้คือการลบเลเยอร์ RPC ออกจาก Onivim v2 เพื่อลดความซับซ้อนและโหมดความล้มเหลว ท้ายที่สุด นี่เป็นการตัดสินใจทางเทคนิคที่อิงตามข้อจำกัดล้วนๆ หากเราได้รับ API ที่คล้ายกัน ซึ่งสามารถสร้างได้ผ่าน esy
ข้ามแพลตฟอร์ม พร้อมด้วย nvim
- ฉันยินดีที่จะใช้สิ่งนั้น :)
หาก libvim
น่าสนใจสำหรับคุณ และคุณต้องการสนับสนุนการพัฒนา ให้พิจารณาสิ่งต่อไปนี้:
หากคุณต้องการช่วยทำให้ libvim
ดีขึ้น โปรดดูไฟล์ CONTRIBUTING.md
สถานที่บางแห่งสำหรับการสนับสนุน:
libvim
รหัส libvim
ได้รับอนุญาตภายใต้ใบอนุญาต MIT
นอกจากนี้ยังขึ้นอยู่กับโค้ดของบุคคลที่สาม โดยเฉพาะ Vim แต่ยังขึ้นอยู่กับโค้ดอื่นๆ ด้วย - โปรดดู ThirdPartyLicenses.txt สำหรับรายละเอียดใบอนุญาต