Vim: Buffer/Window/Tab (Part 1)

Vim là một trình soạn thảo rất nổi tiếng vì nhiều mặt: người dùng quen thì nói rằng nó rất nhanh và tiện, là một trình soạn thảo tốt nhất mà bạn có thể tìm được, nhưng đồng thời nó cũng nổi tiếng vì có learning curve quá steep và rất dễ gây sợ hãi cho những người mới học, đặc biệt là những bạn nào mới sử dụng vim lần đầu tiên. Sau khi thử qua khá nhiều trình soạn thảo thông dụng và được đánh giá cao như Sublime Text, VSCode, hoặc cả 1 IDE như Webstorm, RubyMine,... mình đã dừng lại ở Vim và đang tuơng đối hài lòng với những gì nó mang lại. Vì vậy mình quyết định viết series này để một phần nào đó giúp các bạn có thể tiếp cận với Vim một cách dễ dàng hơn, và có thể sử dụng nó một cách hiệu quả trong công việc hàng ngày.

Do đã có rất rất nhiều những tutorial cho beginner về Vim trên Internet, hoặc thậm chí ngay trên Viblo cũng có rất nhiều bài viết chất lượng để giúp các bạn có thể bắt đầu với Vim, nên mục tiêu series này của mình là giúp các bạn sử dụng nó hiệu quả hơn chứ không phải là một hướng dẫn kiểu "beginner" nữa. Do vậy, mình có một yêu cầu nhỏ, nhằm giúp các bạn có thể tận dụng được nhiều nhất những gì series này mang lại, đó là bạn cần có 1 chút kiến thức về Vim: không cần nhiều, chỉ cần biết những command cơ bản như h, j, k, l, biết mở và quit vim, và quan trọng là không nghĩ nó là nước rửa bồn cầu là được 😄. Tốt nhất là trước khi đọc series này, các bạn mở termial lên và chạy qua vimtutor một chút.

Một trong những khái niệm đầu tiên, rất cơ bản chúng ta cần nắm vững nếu muốn làm việc hiệu quả với Vim là khái niệm về buffer/window/tab. Mình thấy có khá nhiều bạn khi tiếp cận với Vim khá bối rối về những khái niệm này, dẫn đến việc sử dụng khó khăn vì hiểu sai mục đích của chúng, nguyên nhân là do trong Vim, một số khái niệm cùng tên nhưng sử dụng lại hơi khác so với các trình soạn thảo thông dụng mà trước đây các bạn sử dụng (ví dụ như Sublime, Vscode,...). Vì vậy trong bài viết đầu tiên này, mình sẽ tập trung làm rõ những khái niệm đó.

1. Buffer

Khái niệm đầu tiên chúng ta cần hiểu là Buffer

Khi bạn mở 1 file lên để edit với Vim (vd thông qua lệnh vim file.txt), thực chất, bạn đang làm việc với một phiên bản copy của file đó. Cụ thể hơn, nội dung của file được load vào buffer và khi edit, bạn sẽ edit trên buffer. Nếu hiểu sâu hơn 1 chút, buffer đơn giản là một vùng nhớ được cấp phát để chứa phiên bản copy của nội dung file bạn sử dụng.

Nội dung gốc của file sẽ không thay đổi trong suốt quá trình edit, cho đến khi nào bạn ghi ngược lại nội dung của buffer lên file (sử dụng lệnh :w)

Buffer có 3 trạng thái chính: active, hiddeninactive

  1. Active: buffer đang được hiển thị và chứa nội dung của file
  2. Hidden: buffer đang không được hiển thị (có thể hiểu là không được nhìn thấy)
  3. Inactive: buffer không chứa nội dung của file nào và cũng không ở trạng thái đang edit

Buffer cũng được chia thành 2 loại: [No Name] BufferScratch Buffer

  1. [No Name] Buffer: Có thể hiểu là một buffer không liên quan đến file nào. Ở phần trên, mình đã nói rằng 1 buffer chứa bản copy của 1 file đang được edit. Vậy trong trường hợp mình tạo 1 file mới thì sao? nó sẽ chứa phiên bản copy của file nào? Câu trả lời là không có file nào cả và khi chúng ta edit xong, sau đó save, Vim sẽ cảnh báo về việc ghi nội dung của buffer vào file.
  2. Scratch Buffer: giống với [No Name] Buffer ở chỗ nó cũng không gắn liền với file nào cả. Khác ở chỗ, với [No Name] Buffer, khi bạn tiến hành edit rồi quit, Vim sẽ thông báo về việc ghi nội dung buffer vào file. Nhưng với Scratch Buffer thì không, khi bạn edit, sau đó quit, Vim sẽ không có thông báo chút nào về việc save file cả và bạn sẽ mất toàn bộ nội dung vừa edit.

Chi tiết về cách sử dụng 2 loại buffer này mình sẽ đề cập ở những bài viết sau liên quan đến Files, tạm thời, bạn cứ hiểu rằng Vim có những loại buffer đó đã. Quan trọng nhất ở phần này là bạn hiểu được khái niệm buffer là gì.

2. Window

Sau khi hiểu được khái niệm buffer, window là khái niệm tiếp theo ta cần xem xét. Vim cho phép bạn chia viewport thành nhiều windows. Mỗi windows hiển thị nội dung của 1 buffer duy nhất. Nói thì hơi khó hiểu nên mình dùng hình dưới đây minh họa Ở hình trên, viewport chính là toàn bộ giao diện của vim được hiển thị nội dung file. Ở đây mình chia viewport này thành 2 windows (sử dụng lệnh :vsp) và cả 2 windows này đều hiển thị nội dung của 1 buffer. Bạn có thể chia viewport thành bao nhiêu windows tùy thích.

Một lợi ích của việc nhiều windows cùng hiển thị 1 buffer là khi bạn cần edit một file rất dài, khi edit đoạn dưới của file mà lại cần tham khảo đoạn trên của file thì việc chia viewport thành 2 windows thế này giúp bạn không phải cuộn lên cuộn xuống nhiều lần.

Tóm lại, hiểu 1 cách đơn giản nhất: windows chính là một cái cửa sổ để bạn có thể xem được nội dung của buffer, bạn có bao nhiêu cửa sổ nhìn vào 1 buffer cũng được, hoặc mỗi cửa sổ 1 buffer cũng được.

3. Tab

Khái niệm cuối cùng và cũng là khái niệm dễ gây hiểu lầm nhất đối với các bạn mới chuyển qua Vim là tab.

Ở những trình soạn thảo thông thường khác (ở đây mình lấy Sublime Text), mỗi tab tuơng ứng với 1 file. Như vậy, nếu map từ Vim sang Sublime Text thì Tab của Sublime Text gần giống nhất với Buffer của Vim (do cùng được gắn liền với 1 file)

Tab trong Vim là 1 group các windows, một group có thể chỉ có 1 hoặc nhiều windows cũng được, mình lấy ví dụ sau để các bạn dễ hình dung. Các bạn để ý phía góc trên bên trái, đó là khu vực hiển thị tab, ở đây mình đang có 2 tabs, và tab hiện tại mình có 2 windows cùng hiển thị 1 buffer (phía bên phải hiển thị các buffers có trong tab này) Khi mình chuyển sang tab bên cạnh, tab này hiện có 3 windows hiển thị 3 buffers Thường thì mình sử dụng tab để nhóm những windows hiển thị chung 1 loại nào đó, ví dụ trên, tab thứ nhất mình chỉ hiển thị những files controller, tab thứ 2 chuyên để edit các files view.

Okay, tạm thời bài viết đầu tiên khá nhẹ nhàng như vậy đã. Ở bài viết tiếp theo, mình sẽ trình bày một số command, config mình sử dụng để làm việc với Buffer, Windows và Tab


All Rights Reserved