- แนวทางใหม่ที่ทำให้ตัวเบราว์เซอร์เองกลายเป็นเครื่องมือที่เขียนโปรแกรมได้ ผ่าน ไฟล์ตั้งค่า TypeScript ที่อิงบน Firefox
- สามารถปรับแต่ง UI ของเบราว์เซอร์ เรียกใช้โปรเซสภายนอก และทำฟังก์ชันได้อย่างไร้ขีดจำกัด โดยไม่มีข้อจำกัดด้านความปลอดภัยของเว็บเอ็กซ์เทนชัน
- มี ระบบโหมดและการแมปปุ่ม แบบสไตล์ Vim รองรับการท่องเว็บด้วยคีย์บอร์ดอย่างเต็มรูปแบบโดยไม่ต้องใช้เมาส์
- มี ฟีเจอร์ที่เป็นมิตรกับนักพัฒนา ติดมาให้ เช่น hint mode, tab fuzzy finder, REPL และผ่านการใช้งานจริงมาแล้ว 6 เดือน
- ดาวน์โหลดเวอร์ชันอัลฟ่า ได้บน macOS และ Linux และเข้ากันได้เต็มรูปแบบกับเอ็กซ์เทนชันและเวิร์กโฟลว์เดิมของ Firefox
ที่มาของการพัฒนา Glide
- ผู้พัฒนาเคยใช้เอ็กซ์เทนชัน Tridactyl บน Firefox และพบปัญหาเรื่อง ข้อจำกัดด้านความปลอดภัยพื้นฐานของเว็บเอ็กซ์เทนชัน
- บนบางเว็บไซต์เช่น addons.mozilla.org เอ็กซ์เทนชันจะถูกปิดใช้งานทั้งหมด ทำให้การแมปปุ่มใช้การไม่ได้
- แม้แต่บนโฮมเพจที่ปรับแต่งเองก็พบปัญหาที่ Tridactyl ไม่ทำงาน
- ข้อจำกัดเหล่านี้เป็น โมเดลความปลอดภัยที่จำเป็นของเบราว์เซอร์ เพื่อปกป้องผู้ใช้จากเอ็กซ์เทนชันที่เป็นอันตราย แต่ในอีกด้านหนึ่งก็จำกัดความสามารถในการขยายอย่างมาก
- จากความต้องการเบราว์เซอร์ที่ปรับแต่งได้อย่างแท้จริงซึ่งทำได้ตั้งแต่การปรับแต่ง UI ของเบราว์เซอร์เองไปจนถึงการเรียกใช้เครื่องมือภายนอกแบบ ไร้ข้อจำกัด จึงเริ่มพัฒนา Glide ขึ้นมา
จุดแตกต่างสำคัญของ Glide
- มอบการควบคุมอย่างสมบูรณ์ผ่าน ไฟล์ตั้งค่า TypeScript
- ใช้งาน API และความสามารถที่เว็บเอ็กซ์เทนชันไม่มีทางรองรับได้
- เนื่องจากผู้ใช้ปลายทางเป็นผู้เขียนไฟล์ตั้งค่าเอง จึงไม่จำเป็นต้องมีข้อจำกัดด้านความปลอดภัยแบบเดิม เป็นโมเดลความปลอดภัยที่ต่างออกไปโดยพื้นฐาน
- สิ่งที่ทำได้จากไฟล์ตั้งค่า
- กำหนด การแมปปุ่ม แบบกำหนดเอง
- เข้าถึง Web Extension API
- รัน โปรเซสภายนอก ตามต้องการ
- กำหนด มาโคร เป็นต้น
- สร้างบนพื้นฐานของ Firefox จึงทำงานร่วมกับเอ็กซ์เทนชันและเวิร์กโฟลว์เดิมของ Firefox ได้โดยตรง
ตัวอย่างการตั้งค่าที่ใช้งานได้จริง
โคลน GitHub repository อัตโนมัติและเปิดตัวแก้ไขโค้ด
glide.keymaps.set("normal", "gC", async () => {
// extract the owner and repo from a url like 'https://github.com/glide-browser/glide'
const [owner, repo] = glide.ctx.url.pathname.split("/").slice(1, 3);
if (!owner || !repo) throw new Error("current URL is not a github repo");
// * clone the current github repo to ~/github.com/$owner/$repo
// * start kitty with neovim open at the cloned repo
const repo_path = glide.path.join(glide.path.home_dir, "github.com", owner, repo);
await glide.process.execute("gh", ["repo", "clone", glide.ctx.url, repo_path]);
await glide.process.execute("kitty", ["-d", repo_path, "nvim"], { cwd: repo_path });
}, { description: "open the GitHub repo in the focused tab in Neovim" });
- เมื่อกด
gC บนหน้า GitHub repository จะทำงานต่อไปนี้โดยอัตโนมัติ
- ดึงชื่อ owner และ repository จาก URL ปัจจุบัน
- โคลน repository ไปยังพาธ
~/github.com/$owner/$repo
- เปิด neovim ในเทอร์มินัล kitty และย้ายไปยัง repository ที่โคลนไว้
- ช่วยประหยัดเวลาได้ครั้งละไม่กี่วินาที และใช้เวลาเพิ่มการตั้งค่าเพียงไม่กี่นาที
สลับไปแท็บปฏิทินอย่างรวดเร็ว
glide.keymaps.set("normal", "gc", async () => {
const tab = await glide.tabs.get_first({ url: "https://calendar.google.com/*" });
assert(tab && tab.id);
await browser.tabs.update(tab.id, { active: true });
}, { description: "[g]o to [c]alendar.google.com" });
- กด
gc เพื่อสลับไปยังแท็บ Google Calendar ได้ทันที
ระบบโหมด
- นำ แนวคิดเรื่องโหมด ของ Vim มาใช้ ทำให้การแมปปุ่มทั้งหมดผูกกับโหมดเฉพาะ
- สลับโหมดอัตโนมัติ ตามการโต้ตอบกับเบราว์เซอร์
- โหมด
normal: โหมดพื้นฐาน
- โหมด
insert: สลับอัตโนมัติเมื่อคลิกองค์ประกอบ <input> เพื่อไม่ให้การแมปปุ่มรบกวนการพิมพ์ข้อความ
- โหมด
ignore: สลับด้วย Shift+Escape ใช้เมื่อเว็บไซต์ชนกับการแมปปุ่ม
การนำทางด้วยคีย์บอร์ด
Hint mode
- กดปุ่ม
f เพื่อเข้า hint mode
- แสดงโอเวอร์เลย์ ป้ายข้อความ บนองค์ประกอบที่คลิกได้ทั้งหมด เช่น ลิงก์และปุ่ม
- เมื่อพิมพ์ป้ายกำกับ ระบบจะโฟกัสและคลิกองค์ประกอบนั้น
- ควบคุมหน้าเว็บได้อย่างสมบูรณ์โดยไม่ต้องใช้เมาส์
ฟีเจอร์ที่ชอบเป็นการส่วนตัว
gI: โฟกัสไปยัง ช่องกรอกข้อมูลที่มองเห็นและมีขนาดใหญ่ที่สุด บนหน้าโดยอัตโนมัติ เป็นฟีเจอร์ที่ให้ความรู้สึกเหมือนเวทมนตร์
<space><space>: เรียกใช้ tab fuzzy finder เพื่อหาแท็บที่หายไปได้ง่าย
<c-i> และ <c-o>: สำคัญมากสำหรับ การนำทางแท็บก่อนหน้า
:repl: ทดสอบการเปลี่ยนแปลงในการตั้งค่า ได้อย่างรวดเร็ว
- hint mode: มีประโยชน์เวลาที่ไม่อยากเอื้อมมือไปจับเมาส์
- UI สไตล์ which-key: อินเทอร์เฟซที่ช่วย เตือนความจำเรื่องการแมปปุ่ม ต่าง ๆ
สถานะปัจจุบันและความพร้อมใช้งาน
- ใช้งานในชีวิตประจำวันมาแล้วประมาณ 6 เดือน
- แม้ยังอยู่ใน ช่วงอัลฟ่าเริ่มต้น แต่สามารถดาวน์โหลดได้บน macOS และ Linux
- แนะนำให้ดูบทสอนผ่านคำสั่ง
:tutor (แม้จะยังไม่เสร็จสมบูรณ์)
- ผู้ใช้ Linux ยังต้องแตกไฟล์และตั้งค่าด้วยตนเอง เพราะยังไม่ถูกเพิ่มเข้า package repository
- ดูตัวอย่างเพิ่มเติมได้ใน cookbook และ dotfiles ของผู้พัฒนา
- เนื่องจากเป็นเวอร์ชันอัลฟ่า API บางส่วนยังไม่ถูกพัฒนาครบ แต่เป้าหมายหลักคือการมอบการควบคุมอย่างสมบูรณ์
2 ความคิดเห็น
ดูเหมือนว่าจะต้องใช้งานแบบสายฮาร์ดคอร์พอสมควรนะครับ ถ้าสามารถใช้งานได้คุ้มค่าพอที่จะชดเชยข้อดีของ GUI ได้ล่ะก็นะ..
ความคิดเห็นใน Hacker News
chrome://ได้ไหม เวอร์ชัน Firefox ของ Vimium ทำตรงนี้ได้น่าผิดหวังเสมอ