Hướng dẫn sử dụng buffer Informational

Vim là một trình soạn thảo văn bản có nguồn gốc lâu đời qed. Được Bram Moolenaar phát hành vào năm 1991.

Show

Dự án của Vim được công khai trực tuyến tại vim.org.

Để tải Vim: Sử dụng trình quản lý package yêu thích của bạn hoặc tải trực tiếp tại vim.org.

Bạn nên thảo luận và đặt các câu hỏi tại hoặc sử dụng IRC (Freenode) trong kênh của

:h cmdline-ranges
:h 10.3

4.

Xem quá trình phát triển của Vim tại GitHub, và cùng nhau thảo luận trên .

Bạn cũng có thể đọc bài viết Why, oh WHY, do those #?@! nutheads use vi? để được giải thích thêm về những quan niệm sai lầm phổ biến về Vim.

Chú ý: mình sẽ giữ nguyện một số tên gọi và khái niệm ở nguyên bản tiếng anh, bời vì có rất nhiều từ được sử dụng rộng rãi và phổ biến trong giới lập trình rồi, nếu dịch hết sang Tiếng Việt, dù bạn có hiểu nhưng sau này khi muốn cài thêm plugin, viết plugin, hoặc hoặc VimScript, các bạn sẽ dễ nhầm lẫn với các khái niệm và tên gọi đó. Hơn hết nhiều từ dịch sang Tiếng Việt đọc rất chuối :3.

Triết lý của Vim

Vim tuân thủ triết lý chỉnh sửa theo phương thức. Điều này có nghĩa là Vim sẽ cung cấp nhiều chế độ và nhiều phím tắt khác nhau, ý nghĩa của các phím tắt sẽ được thay đổi theo từng chế độ. Bạn có thể sử dụng chế độ normal để điều hướng các tệp tin và con trỏ chuột, sử dụng chế độ insert để chèn văn bản, sử dụng chế độ visual để chọn nhiều dòng cùng một lúc, hoặc bạn có thể sử dụng chế độ command-line để truy cập các lệnh trong Vim, v.v. Điều này thoạt nghe thì có vẻ phức tạp, nhưng nó lại mạng đến một lợi thế rất lớn: đó là bạn không phải làm khổ các ngón tay của mình khi giữ nhiều nút trên bàn phím cùng một lúc, hầu hết thời gian khi bạn sử dụng Vim, bạn chỉ cần nhấn lần lượt từ phím này đến phím khác. Công việc càng thông dụng, thì càng ít phím phải nhấn.

Các khái niệm hoạt động cùng với việc chỉnh sửa theo phương thức là các toán tử (operators) và chuyển động (motions). Operators sẽ bắt đầu một hành động nhất định, ví dụ như: thay đổi, xóa hoặc chọn văn bản. Sau đó, bạn sẽ chỉ định vùng văn bản bạn muốn thực hiện thay đổi bằng cách sử dụng motion. Để thay đổi mọi thứ giữa các dấu ngoặc đơn, bạn có thể dùng

:h cmdline-ranges
:h 10.3

5. Để xóa toàn bộ nội dung của một đoạn văn bản, chỉ cần nhấn

:h cmdline-ranges
:h 10.3

6. (Bạn không cần quá lo lắng nếu bạn không hiểu các ví dụ này, nội dung chi tiết sẽ được diễn giải cặn kẽ trong các phần sau)

Nếu bạn nhìn những người sử dụng Vim thành thạo làm việc, bạn sẽ nhận thấy rằng họ nói ngôn ngữ của Vim, cũng giống như các nghệ sĩ piano xử lý các nhạc cụ của họ vậy. Các thao tác phức tạp được xử lý chỉ bằng một vài phím bấm. Họ thậm chí còn không thèm nghĩ về nó nữa, bởi vì bộ nhớ cơ bắp (muscle memory) đã tiếp quản công việc thay họ. Điều này làm giảm gánh nặng nhận thức (cognitive load) và giúp họ tập trung vào công việc thực sự của họ.

Những bước đầu tiên

Vim đi kèm với một hướng dẫn tương tác (sử dụng), giúp bạn hiểu và dạy bạn những điều cơ bản nhất mà bạn cần biết. Bạn có thể bắt đầu nó với lệnh:

Đừng bỏ cuộc bởi vì trông nó thật nhàm chán mà hãy cố gắng vượt qua hết tất cả các bài tập. Các trình soạn thảo văn bản hoặc IDE mà bạn sử dụng trước đây có lẽ hầu hết đều không theo triết lý chỉnh sửa theo phương thức, vì vậy việc phải chuyển qua, chuyển lại giữa các chế độ ban đầu sẽ có đôi chút khó khăn với bạn, nhưng bạn càng tập luyện, càng sử dụng Vim nhiều, nó sẽ trở thành bộ nhớ cơ bắp (muscle memory) của bạn.

Vim đã được tích hợp vào Stevie, một bản sao của vi, và hỗ trợ hai chế độ hoạt động khác nhau: "tương thích (compatible)" và "không tương thích (nocompatible)". Sử dụng vim ở chế độ compatible nghĩa là bạn sẽ sử dụng vi cho tất cả các thao tác, thay vì Vim (theo mặc định). Miễn là bạn chưa tạo file cấu hình (vimrc) hoặc khởi động Vim bằng cú pháp

:h cmdline-ranges
:h 10.3

7, chế độ tương thích chỉ là giả định, bạn không nên sử dụng Vim ở chế độ tương thích. Đừng nhé.

Các bước tiếp theo:

  1. Tạo file cấu hình cho riêng bạn.
  2. Chọn một vài để chuẩn bị sử dụng cho những tuần đầu tiên sử dụng Vim.
  3. Đọc qua phần để biết được những điều khó tin mà Vim có thể làm.
  4. Học theo nhu cầu sử dụng! Bạn sẽ không bao giờ hết được Vim. Nếu bạn gặp bất kì vấn đề nào, chỉ cần tìm kiếm nó trên mạng. Vấn đề mà bạn mắc phải đã được giải quyết sẵn trên mạng. Vim đi kèm với một bộ tài liệu tuyệt vời, và việc bạn phải biết cách sử dụng, tra khảo nó là một điều bắt buộc: .
  5. Đọc qua .

Lời khuyên cuối cùng: Vui lòng học cách sử dụng Vim đúng cách trước khi bạn bắt đầu thêm thắt các loại mà bạn không hề biết rằng những tính năng của các plugin đó đã sẵn có trong Vim.

File cấu hình vimrc đơn giản

Bạn có thể đặt file cấu hình vimrc của bạn ở

:h cmdline-ranges
:h 10.3

8 hoặc để quản lý tốt hơn, bạn có thể phân chia nó ra và đặt nó vào

:h cmdline-ranges
:h 10.3

9. Việc tách các file cấu hình ra sẽ giúp bạn dễ dàng quản lý các phiên bản cho từng bộ cấu hình của mình, và tải nó lên mạng, giả sử như Github chẳng hạn.

Bạn có thể tìm thấy nhiều file cấu hình

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

0 trên mạng, ví dụ như những file cấu hình của tôi, mặc dù trông chúng không được đơn giản cho lắm, nhưng nó sẽ cung cấp cho bạn một bộ cài đặt, cấu hình ổn định mà tôi cho là rất hữu ích để bạn bắt đầu.

Cuối cùng, bạn vẫn phải đọc qua hết tất cả các cài đặt có trong file cấu hình và tự quyết định sẽ cấu hình như thế nào cho chính bản thân mình. :-)

Xem file cấu hình ở đây nhé: vimrc

Trong trường hợp bạn quan tâm, đây là file cấu hình của tôi.

MẸO NHỎ: Hầu hết những người làm ra plugin đều chia sẻ file cấu hình vimrc của họ trên Github (thường thì họ sẽ đặt trong repo có tên "dotfiles" hoặc "vim-config"), vì vậy bất cứ khi nào bạn tìm thấy một plugin bạn thích, bạn hãy xem qua GitHub của tác giả làm ra plugin đó và xem qua các repo để tham khảo các file cấu hình của họ.

Bạn đang sử dụng phiên bản Vim nào?

Dùng lệnh

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

1 trong vim sẽ cung cấp cho bạn tất cả các thông tin bạn cần biết về phiên bản Vim mà bạn đang sử dụng.

Dòng đầu tiên cho bạn biết phiên bản Vim bạn đang sử dụng được biên dịch khi nào, cũng như phiên bản của nó, ví dụ: 7.4. Dòng tiếp theo có cấu trúc

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

2, là bản patch của Vim. Do đó, phiên bản Vim chính xác của bạn là 7.4.1051.

Dòng tiếp theo có thể là

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

3 hoặc

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

4 . Thông tin chúng muốn đề cập là liệu Vim của bạn có hỗ trợ giao diện (GUI) hay không, ví dụ: để khởi động

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

5 từ shell hoặc chạy

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

6 từ Vim trong terminal. Một thông tin quan trọng khác là

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

7 và

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

8. Vim phân biệt giữa các tập tính năng bằng các tên gọi như

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

9,

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

0,

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

1,

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

2, và

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

3, mỗi tập sẽ cũng cấp những tính năng khác nhau cho Vim của bạn.

Hầu hết các phiên bản của vim khi bạn xem

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

1 sẽ đều hiển thị các tính năng đang được hay không được tích hợp sẵn. Ví dụ

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

5 nghĩa là tính năng clipboard được tính hợp sẵn,

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

6 nghĩa là tính năng clipboard không được tính hợp sẵn trong phiên bản Vim hiện tại của bạn.

Một số tính năng của Vim cần được biên dịch để có thể hoạt động. Ví dụ để chạy được lệnh

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

7, bạn sẽ cần phiên bản Vim với tập tính năng

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

8, bởi vì tập đó có sẵn tính năng

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

9.

Nếu không rành, hoặc giả sử bạn cài đặt Vim từ trình quản lý package, hãy đảm bảo bạn đã cài đặt các gói có tên

:h :version
:h feature-list
:h +feature-list
:h has-patch

00,

:h :version
:h feature-list
:h +feature-list
:h has-patch

01,

:h :version
:h feature-list
:h +feature-list
:h has-patch

02,

:h :version
:h feature-list
:h +feature-list
:h has-patch

03 hoặc tương tự, vì các gói này thường đi kèm với bộ tính năng khổng lồ.

Bạn cũng có thể kiểm tra phiên bản hoặc các tính năng của Vim bằng các lập trình với lệnh như sau:

" Chạy lệnh gì nó nếu phiên bản của Vim mới hơn hoặc bằng 7.4.42 " Và phải có +profile if (v:version > 704 || v:version == 704 && has('patch42')) && has('profile') " do stuff endif

Để hiểu rõ hơn bạn có thể dùng các lệnh sau để tra cứu thêm thông tin:

:h :version
:h feature-list
:h +feature-list
:h has-patch

Cheatsheets

  • http://people.csail.mit.edu/vgod/vim/vim-cheat-sheet-en.png
  • https://cdn.shopify.com/s/files/1/0165/4168/files/preview.png
  • http://michael.peopleofhonoronly.com/vim/vim_cheat_sheet_for_programmers_screen.png
  • http://www.rosipov.com/images/posts/vim-movement-commands-cheatsheet.png

Hoặc bạn cũng có thể mở nhanh một bảng cheatsheet ngay bên trong vim: vim-cheat40.

Cơ bản

Buffer, window và tab

Vim là một trình soạn thảo văn bản. Mỗi khi văn bản được hiển thị, văn bản sẽ là một phần của buffer (bộ nhớ đệm). Mỗi file sẽ được mở trong buffer của riêng nó. Các plugin sẽ hiển thị nội dung của chúng trong buffer của riêng từng plugin, vv.

Các buffer có rất nhiều thuộc tính, ví dụ: văn bản có bạn có thể chỉnh sửa (modifiable) được hay không, hoặc liệu nó có được liên kết với một file nào đó hay không, và do đó nó cần được đồng bộ với ổ đĩa khi bạn lưu văn bản.

Các window là các cửa sổ (khung hiển thị) để hiển thị các buffer. Nếu bạn muốn xem nhiều file cùng một lúc hoặc nhiều vị trí các nhau trên một file, bạn sẽ phải sử dụng window.

Và làm ơn, đừng gọi chúng là splits (chia cửa sổ) . Bạn có thể chia một window làm 2, nhưng điều đó không khiến chúng trở thành splits.

Window có thể được chia theo chiều ngang hoặc chiều dọc, chiều dài và rộng của chúng cũng có thể được thay đổi. Do đó, bạn có thể sử dụng bất kì cách phân chia cửa sổ nào mà bạn thích nhất.

Tab (hay còn được gọi là Tab page), là tập hợp của các cửa sổ. Vì vậy, nếu bạn muốn sử dụng nhiều bố cục cửa sổ khác nhau, hãy sử dụng các tab.

Tóm lại, nếu bạn khởi động Vim mà không có bất kì arguments (tham số) nào, bạn sẽ chỉ có một tab, bên trong tab là một window đang hiển thị một buffer.

Ngoài ra, tất cả các buffer đều khả dụng trong toàn bộ trình soạn thảo Vim, và bạn có thể truy cập mọi buffer từ bất kì tab nào.

Hiểu rõ hơn về buffer

Bạn có thể khởi động Vim bằng các chạy lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

04. Nội dung của file sẽ được load vào buffer. Nội dung của buffer chỉ được đồng bộ hóa vào ổ đĩa (ghi vào file) khi bạn lưu nó bằng lệnh bên trong Vim.

Bởi vì buffer cũng được hiển thị bên trong window, nó cũng là một active buffer (buffer đang hoạt động). Bây giờ nếu bạn load một file khác với lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

05,

:h :version
:h feature-list
:h +feature-list
:h has-patch

06 sẽ trở thành hidden buffer (buffer ẩn) và

:h :version
:h feature-list
:h +feature-list
:h has-patch

07 sẽ trở thành

:h :version
:h feature-list
:h +feature-list
:h has-patch

08.

Cả hai buffer đều được liệt kê trong danh sách buffer, do đó, khi bạn dùng lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

09 để hiển thị danh sách buffer, chúng đều sẽ được hiển thị trong danh sách. Buffer của các plugin hoặc các buffer trợ giúp (help buffer) thông thường sẽ không được hiển thị trong danh sách buffer, bởi vì chúng không đại diện cho các file thông thường mà bạn hay chỉnh sửa bằng các trình soạn thảo văn bản. Để hiển thị tất cả buffer (kể các các buffer ẩn) bạn có thể sử dụng lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

10.

Unnamed buffers (các buffer không tên), cũng thường được sử dụng bởi các plugin, chúng là các buffer không có liên kết và cũng không đại diện cho một file cụ thể nào cả. Ví dụ: dùng lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

11 sẽ tạo ra một buffer tạm không có tên (unnamed buffer). Bạn có thể gõ vài dòng chữ vào đó và ghi nó vào đĩa bằng cách chỉ định một file để liên kết, ví dụ:

:h :version
:h feature-list
:h +feature-list
:h has-patch

12, nội dung bạn vừa gõ sẽ được lưu vào file

:h :version
:h feature-list
:h +feature-list
:h has-patch

13 và buffer vô danh vừa tạo sẽ trở thành một buffer bình thường.

Danh sách tham số

là một đặc trưng của Vim. Trước đây, bên trong vi, những thứ này chỉ được sử dụng như là các tham số, trong khi đó chúng lại có sẵn bên trong Vim.

Mỗi file (tên file) được cung cấp cho Vim bằng lệnh, đều được ghi nhớ trong danh sách tham số (argument list). Trong Vim, có thể có nhiều danh sách tham số khác nhau: theo mặc định, tất cả các tham số được đưa vào danh sách tham số toàn cục (global argument list), nhưng bạn có thể sử dụng lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

14 để tạo một danh sách tham số cục bộ (local) cho window.

Bạn có thể liệt kê danh sách tham số với lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

15. Chuyển đổi qua lại giữa các file từ danh sách tham số với lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

16,

:h :version
:h feature-list
:h +feature-list
:h has-patch

17,

:h :version
:h feature-list
:h +feature-list
:h has-patch

18,

:h :version
:h feature-list
:h +feature-list
:h has-patch

19,

:h :version
:h feature-list
:h +feature-list
:h has-patch

20 và các lệnh khác. Hoặc bạn cũng có thể thay thế file đó với file khác với lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

21,

:h :version
:h feature-list
:h +feature-list
:h has-patch

22 hoặc

:h :version
:h feature-list
:h +feature-list
:h has-patch

15 với một danh sách các file.

Việc sử dụng buffer hoặc danh sách tham số để làm việc với các file là tùy thuộc vào sở thích của bạn. Thông thường tôi thấy mọi người chỉ sử dụng danh sách buffer.

Tuy nhiên, có một trường hợp bạn cần phải sử dụng danh sách đối số để xử lý. Ví dụ: xử lý hàng loạt với lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

24!. Đây làm một ví dụ đơn giản:

:args /*.[ch] :argdo %s/foo/bar/ge | update

Các lệnh trên sẽ thay thế tất cả các chữ "foo" thành "bar" trong tất cả các file C và header file của chúng trong thư mục hiện tại.

Xem thêm:

:h :version
:h feature-list
:h +feature-list
:h has-patch

25

Mapping lệnh

Bạn có thể định nghĩa các mapping của mình với danh sách các lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

26. Mỗi lệnh trong danh sách các lệnh đó sẽ định nghĩa một mapping cho một chế độ (mode) nhất định. Về mặt kĩ thuật, Vim đi kèm với 12 chế độ, 6 trong số đó chúng ta có thể sử dụng được mapping. Ngoài ra, một số lệnh hoạt động trên nhiều chế độ cùng một lúc.

Đệ quy Không đệ quy Bỏ mapping Chế độ

:h :version
:h feature-list
:h +feature-list
:h has-patch

26

:h :version
:h feature-list
:h +feature-list
:h has-patch

28

:h :version
:h feature-list
:h +feature-list
:h has-patch

29 normal, visual, operator-pending

:h :version
:h feature-list
:h +feature-list
:h has-patch

30

:h :version
:h feature-list
:h +feature-list
:h has-patch

31

:h :version
:h feature-list
:h +feature-list
:h has-patch

32 normal

:h :version
:h feature-list
:h +feature-list
:h has-patch

33

:h :version
:h feature-list
:h +feature-list
:h has-patch

34

:h :version
:h feature-list
:h +feature-list
:h has-patch

35 visual

:h :version
:h feature-list
:h +feature-list
:h has-patch

36

:h :version
:h feature-list
:h +feature-list
:h has-patch

37

:h :version
:h feature-list
:h +feature-list
:h has-patch

38 command-line

:h :version
:h feature-list
:h +feature-list
:h has-patch

39

:h :version
:h feature-list
:h +feature-list
:h has-patch

40

:h :version
:h feature-list
:h +feature-list
:h has-patch

41 operator-pending

:h :version
:h feature-list
:h +feature-list
:h has-patch

42

:h :version
:h feature-list
:h +feature-list
:h has-patch

43

:h :version
:h feature-list
:h +feature-list
:h has-patch

44 insert

Ví dụ: lệnh sau đây sẽ map phím

:h :version
:h feature-list
:h +feature-list
:h has-patch

45 cho chế độ normal

:nmap :echo "foo"

Bỏ mapping của phím vừa map bằng lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

46.

Để biết thêm một số chế độ phổ biến khác (hoặc sự kết hợp của chúng), bạn có thể xem

:h :version
:h feature-list
:h +feature-list
:h has-patch

47.

Càng học bạn sẽ càng thấy Vim tuyệt vời. Chỉ có một vấn đề khá khó hiểu với những người mới bắt đầu,

:h :version
:h feature-list
:h +feature-list
:h has-patch

30 có tính đệ quy !. Đúng vậy, vế phải của lệnh sẽ nhận các lệnh mà bạn muốn map.

Vì vậy, nếu bạn muốn map một lệnh đơn giản ghi ra màn hình chữ "Foo", dùng lệnh: So you defined a mapping that simply echoes "Foo":

Nhưng nếu bạn muốn map hành vi mặc định của phím

:h :version
:h feature-list
:h +feature-list
:h has-patch

49 vừa map cho một phím khác ( di chuyển con trỏ về 1 từ đứng trước từ hiện tại) thì sao?. Hãy dùng lệnh:

Nếu bạn nhấn nút a, chúng ta nghĩ là con trỏ sẽ nhảy đến từ đứng trước từ hiện tại, nhưng thay vào đó, "Foo" sẽ được in ra trong dòng lệnh! Bởi vì chúng ta đã map phím

:h :version
:h feature-list
:h +feature-list
:h has-patch

49 cho một hành động khác rồi, đó là

:h :version
:h feature-list
:h +feature-list
:h has-patch

51.

Cách thích hợp để giải quyết vấn đề này là sử dụng mapping không đệ quy (non-recursive mapping):

Quy tắc: Luôn sử dụng mapping không đệ quy (non-recursive mapping) trừ khi bạn biết bạn đang làm gì.

Tra cứu các mapping mà bạn đã map bằng cách dùng lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

30. Lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

30 sẽ liệt kê tất cả các mapping normal và

:h :version
:h feature-list
:h +feature-list
:h has-patch

54 sẽ liệt kê tất cả các mapping bắt đầu mới mapleader (Phím leader mặc định, bạn có thể thay đổi phím này, chi tiết sẽ được trình bày trong phần sau).

Nếu bạn muốn vô hiệu hóa một mapping, hãy map chúng thành kí tự đặc biệt

:h :version
:h feature-list
:h +feature-list
:h has-patch

55 , ví dụ:

:h :version
:h feature-list
:h +feature-list
:h has-patch

56.

Xem thêm:

:h key-notation
:h mapping
:h 05.3

Phím leader

Phím leader có thể sử dụng chung với các mapping của bạn, giúp bạn thao tác đơn giản và nhanh chóng hơn. Mặc định, phím leader sẽ là

:h :version
:h feature-list
:h +feature-list
:h has-patch

57;

nnoremap h :helpgrep

Sau khi map với lệnh trên, bạn có thể nhấn trên bàn phím lần lượt 2 phím /h để chạy lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

58. Ngoài phím leader, bạn cũng có thể map với phím cách (space) bằng cách thay

:h :version
:h feature-list
:h +feature-list
:h has-patch

59 bằng

:h :version
:h feature-list
:h +feature-list
:h has-patch

60.

let mapleader = ' ' nnoremap h :helpgrep

Ngoài

:h :version
:h feature-list
:h +feature-list
:h has-patch

61

:h :version
:h feature-list
:h +feature-list
:h has-patch

62

:h :version
:h feature-list
:h +feature-list
:h has-patch

63

:h :version
:h feature-list
:h +feature-list
:h has-patch

64

:h :version
:h feature-list
:h +feature-list
:h has-patch

65` làm phím leader mặc định.

Lưu ý: Bạn cần phải cấu hình các leader trước khi tiến hành định nghĩa các mapping của mình. Tất cả các mapping đã được định nghĩa trước khi bạn định nghĩa các mapleader đều đã có hiệu lực, chúng sẽ không thay đổi vì bạn định nghĩa mapleader sau chúng.

:h :version
:h feature-list
:h +feature-list
:h has-patch

54 sẽ liệt kê tất cả các mapping với mapleader đã được áp dụng, bạn nên dùng lệnh này để kiểm tra lại các mapping của mình.

Xem thêm

:h :version
:h feature-list
:h +feature-list
:h has-patch

67 và

:h :version
:h feature-list
:h +feature-list
:h has-patch

68 để biết thêm chi tiết.

Bộ ghi nhớ

Bộ ghi nhớ (register) là nơi lưu trữ các thao tác trên văn bản của bạn. Việc bạn sao chép một đoạn văn bản vào bộ ghi nhớ được gọi là yanking và việc bạn trích xuất dữ liệu từ bộ ghi nhớ được gọi là pasting.

Vim cung cấp cho bạn các bộ ghi nhớ sau:

Loại Kí tự Được nhập bởi? Không được chỉnh sửa? Contains text from? Unnamed

:h :version
:h feature-list
:h +feature-list
:h has-patch

69 vim [ ] Thông tin sao chép hoặc xóa gần nhất. (

:h :version
:h feature-list
:h +feature-list
:h has-patch

70,

:h :version
:h feature-list
:h +feature-list
:h has-patch

71,

:h :version
:h feature-list
:h +feature-list
:h has-patch

72,

:h :version
:h feature-list
:h +feature-list
:h has-patch

73,

:h :version
:h feature-list
:h +feature-list
:h has-patch

  1. Numbered

:h :version
:h feature-list
:h +feature-list
:h has-patch

75 to

:h :version
:h feature-list
:h +feature-list
:h has-patch

76 vim [ ] bộ ghi nhớ

:h :version
:h feature-list
:h +feature-list
:h has-patch

75: Lần sao chép gần nhất. bộ ghi nhớ

:h :version
:h feature-list
:h +feature-list
:h has-patch

78: Lần xóa gần nhất. bộ ghi nhớ

:h :version
:h feature-list
:h +feature-list
:h has-patch

79: Lần xóa gần thứ nhì. Và cứ như vậy. Các bộ ghi nhớ từ

:h :version
:h feature-list
:h +feature-list
:h has-patch

78-

:h :version
:h feature-list
:h +feature-list
:h has-patch

76 không được phép chỉnh sửa queue. Small delete

:h :version
:h feature-list
:h +feature-list
:h has-patch

82 vim [ ] Lần xóa gần nhất mà có ít hơn 1 dòng. Named

:h :version
:h feature-list
:h +feature-list
:h has-patch

83 to

:h :version
:h feature-list
:h +feature-list
:h has-patch

84,

:h :version
:h feature-list
:h +feature-list
:h has-patch

85 to

:h :version
:h feature-list
:h +feature-list
:h has-patch

86 user [ ] Nếu bạn muốn sao chép vào bộ ghi nhớ

:h :version
:h feature-list
:h +feature-list
:h has-patch

83, bạn có thể thay thế nội dung của nó. Nếu bạn muốn sao chép vào bộ ghi nhớ

:h :version
:h feature-list
:h +feature-list
:h has-patch

85, bạn thêm nó vào sau nội dung của bộ ghi nhớ

:h :version
:h feature-list
:h +feature-list
:h has-patch

83. Read-only

:h :version
:h feature-list
:h +feature-list
:h has-patch

90,

:h :version
:h feature-list
:h +feature-list
:h has-patch

91,

:h :version
:h feature-list
:h +feature-list
:h has-patch

92 vim [x]

:h :version
:h feature-list
:h +feature-list
:h has-patch

90: Lệnh bạn dùng cuối cùng,

:h :version
:h feature-list
:h +feature-list
:h has-patch

91: Những từ gần nhất bạn thêm vào,

:h :version
:h feature-list
:h +feature-list
:h has-patch

92: Tên file của buffer hiện tại. Alternate buffer

:h :version
:h feature-list
:h +feature-list
:h has-patch

96 vim [ ] Những buffer được truy cập gần nhất của window hiện tại. Xem

:h :version
:h feature-list
:h +feature-list
:h has-patch

97 Expression

:h :version
:h feature-list
:h +feature-list
:h has-patch

98 user [ ] Đánh giá biểu thức VimL đã được sao chép. Ví dụ, nhập lệnh sao đây trong chế độ insert:

:h :version
:h feature-list
:h +feature-list
:h has-patch

99 và "10" sẽ được chèn vào buffer. Selection

:args /*.[ch] :argdo %s/foo/bar/ge | update

00,

:args /*.[ch] :argdo %s/foo/bar/ge | update

01 vim [ ]

:args /*.[ch] :argdo %s/foo/bar/ge | update

01 và

:args /*.[ch] :argdo %s/foo/bar/ge | update

00 là bộ ghi nhớ . Drop

:args /*.[ch] :argdo %s/foo/bar/ge | update

04 vim [x] Lần kéo thả gần nhất. Black hole

:args /*.[ch] :argdo %s/foo/bar/ge | update

05 vim [ ] Nếu bạn không muốn bất kì bộ ghi nhớ nào khác bị ảnh hưởng. Ví dụ, lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

06 sẽ xóa dòng hiện tại mà không thay đổi (ảnh hưởng) đến các bộ ghi nhớ

:h :version
:h feature-list
:h +feature-list
:h has-patch

69,

:h :version
:h feature-list
:h +feature-list
:h has-patch

78,

:args /*.[ch] :argdo %s/foo/bar/ge | update

00,

:args /*.[ch] :argdo %s/foo/bar/ge | update

01. Last search pattern

:args /*.[ch] :argdo %s/foo/bar/ge | update

11 vim [ ] Pattern gần nhất được sử dụng vơi

:args /*.[ch] :argdo %s/foo/bar/ge | update

11,

:args /*.[ch] :argdo %s/foo/bar/ge | update

13,

:args /*.[ch] :argdo %s/foo/bar/ge | update

14, etc.

Mỗi bộ ghi nhớ không bị giới hạn ghi chép (readonly), có thể được thiết lập bởi người dùng:

Sau đó, phím n sẽ di chuyển con trỏ đến lần xuất hiện tiếp theo của "bộ ghi nhớ".

Có rất nhiều trường hợp ngoại lệ khi các thanh ghi được lấp đầy một cách âm thầm, do đó, để chắc ăn, bạn nên đọc thêm

:args /*.[ch] :argdo %s/foo/bar/ge | update

15.

Sao chép với

:h :version
:h feature-list
:h +feature-list
:h has-patch

74 và dán với

:args /*.[ch] :argdo %s/foo/bar/ge | update

17/

:args /*.[ch] :argdo %s/foo/bar/ge | update

18, nhưng hãy nhớ rằng Vim phân biệt giữa các lựa chọn trực quan theo chiều của ký tự, và theo dòng. Xem thêm

:args /*.[ch] :argdo %s/foo/bar/ge | update

19.

Ví dụ: sao chép dòng

:args /*.[ch] :argdo %s/foo/bar/ge | update

20 (hoặc

:args /*.[ch] :argdo %s/foo/bar/ge | update

  1. sẽ sao chép dòng hiện tại. Sau đó, bạn di chuyển con trỏ đến 1 nơi nào khác tùy ý, dùng

:args /*.[ch] :argdo %s/foo/bar/ge | update

17 để dán nội dung đã sao chép bên dưới dòng hiện tại,

:args /*.[ch] :argdo %s/foo/bar/ge | update

18 để dán bên trên dòng hiện tại.

Ví dụ: sao chép chữ

Sao chép từ đầu tiên với

:args /*.[ch] :argdo %s/foo/bar/ge | update

24, sau đó bạn di chuyển con trỏ đến một nơi nào khác, dán từ vừa sao chép phía sau con trỏ của dòng hiện tại với phím

:args /*.[ch] :argdo %s/foo/bar/ge | update

17 và phía trước con trỏ với phím

:args /*.[ch] :argdo %s/foo/bar/ge | update

18;

Ví dụ: đặt tên cho bộ ghi nhớ

Lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

27 sẽ sao chép dòng hiện tại vào bộ ghi nhớ

:h :version
:h feature-list
:h +feature-list
:h has-patch

83. Di chuyển sang một dòng khác. Lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

29 sẽ chèn dòng hiện tại vào phía cuối của bộ ghi nhớ

:h :version
:h feature-list
:h +feature-list
:h has-patch

83.

Tôi khuyên bạn nên thử với tất cả các thanh ghi này một chút và liên tục dùng lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

31 để kiểm tra những gì đang thực sự diễn ra.

Sự thật thú vị: Trong Emacs "yanking" (sao chép) lại có nghĩa là pasting (dán) (hoặc chèn lại vào văn bản đã bị xóa trước đó), chứ không phải mang nghĩa copying (sao chép).

Phạm vi

Ranges (phạm vi) khá là dễ hiểu, những hầu hết các Vimmers đều không biết về chức năng đầy đủ của chúng.

  • Rất nhiều lệnh đều có phạm vi.
  • Một địa chỉ sẽ chỉ định một dòng nhất định.
  • Một phạm vi có thể là một địa chỉ duy nhất hoặc một cặp địa chỉ được phân cách bởi :args /*.[ch] :argdo %s/foo/bar/ge | update 32 hoặc là :args /*.[ch] :argdo %s/foo/bar/ge | update 33.
  • Ranges cho biết cách lệnh nên thực thi trên dòng nào.
  • Hầu hết các lệnh chỉ hoạt động trông dòng hiện tại theo mặc định. Các trường hợp đáng chú ý có thể kể đến là :args /*.[ch] :argdo %s/foo/bar/ge | update 34 và :args /*.[ch] :argdo %s/foo/bar/ge | update 14, chúng sẽ hoạt động trên tất cả các dòng.

Việc sử dụng các phạm vi khá là trực quan, đây là một số ví dụ (lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

36 là viết tắt của

:args /*.[ch] :argdo %s/foo/bar/ge | update

37):

Lệnh Các dòng sẽ thực thi lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

36 Dòng hiện tại.

:args /*.[ch] :argdo %s/foo/bar/ge | update

39 Dòng hiện tại.

:args /*.[ch] :argdo %s/foo/bar/ge | update

40 Dòng đầu tiên.

:args /*.[ch] :argdo %s/foo/bar/ge | update

41 Dòng cuối.

:args /*.[ch] :argdo %s/foo/bar/ge | update

42 Tất cả các dòng.

:args /*.[ch] :argdo %s/foo/bar/ge | update

43 Tất cả các dòng (cú pháp ngắn gọn cho lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

44).

:args /*.[ch] :argdo %s/foo/bar/ge | update

45 Dòng hiện tại tới dòng thứ 5.

:args /*.[ch] :argdo %s/foo/bar/ge | update

46 Cũng là dòng hiện tại tới dòng thứ 5.

:args /*.[ch] :argdo %s/foo/bar/ge | update

47 Dòng hiện tại và 3 dòng tiếp theo.

:args /*.[ch] :argdo %s/foo/bar/ge | update

48 Dòng đầu tiên tới dòng hiện tại, và thêm 3 dòng sau đó.

:args /*.[ch] :argdo %s/foo/bar/ge | update

49 Dòng hiện tại và 3 dòng cuối. (Vim sẽ cảnh báo bạn, vì đây là phạm vi đảo ngược.)

:args /*.[ch] :argdo %s/foo/bar/ge | update

50 Dòng thứ 3 cho tới dòng được x.

:args /*.[ch] :argdo %s/foo/bar/ge | update

51 Từ dòng tiếp theo, bắt đầu với từ "foo" cho tới hết file.

:args /*.[ch] :argdo %s/foo/bar/ge | update

52 Từ dòng kế tiếp của dòng bắt đầu với "foo" cho tới hết file.

Lưu ý là thay vì dùng

:args /*.[ch] :argdo %s/foo/bar/ge | update

32,

:args /*.[ch] :argdo %s/foo/bar/ge | update

33 có thể được dùng như là dấu phân cách. Sự khác biệt là trong trường hợp của công thức

:args /*.[ch] :argdo %s/foo/bar/ge | update

55, thì to là chỉ cho dòng hiện tại, nhưng khi dùng công thức

:args /*.[ch] :argdo %s/foo/bar/ge | update

56, to ở đây có liên quan đến địa chỉ của from!. Giả sử bạn đang ở dòng 5,

:args /*.[ch] :argdo %s/foo/bar/ge | update

57 sẽ chỉ xóa dòng 1 và 2.

Địa chỉ

:args /*.[ch] :argdo %s/foo/bar/ge | update

11 có thể được đặt trước bằng một địa chỉ khác. Điều này cho phép bạn gộp các pattern lại với nhau. Ví dụ:

Lệnh trên sẽ xóa dòng đầu tiên có chứa "quux" sau dòng đầu tiên chứa "bar" sau dòng đầu tiên có chứa "foo" kể từ sau dòng hiện tại.

Đôi khi Vim tự động thêm một phạm vi vào trước dòng lệnh của bạn. Ví dụ: bắt đầu lựa chọn nhiều dòng với chế độ visual bằng lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

59, chọn một số dòng bạn thích và nhập

:h :version
:h feature-list
:h +feature-list
:h has-patch

90. Dòng lệnh sẽ được điền với phạm vi

:args /*.[ch] :argdo %s/foo/bar/ge | update

61, có nghĩa là lệnh bạn chuẩn bị thực thi sẽ được áp dụng cho các dòng đã chọn trước đó. (Đây cũng là lý do tại sao đôi khi bạn thấy các mapping như là

:args /*.[ch] :argdo %s/foo/bar/ge | update

62. Ở đây

:args /*.[ch] :argdo %s/foo/bar/ge | update

63 được sử dụng để loại bỏ phạm vi, bởi vì Vim sẽ quăng lỗi khi bạn cho phạm vi vào một lệnh không hỗ trợ phạm vi.

Một ví dụ khác nữa là sử dụng

:args /*.[ch] :argdo %s/foo/bar/ge | update

64 ở chế độ normal. Thao tác này sẽ tự động điền

:args /*.[ch] :argdo %s/foo/bar/ge | update

65 vào dòng lệnh của bạn. Nếu bạn điền tiếp theo sau bởi một dòng lệnh, hay ứng dụng bên ngoài, đầu ra của dòng lệnh, ứng dụng đó sẽ thay thế cho dòng hiện tại. Vì vậy, bạn có thể thay thế đoạn văn hiện tại bằng đầu ra của lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

66 bằng cách sử dụng:

:args /*.[ch] :argdo %s/foo/bar/ge | update

67. Thật tuyệt.

Xem thêm:

:h cmdline-ranges
:h 10.3

Đánh dấu

Bạn có thể đánh dấu (marks) để ghi nhớ một vị trí, đó là vị trí dòng và cột bên trong một file.

Marks Được đặt bởi.. Công dụng

:h :version
:h feature-list
:h +feature-list
:h has-patch

83 -

:h :version
:h feature-list
:h +feature-list
:h has-patch

84 Người dùng Chỉ khả dụng cục bộ trong một file. Chuyển đến một dấu được đánh dấu bằng chữ viết thường nghĩa là chuyển con trỏ qua lại trong một file.

:h :version
:h feature-list
:h +feature-list
:h has-patch

85 -

:h :version
:h feature-list
:h +feature-list
:h has-patch

86 Người dùng Khả dụng toàn cục, cho tất cả các file. Còn được gọi là các _file mark. Chuyển cho trỏ đến một marker được đánh dấu bằng chữ viết hoa có thể nhảy sang một buffer khác buffer hiện tại.

:h :version
:h feature-list
:h +feature-list
:h has-patch

75 -

:h :version
:h feature-list
:h +feature-list
:h has-patch

76 viminfo

:h :version
:h feature-list
:h +feature-list
:h has-patch

75 là vị trí khi file viminfo được ghi lần cuối. Trong thực tế, điều này có nghĩa là khi Vim được đóng lần cuối.

:h :version
:h feature-list
:h +feature-list
:h has-patch

78 là vị trí khi Vim kết thúc lần gần thứ 2, và cứ thế cho các số tiếp theo.

Đặt

:args /*.[ch] :argdo %s/foo/bar/ge | update

76/

:args /*.[ch] :argdo %s/foo/bar/ge | update

77 hoặc

:args /*.[ch] :argdo %s/foo/bar/ge | update

78/

:args /*.[ch] :argdo %s/foo/bar/ge | update

79 trước một đánh dấu để tạo một cử chỉ (motion).

Sử dụng

:args /*.[ch] :argdo %s/foo/bar/ge | update

80 để ghi nhớ vị trí hiện tại với marker "m". Di chuyển xung quanh file và sau đó quay lại với

:args /*.[ch] :argdo %s/foo/bar/ge | update

81 (ký tự đầu tiên không phải khoảng trống trên 1 dòng) hoặc

:args /*.[ch] :argdo %s/foo/bar/ge | update

82 (vị trí cột chính xác đã đánh dấu). Các marker được đánh dấu bằng chữ thường sẽ được ghi nhớ khi bạn thoát Vim, nếu bạn yêu cầu file viminfo của mình làm như vậy, xem thêm

:args /*.[ch] :argdo %s/foo/bar/ge | update

83.

Sử dụng

:args /*.[ch] :argdo %s/foo/bar/ge | update

84 để ghi nhớ vị trí hiện tại với marker "M". Chuyển sang buffer khác và quay lại vị trí vừa đánh dấu với

:args /*.[ch] :argdo %s/foo/bar/ge | update

85 hoặc

:args /*.[ch] :argdo %s/foo/bar/ge | update

86.

Các cử chỉ khác:

Cử chỉ Nhảy đến..

:args /*.[ch] :argdo %s/foo/bar/ge | update

87,

:args /*.[ch] :argdo %s/foo/bar/ge | update

88 Dòng hoặc ký tự đầu tiên của văn bản đã thay đổi hay được sao chép trước đó.

:args /*.[ch] :argdo %s/foo/bar/ge | update

89,

:args /*.[ch] :argdo %s/foo/bar/ge | update

90 Dòng hoặc ký tự cuối cùng của văn bản đã thay đổi hay được sao chép trước đó.

:args /*.[ch] :argdo %s/foo/bar/ge | update

91,

:args /*.[ch] :argdo %s/foo/bar/ge | update

92 Dòng bắt đầu hoặc ký tự của các lựa chọn được chọn trong chế độ visual lần gần nhất.

:args /*.[ch] :argdo %s/foo/bar/ge | update

93,

:args /*.[ch] :argdo %s/foo/bar/ge | update

94 Dòng kết thúc hoặc ký tự của các lựa chọn được chọn trong chế độ visual lần gần nhất.

:args /*.[ch] :argdo %s/foo/bar/ge | update

95,

:args /*.[ch] :argdo %s/foo/bar/ge | update

96 Vị trí mà bạn vừa từ đó nhảy đến.

:args /*.[ch] :argdo %s/foo/bar/ge | update

97,

:args /*.[ch] :argdo %s/foo/bar/ge | update

98 Ví trí khi bạn thoát buffer lần gần nhất.

:args /*.[ch] :argdo %s/foo/bar/ge | update

99,

:nmap :echo "foo"

00 Vị trí bạn thực hiện chèn kí tự lần gần nhất.

:nmap :echo "foo"

01,

:nmap :echo "foo"

02 Vị trí bạn thực hiện thay đổi lần gần nhất.

:nmap :echo "foo"

03,

:nmap :echo "foo"

04 Bắt đầu câu hiện tại.

:nmap :echo "foo"

05,

:nmap :echo "foo"

06 Kết thúc của câu hiện tại.

:nmap :echo "foo"

07,

:nmap :echo "foo"

08 Bắt đầu của đoạn văn bản hiện tại.

:nmap :echo "foo"

09,

:nmap :echo "foo"

10 Kết thúc của đoạn văn bản hiện tại.

Các marker cũng có thể được sử dụng trong một . Bạn hẳn là đã thấy điều này trước đây và tự hỏi ý nghĩa của nó là gì: Chọn một số đoạn văn bản bạn thích ở chế độ visual và nhấn

:h :version
:h feature-list
:h +feature-list
:h has-patch

90, dòng lệnh sẽ hiển thị, và được thêm sẵn vào phía trước như thế này

:nmap :echo "foo"

12, có nghĩa là lệnh sau sẽ nhận được một phạm vi mà bạn đã chọn với chế độ visual.

Sử dụng

:nmap :echo "foo"

13 để liệt kê tất cả marker mà bạn đã đánh dấu. Đọc thêm tất cả mọi thứ về đánh dấu trong

:nmap :echo "foo"

14.

Gợi ý code

Vim cung cấp nhiều loại gợi ý code tự động (completion) trong chế độ insert. Nếu có nhiều kết quả gợi ý phù hợp, vim sẽ hiện một popup để bạn có thể lựa chọn kết quả phù hợp với ý của mình.

Các loại gợi ý code điển thì là các thẻ (tag), các hàm (function) được import từ các module hoặc các thư viện (library), tên file, từ điển (dictionary) hoặc các từ đơn giản xuất hiện trong buffer hiện tại.

Vim cung cấp các mapping cho các loại gợi ý code và chúng đều bắt đầu với

:nmap :echo "foo"

15 (Hãy nhớ là bạn cần sử dụng chúng trong chế độ insert):

Mapping Phân loại Xem thêm chi tiết

:nmap :echo "foo"

16 toàn bộ dòng

:nmap :echo "foo"

17

:nmap :echo "foo"

18 các từ khóa trong file hiện tại

:nmap :echo "foo"

19

:nmap :echo "foo"

20 các từ khóa trong tùy chọn

:nmap :echo "foo"

21

:nmap :echo "foo"

22

:nmap :echo "foo"

23 các từ khóa trong tùy chọn

:nmap :echo "foo"

24

:nmap :echo "foo"

25

:nmap :echo "foo"

26 các từ khóa trong các files hiện tại được mở

:nmap :echo "foo"

27

:nmap :echo "foo"

28 các thẻ (tags)

:nmap :echo "foo"

29

:nmap :echo "foo"

30 tên file

:nmap :echo "foo"

31

:nmap :echo "foo"

32 các định nghĩa (definitions) hoặc macros

:nmap :echo "foo"

33

:nmap :echo "foo"

34 các lệnh của Vim

:nmap :echo "foo"

35

:nmap :echo "foo"

36 người dùng tự định nghĩa (như đã được chỉ định trong

:nmap :echo "foo"

37)

:nmap :echo "foo"

38

:nmap :echo "foo"

39 omni completion (như đã được chỉ định trong

:nmap :echo "foo"

40)

:nmap :echo "foo"

41

:nmap :echo "foo"

42 gợi ý chính tả

:nmap :echo "foo"

43

Mọi người có lẽ sẽ nhầm lẫn về sự khác biệt giữa các gợi ý code do người dùng tự định nghĩa và omni completion, nhưng về mặt kĩ thuật, chúng đều làm những việc tương tự nhau. Chúng nhận một hàm kiểm tra vị trí hiện tại và trả về một danh sách gợi ý. Các gợi ý code do người dùng tự định nghĩa sẽ được định nghĩa theo mục đích cá nhân của người dùng đó. (Ngạc nhiên chưa!) Chúng có thể là bất cứ thứ gì. Omni gợi ý code thì có mục đích sử dụng cụ thể cho từng loại file, ví dụ như gợi ý các thành phần của struct, các phương thức (method) của class, và thường được cấu hình bởi các loại plugin cho từng loại file cụ thể.

Vim cũng cho phép thực hiện gợi ý code (completing) cho nhiều loại gợi ý code cùng một lúc bằng cách cấu hình cho cài đặt

:nmap :echo "foo"

44. Theo mặc định, cấu hình đó bao gồm khá nhiều thứ, vì vậy hãy nhớ loại bỏ bớt chúng để tối ưu theo sở thích của bạn. Bạn có thể kích hoạt gợi ý code bằng cách sử dụng

:nmap :echo "foo"

45 (chọn gợi ý tiếp theo) and

:nmap :echo "foo"

46 (chọn gợi ý trước), đây cũng là các phím được sử dụng để chọn các lựa chọn trong popup menu. Xem

:nmap :echo "foo"

47 và

:nmap :echo "foo"

48 để có thêm nhiều thông tin bổ ích.

Bạn cũng phải xem qua

:nmap :echo "foo"

49 để biết cách cấu hình cách hoặt động của các popup menu. Cấu hình mặc định là khá tốt, nhưng tôi cũng thích thêm cài đặt "noselect" vào.

Xem thêm:

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

Chuyển động, các toán tử, các đối tượng văn bản

Sự di chuyển (Motions) giúp bạn di chuyển con trỏ của mình. Sau khi tập luyện qua vimtutor , các bạn đều biết các phím

:nmap :echo "foo"

50/

:nmap :echo "foo"

51/

:nmap :echo "foo"

52/

:nmap :echo "foo"

53. Hoặc

:nmap :echo "foo"

54 và

:h :version
:h feature-list
:h +feature-list
:h has-patch

49. Thậm chí cả phím

:args /*.[ch] :argdo %s/foo/bar/ge | update

11 cũng là chuyển động. Chúng cũng có nhận cho mình số lần thực hiện. Ví dụ

:nmap :echo "foo"

57 sẽ di chuyển con trỏ đến lần xuất hiện gần thứ nhì của từ "the".

Xem qua

:nmap :echo "foo"

58 và tất cả những thứ bên dưới để biết tất cả các loại chuyển động khả dụng.

Operators hoạt động trên một vùng văn bản, một vài ví dụ như

:h :version
:h feature-list
:h +feature-list
:h has-patch

70,

:args /*.[ch] :argdo %s/foo/bar/ge | update

04,

:nmap :echo "foo"

61,

:nmap :echo "foo"

62. Chúng được sử dụng trong cả hai chế độ normal và visual. Ở chế độ normal, toán tử sẽ đi trước, kèm theo sau là một chuyển động, ví dụ

:nmap :echo "foo"

63. Trong chế độ visual, các toán tử chỉ đơn giản là để thực hiện các lựa chọn, ví như

:nmap :echo "foo"

64.

Giống như các chuyển động, các toán tử cũng nhận cho mình số lần thực hiện, ví dụ

:nmap :echo "foo"

65 sẽ viết hoa phần còn lại của từ hiện tại và từ tiếp theo. Vì các toán tử có số lần thực hiện,

:nmap :echo "foo"

66 cũng hoạt động giống như

:nmap :echo "foo"

67 nhưng được thực hiện 2 lần.

Xem

:nmap :echo "foo"

68 để biết tất cả các toán tử khả dụng. Sử dụng

:nmap :echo "foo"

69 để cho phím

:args /*.[ch] :argdo %s/foo/bar/ge | update

04 hoạt động như một toán tử.

Các đối tượng văn bản hoạt động trên khu vực xung quanh chúng, trái ngược với các chuyển động chỉ hoạt động trên một hướng. Trên thực tế, chúng hoạt động trên các đối tượng (object), ví dụ: cả một từ, toàn bộ một câu, mọi thứ nằm trong dấu ngoặc đơn, v.v.

Các đối tượng văn bản không thể được sử dụng để di chuyển con trỏ trong chế độ normal, bởi vì ngay cả những con trỏ đỉnh cao nhất cũng không thể nhảy về 2 hướng cùng một lúc. Mặc dù vậy, chúng hoạt động trong chế độ visual, vì khi đó một bên của đối tượng đã được chọn, và con trỏ chỉ đơn giản là nhảy sang bên còn lại.

Các đối tượng văn bản bắt đầu bằng

:nmap :echo "foo"

71 (inner) hoặc

:h :version
:h feature-list
:h +feature-list
:h has-patch

83 (around) theo sau là một ký tự biểu thị đối tượng. Với

:nmap :echo "foo"

71, chúng chỉ hoạt động trên chính đối tượng đó, còn với

:h :version
:h feature-list
:h +feature-list
:h has-patch

83 chúng hoạt động trên đối tượng đó cộng với khoảng trắng đi theo sau đó. Ví dụ,

:nmap :echo "foo"

75 sẽ xóa từ hiện tại và

:h cmdline-ranges
:h 10.3

5 thay đổi mọi thứ nằm bên trong dấu ngoặc đơn.

Các đối tượng văn bản cũng nhận vào số lượng. Hãy tưởng tượng

:nmap :echo "foo"

77 và con trỏ trên hoặc giữa đấu ngoặc đơn trong cùng, thì

:nmap :echo "foo"

78 sẽ xóa 2 cặp dấu ngoặc đơn bên trong và mọi thứ ở giữa chúng.

Xem thêm

:nmap :echo "foo"

79 để biết tất cả các đối tượng văn bản khả dụng.

Lệnh tự động

Bạn có thể kích hoạt một hành động sau các sự kiện (events) của Vim, chẳng hạn như khi buffer được lưu hoặc khi Vim đã khởi động, bằng thứ gọi là các lệnh tự động (autocmds).

Vim phụ thuộc rất nhiều vào các lệnh tự động. Không tin tôi ư? Thử chạy lệnh

:nmap :echo "foo"

80 xem, nhưng bạn cũng đừng lo lắng với danh sách khổng lồ đó. Đó là tất cả các lệnh tự động đang có hiệu lực trong Vim của bạn.

Xem

:nmap :echo "foo"

81 để biết một cách tổng quan về các sự kiện có sẵn trong Vim và

:nmap :echo "foo"

82 để biết thêm chi tiết.

Một ví dụ điển hình sẽ là áp dụng các cài đặt riêng cho từng loại file khác nhau.

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

Nhưng làm sao một buffer có thể biết rằng nó đang chứa code Ruby? Bởi vì một lệnh tự động khác đã xác định nó và đặt loại file (filetype) phù hợp cho buffer đó rồi, điều này một lần nữa lại kích hoạt một sự kiện

:nmap :echo "foo"

83;

Một trong những cài đặt đầu tiên mà mọi người thường thêm vào file cấu hình Vim của họ đó là

:nmap :echo "foo"

84. Điều này hiểu nôm na là

:nmap :echo "foo"

85 được thực thi khi Vim khởi động, đặt các lệnh tự động để xác định loại file cho hều hết các loại file trên thế giới này :).

Nếu bạn đủ dũng cảm, hãy xem thử:

:nmap :echo "foo"

86. Tìm "Ruby" và bạn sẽ thấy là Vim chỉ đơn giản sử dụng phần mở rộng của file (file extension) để xác định đó có phải một file Ruby hay không.

Lưu ý: Autocmds của cùng một sự kiện được thực thi theo thứ tự chúng được tạo. Nếu bạn chạy lệnh

:nmap :echo "foo"

80 chúng sẽ được liệt kê theo đúng thứ tự (từ trên xuống).

:h :version
:h feature-list
:h +feature-list
:h has-patch

0

Các sự kiện

:nmap :echo "foo"

88 và

:nmap :echo "foo"

89 trong trường hợp này được code cứng trong mã nguồn (ngôn ngữ C) và sẽ thực thi mỗi khi bạn mở một file với lệnh

:nmap :echo "foo"

90 và các lệnh tương tự. Sau đó, hàng trăm loại file đều được

:nmap :echo "foo"

85 kiểm tra.

Tóm lại, Vim sử dụng nhiều sự kiện và các lệnh tự động nhưng cũng chìa ra các interface gọn gàng để kết nối với hệ thống hướng sự kiện (event-driven system) của nó để chúng ta dễ dàng tùy biến.

Xem thêm:

:nmap :echo "foo"

92

Danh sách thay đổi, danh sách nhảy

Vị trí của 100 sự thay đổi gần nhất được Vim lưu trữ trong danh sách thay đổi ( changelist). Một vài thay đổi nhỏ trên cùng một dòng sẽ được gộp lại với nhau, tuy nhiên, ví trí thay đổi sẽ được lấy vị trí của thay đổi cuối cùng (trong trường hợp bạn đã thêm gì đó vào giữa một dòng).

Mỗi khi bạn nhảy con trỏ của mình đến một vị trí khác, vị trí trước đó sẽ được lưu vào danh sách nhảy (jumplist). Một danh sách nhảy có thể có tới 100 mục. Mỗi window sẽ có danh sách nhảy riêng của nó. Khi bạn tách một window, danh sách nhảy sẽ được sao chép theo.

Lệnh nhảy (nhảy) con trỏ là một trong các lệnh sau:

:args /*.[ch] :argdo %s/foo/bar/ge | update

76,

:args /*.[ch] :argdo %s/foo/bar/ge | update

78,

:nmap :echo "foo"

95,

:args /*.[ch] :argdo %s/foo/bar/ge | update

11,

:args /*.[ch] :argdo %s/foo/bar/ge | update

13,

:nmap :echo "foo"

98,

:nmap :echo "foo"

99,

:h :version
:h feature-list
:h +feature-list
:h has-patch

92,

:h key-notation
:h mapping
:h 05.3

01,

:h key-notation
:h mapping
:h 05.3

02,

:h key-notation
:h mapping
:h 05.3

03,

:h key-notation
:h mapping
:h 05.3

04,

:h key-notation
:h mapping
:h 05.3

05,

:h key-notation
:h mapping
:h 05.3

06,

:h key-notation
:h mapping
:h 05.3

07,

:h key-notation
:h mapping
:h 05.3

08,

:h key-notation
:h mapping
:h 05.3

09,

:h key-notation
:h mapping
:h 05.3

10,

:h key-notation
:h mapping
:h 05.3

11 và các lệnh để bạn bắt đầu chỉnh sửa một file mới.

Danh sách Lệnh để liệt kê Về vị trí trước đó Tới vị trí sau vị trí hiện tại jumplist

:h key-notation
:h mapping
:h 05.3

12

:h key-notation
:h mapping
:h 05.3

13

:h key-notation
:h mapping
:h 05.3

14 changelist

:h key-notation
:h mapping
:h 05.3

15

:h key-notation
:h mapping
:h 05.3

16

:h key-notation
:h mapping
:h 05.3

17

Khi bạn liệt kê tất cả các mục, một marker

:nmap :echo "foo"

62 sẽ được dùng để hiển thị vị trí hiện tại của bạn. Thông thường đó sẽ là bên dưới vị trí 1, vị trí gần nhất.

Nếu bạn muốn cả hai danh sách vẫn còn tồn tại sau khi bạn khởi động lại Vim, bạn cần sửa dụng file viminfo và

:h key-notation
:h mapping
:h 05.3

19.

Chú ý: Vị trí lần nhảy mới nhất cũng được lưu trữ dưới dạng một và có thể được nhảy đến với lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

96 hoặc

:args /*.[ch] :argdo %s/foo/bar/ge | update

95.

Xem thêm:

:h :version
:h feature-list
:h +feature-list
:h has-patch

1

Cây hoàn tác

Những thay đổi mới nhất của một văn bản đều được Vim ghi nhớ vào cây hoàn tác (Undo tree). Bạn có thể dử dụng undo để hoàn tác một thay đổi và redo để áp dụng lại thay đổi vừa hoàn tác.

Điều quan trọng mà bạn cần hiểu là cấu trúc dữ liệu để lưu trữ các thay đổi trong Vim không phải là hàng đợi (queue) mà là cấu trúc cây (tree)!. Các thay đổi của bạn sẽ là các nút (node) trong cây, và mỗi nút (trừ nút trên cùng), sẽ có một nút cha. Mỗi nút giữ thông tin về văn bản của bạn, và thời gian bạn đã thay đổi chúng. Một nhánh (branch) là một danh sách các nút bắt đầu từ nút bất kì nào đó và đi lên đến nút trên cùng (nút gốc). Các nhánh sẽ được tạo khi bạn hoàn tác một thay đổi và sau đó chèn một đoạn khác vào văn bản bạn vừa hoàn tác.

:h :version
:h feature-list
:h +feature-list
:h has-patch

2

Bây giờ bạn có 3 dòng và cây hoàn tác của bạn sẽ trông như thế này:

:h :version
:h feature-list
:h +feature-list
:h has-patch

3

Cây hoàn tác có 4 thay đổi. Các con số đại diện cho thời gian các nút được tạo.

Bạn có hai cách để đi qua cây hoàn tác này, hãy gọi chúng là branch-wise and time-wise (Duyệt cây theo nhánh hoặc theo thời gian).

Hoàn tác (

:h key-notation
:h mapping
:h 05.3

  1. và áp dụng lại (

:h key-notation
:h mapping
:h 05.3

  1. hoạt động theo nhánh. Chúng sẽ đi lên và xuống trong nhánh hiện tại.

:h key-notation
:h mapping
:h 05.3

22 sẽ hoàn tác lại nguyên trạng văn bản của nút "bar". Nhấn

:h key-notation
:h mapping
:h 05.3

22 một lần nữa sẽ hoàn tác lại nguyên trạng văn bản của nút xa hơn nữa đó là nút "foo". Tiếp theo, nếu bạn nhấn

:h key-notation
:h mapping
:h 05.3

23, văn bản của bạn sẽ quay trở lại trạng thái của nút "bar", nhấn tiếp một lần nữa bạn sẽ có văn bản ở trạng thái của nút "baz". (Bạn không thể dùng lệnh để đi đến node "baz" bằng cách duyệt cây theo nhánh (branch-wise)).

Khác với việc duyệt theo nhánh,

:h key-notation
:h mapping
:h 05.3

27 và

:h key-notation
:h mapping
:h 05.3

28 duyệt cây theo thời gian. Do đó,

:h key-notation
:h mapping
:h 05.3

27 không hoàn tác trạng thái của văn bản về nút "bar", giống như khi bạn dùng

:h key-notation
:h mapping
:h 05.3

22, mà nó sẽ hoàn tác về trạng thái trước đó theo thời gian, nghĩa là nút "baz". Nhấn

:h key-notation
:h mapping
:h 05.3

27 một lần nữa sẽ hoàn tác văn bản về trạng thái của nút "bar", và cứ thế tiếp tục. Vì vậy

:h key-notation
:h mapping
:h 05.3

27 và

:h key-notation
:h mapping
:h 05.3

28 chỉ đơn giản là hoàn tác về trạng thái trước tuần tự theo thời gian.

Lệnh / Mapping Hành động

:h key-notation
:h mapping
:h 05.3

34,

:h key-notation
:h mapping
:h 05.3

35 Hoàn tác thay đổi [số] lần.

:h key-notation
:h mapping
:h 05.3

36,

:h key-notation
:h mapping
:h 05.3

37 Áp dụng lại thay đổi [số] lần.

:h key-notation
:h mapping
:h 05.3

38 Hoàn tác tất cả các thay đổi đối với dòng được thay đổi gần nhất.

:h key-notation
:h mapping
:h 05.3

39,

:h key-notation
:h mapping
:h 05.3

40 Chuyển đến trạng thái của văn bản trước đó [số] lần. Trong đó "?" có thể là "s", "m", "h", "d", hoặc "f". Ví dụ:

:h key-notation
:h mapping
:h 05.3

41 sẽ hoàn tác văn bản về trạng thái của 2 ngày trước.

:h key-notation
:h mapping
:h 05.3

42 sẽ hoàn tác văn bản về trạng thái của lần lưu gần nhất.

:h key-notation
:h mapping
:h 05.3

43,

:h key-notation
:h mapping
:h 05.3

44 Giống như trên, nhưng theo hướng ngược lại.

Cây hoàn tác được Vim lưu trữ trong bộ nhớ và sẽ bị xóa khi bạn thoát Vim. Xem thêm để biết thêm chi tiết.

Nếu bạn cảm thấy khó khăn với cây hoàn tác, undotree sẽ giúp bạn hiểu cây hoàn tác với cái nhìn trực quan hơn.

Xem thêm:

Danh sách sửa lỗi nhanh và danh sách vị trí

Danh sách Sửa lỗi nhanh (Quickfix) là một cấu trúc dữ liệu chứa vị trí của các file. Về cơ bản, mỗi mục trong danh sách sửa lỗi nhanh sẽ liệt kê đường dẫn của một file, số thứ tự của một dòng, cột và một mô tả.

Các trường hợp sử dụng điển hình là để tập hợp các lỗi biên dịch hoặc kết quả của một công cụ grep (Tìm nội dung trong file).

Vim có một loại buffer đặc biệt để hiển thị danh sách sửa lỗi nhanh: bộ đệm sửa lỗi nhanh (quickfix bufer). Mỗi dòng trong buffer sửa lỗi nhanh hiển thị một mục từ danh sách sửa lỗi nhanh.

Thông thường, bạn sẽ mở một window mới để hiển thị danh sách sửa lỗi nhanh. Khi bạn làm điều đó, window được sử dụng lần gần nhất sẽ được liên kết với cửa sổ sửa lỗi nhanh (quickfix window).

Trong buffer sửa lỗi nhanh, dùng

:h key-notation
:h mapping
:h 05.3

45 để mở một mục đang được chọn trong window đang được liên kết và

:h key-notation
:h mapping
:h 05.3

46 để mở mục đó trong một window mới.

Danh sách sửa lỗi nhanh được đặt tên theo tính năng "quick fix" của Aztec C compiler.

Trên thực tế, có hai loại danh sách: danh sách sửa lỗi nhanh (quickfix) và danh sách vị trí (location list). Chúng hoạt động gần như giống nhau, nhưng có các điểm khác biệt sau:

  • Chỉ có thể có một danh sách sửa lỗi nhanh duy nhất. Nhưng có thể có nhiều danh sách vị trí; mỗi danh sách tương ứng với một window.
  • Chúng sử dụng các lệnh hơi khác nhau để điều hướng. Hành động Sửa lỗi nhanh Vị trí mở window

:h key-notation
:h mapping
:h 05.3

47

:h key-notation
:h mapping
:h 05.3

48 đóng window

:h key-notation
:h mapping
:h 05.3

49

:h key-notation
:h mapping
:h 05.3

50 mục tiếp theo

:h key-notation
:h mapping
:h 05.3

51

:h key-notation
:h mapping
:h 05.3

52 mục trước đó

:h key-notation
:h mapping
:h 05.3

53

:h key-notation
:h mapping
:h 05.3

54 mục đầu tiên

:h key-notation
:h mapping
:h 05.3

55

:h key-notation
:h mapping
:h 05.3

56 mục cuối cùng

:h key-notation
:h mapping
:h 05.3

57

:h key-notation
:h mapping
:h 05.3

58

Lưu ý rằng các cửa sổ định vị và sửa lỗi nhanh không cần phải mở để các lệnh này có thể hoạt động.

Xem thêm

:h key-notation
:h mapping
:h 05.3

59 để có thêm nhiều thông tin chi tiết và danh sách các lệnh đầy đủ.

Để ngắn gọn, quickfix và location thường được viết tắt là qf và loc.

Ví dụ**:

Hãy dùng

:h key-notation
:h mapping
:h 05.3

60 để tìm kiếm các file trong thư mục hiện tại cho một truy vấn nhất định nào đó và đưa kết quả tìm được vào danh sách sửa lỗi nhanh.

:h :version
:h feature-list
:h +feature-list
:h has-patch

4

Giả sử tất cả các file đều chứa chuỗi "foo", cửa sổ sửa lỗi nhanh sẽ được hiển thị với các kết quả từ grep.

Macros

Vim cho phép bạn ghi lại các ký tự đã nhập vào . Vim cho phép _ ghi âm_ các ký tự đã nhập vào [sổ đăng ký] (# đăng ký). Đó là một cách tuyệt vời để tự động hóa một số tác vụ mà bạn phải làm đi làm lại. (Đối với các tác vụ phức tạp hơn, bạn nên sử dụng VimScript để thay thế.)

  • Bắt đầu ghi lại hành động của bạn bằng cách nhấn phím

    :h key-notation :h mapping :h 05.3

    61 theo sau là tên bộ ghi, ví dụ :

    :h key-notation :h mapping :h 05.3

    61. (Thanh trạng thái lúc này sẽ hiển thị "recording @q".)
  • Kết thúc quá trì ghi bằng cách nhấn phím

    :h key-notation :h mapping :h 05.3

    61 một lần nữa.
  • Chạy macro vừa ghi với

    :h key-notation :h mapping :h 05.3

    64. Ví dụ

    :h key-notation :h mapping :h 05.3

    65 sẽ chạy cách lệnh bạn vừa ghi lại 2 lần.
  • Lặp lại macro được sử dụng lần gần nhất với

    :h key-notation :h mapping :h 05.3

    66.

Ví dụ 1:

Chèn một dòng và lặp lại nó 10 lần:

(Ví dụ trên cũng có thể được thực hiện mà không cần macro: `oabc 10. ')

Ví dụ 2:

Để thêm số thứ tự vào trước tất cả các dòng, bạn hãy tự thêm "1." vào dòng đầu tiên. Tăng số đang hiển thị tại con trỏ bằng cách sử dụng

:h key-notation
:h mapping
:h 05.3

67, lệnh này có thể được viết dưới dạng

:h key-notation
:h mapping
:h 05.3

68.

Ở đây, chúng ta giả định rằng file không chứa nhiều hơn 1000 dòng khi sử dụng

:h key-notation
:h mapping
:h 05.3

69, nhưng chúng ta cũng có thể sử dụng macro_ đệ quy, nó sẽ thực thi cho đến khi không thể áp dụng macro cho một dòng nữa:

(Ví dụ trên cũng có thể được thực hiện mà không cần macro:

:h key-notation
:h mapping
:h 05.3

70)

Lưu ý rằng tôi cũng chỉ bạn cách làm tương tự với những ví dụ trên mà không cần phải sử dụng macros, nhưng chúng chỉ thích hợp với những công việc đơn giản. Đối với những công việc cần thực hiện tự động nhưng phức tạp hơn, macros mới chính là thứ bạn cần.

Bạn cũng nên xem:

Xem thêm:

:h :version
:h feature-list
:h +feature-list
:h has-patch

5

Bảng màu

Bảng màu (Colorschemes) là cách bạn áp dụng màu sắc cho Vim của bạn. Vim được cấu thành từ nhiều thành phần (component) và mỗi thành phần có thể được tùy chỉnh với các màu sắc khác nhau cho màu chữ, màu nền của chữ và một số thuộc tính khác như in đậm chữ, v.v. Chúng có thể được thiết lập như sau:

:h :version
:h feature-list
:h +feature-list
:h has-patch

6

Lệnh trên sẽ tô màu nền thành màu đỏ cho trình soạn thảo của bạn. Xem

:h key-notation
:h mapping
:h 05.3

71 để biết thêm chi tiết.

Vì vậy, các bảng màu hầu như đều là tập hợp các lệnh cho

:h key-notation
:h mapping
:h 05.3

72.

Trên thực tế, hầu hết các bảng màu thực sự đều là 2 bảng màu! Ví dụ trên cài đặt màu thông qua

:h key-notation
:h mapping
:h 05.3

73 và

:h key-notation
:h mapping
:h 05.3

74. Theo định nghĩa của thì (

:h key-notation
:h mapping
:h 05.3

  1. sẽ chỉ được áp dụng nếu bạn khởi động Vim từ terminal, ví dụ: xterm. Còn (

:h key-notation
:h mapping
:h 05.3

  1. sẽ được sử dụng khi bạn sử dụng Vim với giao diện đồ họa, như là gvim hoặc MacVim.

Nếu bạn từng sử dụng một bảng màu trong khi mở Vim trong terminal, và các màu sắc không trông giống như màu được cung cấp trong screenshot demo, thì rất có thể bảng màu đó chỉ định nghĩa các màu cho Vim với giao diện đồ họa. Ngược lại, nếu bạn sử dụng Vim với giao diện đồ họa (ví dụ gvim hoặc MacVim) và các màu sắc trông không giống như màu mẫu, thì rất có thể bảng màu chỉ định nghĩa màu sắc cho Vim chạy trên terminal.

Trường hợp thứ hai có thể được "giải quyết" bằng cách bắt chế độ màu sắc trung thực (true colors) trên Neovim hoặc Vim có phiên bản 7.4.1830 hoặc mới hơn. Điều này làm cho Vim chạy dưới terminal sẽ sử dụng các định nghĩa của Vim với giao diện thay cho các định nghĩa mặc định, nhưng đồng thời việc này cũng yêu cầu bản thân terminal cũng như các phần mềm trung gian (ví dụ: tmux) phải có khả năng xử lý màu sắc thực (true color). (Hãy xem gist này để có thêm nhiều thông tin về vấn đề này.)

Xem thêm:

  • :h key-notation :h mapping :h 05.3

    77

Thu gọn Code

Mọi văn bản (hoặc mã nguồn) đều có một cấu trúc (structure) nhất định. Nếu văn bản, mã nguồn code của bạn có một cấu trúc, điều đó có nghĩa là bạn có các vùng văn bản được phân tách một cách hợp lý. Thu gọn code, hay còn gọi là gấp code (folding) cho phép bạn "thu gọn" một vùng như vậy thành một dòng duy nhất và chỉ hiển thị một mô tả ngắn. Có nhiều lệnh trong Vim có thể hoạt động trên các vùng này, mỗi vùng thường được gọi là các fold. Các fold có thể được lồng vào nhau.

Vim phân biệt giữa một số loại phương pháp thu gọn code:

'phương thức thu gọn (fold method)' Cách sử dụng diff Used in diff windows to fold unchanged text. expr Uses

:h key-notation
:h mapping
:h 05.3

78 to basically create a new fold method. indent Folds based on indentation. manual Create folds yourself via

:h key-notation
:h mapping
:h 05.3

79,

:h key-notation
:h mapping
:h 05.3

80, and

:h key-notation
:h mapping
:h 05.3

81. marker Folds based on markers in the text (often in comments). syntax Folds based on syntax, e.g. folding

:h key-notation
:h mapping
:h 05.3

82 blocks.

LƯU Ý: Việc thu gọn code có thể cần rất nhiều xử lý! Nếu bạn gặp bất kỳ hạn chế nào về hiệu suất (độ trễ khi nhập liệu), hãy xem plugin FastFold, plugin này ngăn Vim cập nhật các fold khi không cần thiết.

Xem thêm:

Phiên làm việc

Nếu bạn lưu một view (Xem

:h key-notation
:h mapping
:h 05.3

83), trạng thái hiện tại của window (cũng như các cài đặt và mapping của nó) cũng sẽ được lưu để sử dụng sau này (

:h key-notation
:h mapping
:h 05.3

84).

Một phiên làm việc sẽ lưu các view của tất cả các window và cả các cài đặt chung. Về cơ bản, nó sẽ tạo một snapshot của phiên làm việc hiện tại của bạn và lưu trong trong một file. Để tôi nhấn mạnh điều này: Vim sẽ lưu trạng thái hiện tại; mọi thứ được thực hiện sau khi bạn lưu một phiên làm việc sẽ không nằm trong file lưu trữ phiên làm việc, tức chúng sẽ không được lưu lại. Để "cập nhật" một phiên làm việc, chỉ cần lưu lại.

Điều này giúp bạn dễ dàng lưu lại, cũng như chuyển đổi qua lại giữa các dự án của mình.

Thử ngay đi! Mở một vài window, tab, và dùng lệnh

:h key-notation
:h mapping
:h 05.3

85. Nếu bạn không điền tên file,

:h key-notation
:h mapping
:h 05.3

86 sẽ mặc định được dùng. File này sẽ được lưu vào thư mục làm việc hiện tại của bạn, xem

:h key-notation
:h mapping
:h 05.3

87. Khởi động lại Vim là nhập

:h key-notation
:h mapping
:h 05.3

88 và bất ngờ chưa, danh sách buffer, bố trí của các window, các mapping, thư mục làm việc hiện tại, v.v. sẽ giống y chang lúc bạn lưu phiên làm việc. Làm một vài thứ, và chập nhật phiên làm việc bằng cách ghi đè lên file lưu trữ phiên làm việc đã tồn tại với lệnh

:h key-notation
:h mapping
:h 05.3

89.

Lưu ý rằng một file lưu trữ phiên làm việc thực sự chỉ là một tập hợp của các lệnh trong vim để khôi phục lại trạng thái của Vim khi bạn thực hiện lưu phiên làm việc. Vì vậy hãy xem:

:h key-notation
:h mapping
:h 05.3

90.

Bạn có thể cho Vim biết những gì cần lưu trong một phiên bản với cài đặt

:h key-notation
:h mapping
:h 05.3

91.

Đối với việc viết code, Vim sẽ giữ tên của phiên làm việc được áp dụng hoặc lưu lại lần cuối vào biến cục bộ (internal variable)

:h key-notation
:h mapping
:h 05.3

92.

Xem thêm:

:h :version
:h feature-list
:h +feature-list
:h has-patch

7

Tính cục bộ

Nhiều khái niệm được đề cập ở trên cũng có các phiên bản chạy cục bộ:

Toàn cục Cục bộ Phạm vi Xem thêm

:h key-notation
:h mapping
:h 05.3

93

:h key-notation
:h mapping
:h 05.3

94 buffer or window

:h key-notation
:h mapping
:h 05.3

95

:h :version
:h feature-list
:h +feature-list
:h has-patch

26

:h key-notation
:h mapping
:h 05.3

97 buffer

:h key-notation
:h mapping
:h 05.3

98

:h key-notation
:h mapping
:h 05.3

99

nnoremap h :helpgrep

00 buffer

nnoremap h :helpgrep

01

nnoremap h :helpgrep

02

nnoremap h :helpgrep

03 window

nnoremap h :helpgrep

04

:h :version
:h feature-list
:h +feature-list
:h has-patch

59

nnoremap h :helpgrep

06 buffer

:h :version
:h feature-list
:h +feature-list
:h has-patch

68

.

Cách sử dụng

Nhận trợ giúp ngoại tuyến

Vim đi kèm với một bộ tài liệu tuyệt vời dưới dạng các file văn bản đơn lẻ và có bố cục đặc biệt. Vim sử dụng một hệ thống dựa trên các thẻ (tag) để truy cập các phần nhất định của một file tài liệu.

Trước hết, bạn hãy đọc:

nnoremap h :helpgrep

08. Chạy lệnh trên sẽ mở file

nnoremap h :helpgrep

09 trong một window mới và nhảy tới thẻ

nnoremap h :helpgrep

10 trong file đó.

Một vài quy tắc đơn giản:

  • Các cài đặt được đặt trong dấu ngoặc kép, ví dụ: nnoremap h :helpgrep 11
  • Các hàm trong ngôn ngữ Vim kết thúc bằng nnoremap h :helpgrep 12. Ví dụ: nnoremap h :helpgrep 13
  • Các lệnh bắt đầu với

    :h :version :h feature-list :h +feature-list :h has-patch

    90, ví dụ nnoremap h :helpgrep 15

Bạn có thể dùng

nnoremap h :helpgrep

16 (tức ctrl+d) để liệt kê tất cả các thẻ phù hợp với lệnh đang được nhập. Ví dụ:

nnoremap h :helpgrep

17 sẽ cung cấp cho bạn danh sách tất cả các thẻ từ

nnoremap h :helpgrep

18,

nnoremap h :helpgrep

19 cho tới

nnoremap h :helpgrep

20.

Nếu bạn muốn liệt kê tất cả các hàm trong Vim? Đơn giản thôi, chỉ cần dùng

nnoremap h :helpgrep

21. Bạn muốn liệt kê tất cả các hàm trong vim có liên quan đến window? Hãy dùng

nnoremap h :helpgrep

22.

Những điều này sẽ dần trở nên tự nhiên với bạn hơn, nhưng đặc biệt là khi mới bắt đầu, đôi khi bạn sẽ không biết bất kì thứ gì về các thẻ mà bạn cần tìm. Bạn chỉ cần tưởng tượng ra một từ khóa có liên quan là được.

nnoremap h :helpgrep

23 sẽ giúp ích cho bạn.

Lệnh trên sẽ tìm từ "backwards" trong tất cả các file tài liệu và nhảy tới file đầu tiên có chứ từ "backwards". Các kết quả tìm được sẽ được tập hợp trong danh sách sửa lỗi nhanh (quickfix). Sử dụng

nnoremap h :helpgrep

24/

nnoremap h :helpgrep

25 để nhảy qua lại giữa các kết quả tìm được. Hoặc dùng

:h key-notation
:h mapping
:h 05.3

47 để mở một window sửa lỗi nhanh (quicfix window), điều hướng đến một kết quả và nhấn

:h key-notation
:h mapping
:h 05.3

45 để nhảy đến file tài liệu ứng với kết quả đó. Xem thêm

:h key-notation
:h mapping
:h 05.3

59 để biết thêm chi tiết.

Nhận trợ giúp ngoại tuyến (cách khác)

Danh sách sày được tổng hợp bởi @chrisbra, một trong những là phát triển Vim tích cực nhất và nó được đăng trên .

Đây là phiên bản của vim-galore với một vài thay đổi nhỏ.


Thông thường, nếu bạn biết bạn đang tìm gì, thì bạn sẽ dễ dàng tìm kiếm chúng bằng cách sử dụng hệ thống trợ giúp của Vim.Vì các chủ đề được sắp xếp tuân theo một phong cách trình bày nhất định.

Ngoài ra, hệ thống trợ giúp của Vim sẽ có lợi thế nhất định phụ thuộc vào phiên bản Vim mà bạn đang sử dụng, vì vậy, các chủ đề chủ đề lỗi thời hoặc được thêm vào mà không phù hợp với phiên bản Vim mà bạn đang sử dụng sẽ không xuất hiện.

Do đó, điều cần thiết ở đây là bạn phải tìm hiểu hệ thống trợ giúp của Vim và ngôn ngữ mà nó sử dụng. Đây là một số ví dụ (không đảm bảo là sẽ đầy đủ vì có thể tôi đã quên một vài thứ).

  1. Các cài đặt được đặt trong dấu nháy đơn. Vì vậy, bạn hãy sử dụng nnoremap h :helpgrep 29 để chuyển đến danh sách các cài đặt của file trợ giúp đó. Nếu bạn biết chính xác cài đặt nào mà bạn muốn xem, bạn có thể dùng nnoremap h :helpgrep 30 để mở trang trợ giúp mô tả tất cả các cài đặt và lúc đó bạn có thể sử dụng việc tìm kiếm bằng biểu thức chính quy (regular expressions), ví dụ nnoremap h :helpgrep 31. Một số tùy chọn có namespace riêng, ví dụ: nnoremap h :helpgrep 32, nnoremap h :helpgrep 33, nnoremap h :helpgrep 34. v.v
  2. Các lệnh ở chế độ bình thường thì cũng chỉ có vậy. Hãy dùng lệnh nnoremap h :helpgrep 35 để xem trang trợ giúp của lệnh "gt".
  3. Các biểu thức chính quy (regex) luôn bắt đầu bằng "/", vì vậy nnoremap h :helpgrep 36 sẽ đưa bạn đến mục trợ giúp cho bộ định lượng "\ +" của các biểu thức chính quy trong Vim. Nếu bạn cần biết bất kỳ điều gì về biểu thức chính quy (regex), hãy đọc tại nnoremap h :helpgrep 37.
  4. Về các tổ hợp phím. Chúng thường bắt đầu bằng một chữ cái cho biết chế độ mà chúng có thể được sử dụng. Ví dụ. nnoremap h :helpgrep 38 đưa bạn đến tập các lệnh CTRL-X cho chế độ insert, các lệnh này có thể được sử dụng để tự động hoàn thành các công việc khác nhau. Lưu ý rằng một số từ khóa nhất định sẽ luôn được viết giống nhau, ví dụ: Control sẽ luôn là CTRL. Lưu ý, đối với các lệnh ở chế độ normal, chữ "n" sẽ được lược bỏ đi, ví dụ nnoremap h :helpgrep 39. Ngược lại, nnoremap h :helpgrep 40 sẽ mô tả CTRL-R làm gì khi nhập lệnh trong dòng lệnh (command line) và nnoremap h :helpgrep 41 mang ý nghĩa tăng dần một số trong chế độ visual và nnoremap h :helpgrep 42 đại diện cho lệnh g (Do đó bạn phải nhấn "g" rồi nhấn ). Ở đây, "g" đại diện cho lệnh "g" thông thường, lệnh "g" luôn chờ cho một phím thứ hai được nhấn sau nó để thực hiện một hành động nào đó, tương tự như các lệnh bắt đầu bằng "z".
  5. Các bộ ghi nhớ (registers) luôn bắt đầu với "quote", vì vậy hãy sử dụng nnoremap h :helpgrep 43 để tìm hiểu thêm về bộ ghi nhớ đặc biệt ":".
  6. Ngôn ngữ lập trình Vim (Vim Script, VimL) có sẵn tại nnoremap h :helpgrep 44. Một số khía cạnh của ngôn ngữ này có sẵn tại nnoremap h :helpgrep 45, trong đó 'X' là một chữ cái đơn lẻ. Ví dụ nnoremap h :helpgrep 46 sẽ đưa bạn để chủ đề mô tả về toán tử '!' (not) trong VimL. Một phần cũng quan trọng khác đó là function-list, hãy xem nnoremap h :helpgrep 47 để tìm các mô tả ngắn ngọn về tất cả các hàm có sẵn trong VimL.
  7. Các mapping được đề cập trong trang trợ giúp

    nnoremap h :helpgrep 48. Sử dụng nnoremap h :helpgrep 49 để tìm hiểu về lệnh

    :h :version :h feature-list :h +feature-list :h has-patch

    42. Bạn cũng nên dùng lệnh nnoremap h :helpgrep 51 để tìm hiểu thêm về một số chủ đề phụ cụ thể cho mapping (ví dụ:

    :h key-notation :h mapping :h 05.3

    98 để tìm hiểu về mapping cho buffer cục bộ (buffer-local mappings) hoặc nnoremap h :helpgrep 53 để biết cách xử lý của '|' trong mapping)
  8. Định nghĩa của các lệnh được đề cập tại nnoremap h :helpgrep 54, vì vậy hãy dùng lệnh nnoremap h :helpgrep 55 để tìm hiểu thêm về đối số '!' cho các lệnh được tùy chỉnh.
  9. Các lệnh để quản lý window (cửa sổ, khung nhìn) luôn bắt đầu với CTRL-W, vì vậy bạn có thể tìm những tài liệu tương ứng tại nnoremap h :helpgrep 56 (Ví dụ nnoremap h :helpgrep 57 để nhảy đến cửa sổ được truy cập lần gần nhất). Bạn cũng có truy cập nnoremap h :helpgrep 58 và đọc thêm về các lệnh xử lý window mà bạn cần sử dụng.
  10. Các lệnh Ex luôn bắt đầu bằng ":", vì vậy hãy dùng lệnh nnoremap h :helpgrep 59 để đọc thêm về lệnh ":s".
  11. Sử dụng CTRL-D sau khi truy cập một chủ đề (tài liệu) và để vim cố gắng hoàn thành tất cả các chủ đề có sẵn.
  12. Sử dụng

    nnoremap h :helpgrep 23 để tìm kiếm trong tất cả các trang trợ giúp (thông thường sẽ kèm cả các trang trợ giúp của các plugin mà bạn đã cài.). Xem nnoremap h :helpgrep 61 để biết cách sử dụng. Khi bạn đã tìm kiếm một chủ đề nào đó, tất cả các kết quả trùng khớp sẽ được hiển thị trong một window hiển thị danh sách sửa lỗi nhanh (quickfix) hoặc danh sách vị trí (location) mà bạn có thể mở lên bằng cách dùng lệnh

    :h key-notation :h mapping :h 05.3

    47 hoặc

    :h key-notation :h mapping :h 05.3

    48. Sau đó bạn có thể dùng :args /*.[ch] :argdo %s/foo/bar/ge | update 11 để tìm kiếm cụ thể hơn trong danh sách kết quả đang hiển thị.
  13. nnoremap h :helpgrep 65 có chứa các nội dung để bạn sử dụng trợ giúp trong vim tốt hơn.
  14. Phần hướng dẫn sử dụng trong vim mô tả các chủ đề trợ giúp cho những người mới bắt đầu bằng một cách khá thân thiện.. Bắt đầu với lệnh nnoremap h :helpgrep 66 để xem mục lục. Lướt qua mục lục để tìm chủ đề cụ thể nào đó bạn cần. Ví dụ bạn sẽ tìm thấy một mục "Digraphs" và 'Entering special characters' trong chường 24 (Do đó, hãy dùng nnoremap h :helpgrep 67 để đi đến trang trợ giúp cụ thể đó)
  15. Các nhóm để nhận diện highlight (highlighting groups) luôn bắt đầu với nnoremap h :helpgrep 68. Ví dụ: nnoremap h :helpgrep 69 nói về nhóm nhận diện màu sắc "WarningMsg".
  16. Nhận diện syntax (Syntax highlighting) được đặt tên theo cú pháp ":syn-topic". Ví dụ nnoremap h :helpgrep 70 nói về đối số conceal cho lệnh :syn.
  17. Các lệnh thuộc nhóm lệnh sửa lỗi nhanh (quickfix) thường bắt đầu với ":c", còn đối với danh sách vị trí (location list) thì là ":l".
  18. Lệnh nnoremap h :helpgrep 71 nói về lệnh tự động BufWinLeave. Ngoài ra, nnoremap h :helpgrep 72 nói về tất cả các sự kiện có thể xảy ra.
  19. Các đối số (arguments) để khởi động Vim luôn bắt đầu với "-", vì vậy nnoremap h :helpgrep 73 sẽ dẫn bạn đến trang trợ giúp của lệnh "-f" trong Vim.
  20. Các tính năng bổ sung được biên dịch sẵn vào Vim luôn bắt đầu bằng "+", vì vậy lệnh nnoremap h :helpgrep 74 sẽ dẫn bạn đến trang trợ giúp nói về tính năng conceal trong Vim.
  21. Các mã lỗi cũng có thể được tìm kiếm trực tiếp trong các trang hướng dẫn. Lệnh nnoremap h :helpgrep 75 sẽ trực tiếp dẫn bạn đến phần mô tả của các lỗi. Tuy nhiên, đôi khi các mã lỗi không được mô rả, mà được liệt kê trong lệnh Vim sẽ thường gây ra lỗi đó. Ví dụ: nnoremap h :helpgrep 76 sẽ trực tiếp dẫn bạn đến trang trợ giúp của lệnh nnoremap h :helpgrep 77;
  22. Tài liệu cho các cú pháp có sẵn của các file thường có sẵn tại nnoremap h :helpgrep 78. Ví dụ: nnoremap h :helpgrep 79 nói về cú pháp của file C và các các đặt mà nó cung cấp. Đôi khi, các phần bổ sung thêm cho tính năng gợi ý code omni completion (Xem nnoremap h :helpgrep
  23. hoặc các plugin dành cho loại file ( nnoremap h :helpgrep
  24. có sẵn.

Also, a link to the user documentation (which describes certain commands more from a user perspective and less detailed) will be mentioned at the top of help pages if they are available. So

nnoremap h :helpgrep

37 mentions the user guide topics

nnoremap h :helpgrep

83 and

nnoremap h :helpgrep

84.

Ngoài ra, liên kết đến tài liệu sử dụng (thường sẽ mô tả một số lệnh nhất định từ góc đội người dùng và ít được chi tiết hơn) sẽ được đề cập ở đầu trang trợ giúp nếu như chúng có sẵn. Vì vậy tài liệu

nnoremap h :helpgrep

37 sẽ đề cập đến các chủ đề hướng đẫn sử dụng

nnoremap h :helpgrep

83 và

nnoremap h :helpgrep

84.

Nhận trợ giúp trực tuyến

Nếu bạn có một vấn đề không thể giải quyết hoặc bạn cần sự hướng dẫn cụ thể, vui lòng xem danh sách mailing

Bạn có thể truy cập một nguồn tài liệu tuyệt vời khác bằng cách sử dụng IRC. Kênh chat

:h cmdline-ranges
:h 10.3

4 trên Freenode luôn có những người sẵn sàng giúp đỡ bạn.

Nếu bạn muốn báo cáo một lỗi của Vim, sử dụng mailing list .

Sử dụng lệnh tự động trong thực tế

Bạn có thể kích hoạt bất kì sự kiện nào ngay bây giờ với lệnh

nnoremap h :helpgrep

89.

Các sự kiện người dùng

Đặc biệt là đối với các plugin, sẽ hữu dụng hơn nếu bạn tạo các sự kiện "Người dùng" cho riêng bạn.

:h :version
:h feature-list
:h +feature-list
:h has-patch

8

Bây giờ những người sử dụng plugin của bạn có thể thực thi bất cứ thứ gì sau khi hàm Chibby được thực thi bằng cách dùng lệnh:

:h :version
:h feature-list
:h +feature-list
:h has-patch

9

Nhân tiện, nếu không "tìm thấy" lệnh tự động nào, :doautocmd sẽ xuất ra thông báo "No matching autocommands" (Không có lệnh tự động nào phù hợp). Đó là lý do tại sao nhiều plugin sử dụng

nnoremap h :helpgrep

90. Nhưng điều này lại có nhược điểm đó là bạn không thể sử dụng

nnoremap h :helpgrep

91 trong lênh tự động :autocmd, mà bạn cần phải sử dụng

nnoremap h :helpgrep

92 để xuất một thông báo cho những người sử dụng plugin của mình.

Đó là lý do tại sao bạn nên kiểm tra liệu sự kiện đó có nhận các lệnh tự động hay không, và không nên làm ảnh hưởng sự kiện này, ví dụ:

:args /*.[ch] :argdo %s/foo/bar/ge | update

0

Xem thêm:

nnoremap h :helpgrep

93

Các lệnh tự động lồng vào nhau

Theo mặc định, các lệnh tự động (autocmd) không lồng vào nhau! Nếu lệnh tự động thực thi một lệnh, nó thường sẽ kích hoạt một sự kiện khác, điều đó trên thực tế lại không xảy ra.

Giả sử, mỗi khi bạn khởi động Vim, bạn muốn Vim tự động mở file cấu hình vimrc của mình:

:args /*.[ch] :argdo %s/foo/bar/ge | update

1

Bây giờ nếu bạn khởi động Vim, Vim sẽ mở file vimrc của bạn, nhưng điều đầu tiên mà bạn nhận ra là bây giờ nội dung của bạn không được tô màu (highlighting) như mọi khi bạn mở file vimrc của mình.

Vấn đề ở đây là: lệnh

nnoremap h :helpgrep

94 trong ví dụ trên sẽ không kích hoạt sự kiện "BufRead", do đó Vim sẽ không thể xác nhận bạn đang mở loại file nào. Vì vậy file

nnoremap h :helpgrep

95 sẽ không bao giờ được thực thi.

Xem thêm

nnoremap h :helpgrep

96. Và thay vì sử dụng ví dụ trên, hãy sử dụng:

:args /*.[ch] :argdo %s/foo/bar/ge | update

2

Xem thêm:

nnoremap h :helpgrep

97

Clipboard

Clipboard (Bộ nhớ sao chép tạm thời) cần :

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

5 và tùy chọn

nnoremap h :helpgrep

99 nếu bạn muốn sử dụng

let mapleader = ' ' nnoremap h :helpgrep

00 trên một hệ thống Unix với Vim không hỗ trợ giao diện (không hỗ trợ GUI).

Xem thêm:

:args /*.[ch] :argdo %s/foo/bar/ge | update

3

Xem thêm:

Sử dụng Clipboard (Windows, macOS)

Windows hỗ trợ sẵn clipboard và macOS hỗ trợ .

Cả hai đều hoạt đồng bình thường như chúng ta mong đợi. Bạn sao chép văn bản đã chọn với

let mapleader = ' ' nnoremap h :helpgrep

01/

let mapleader = ' ' nnoremap h :helpgrep

02 và dán chúng vào một ứng dụng khác với lệnh

let mapleader = ' ' nnoremap h :helpgrep

03/

let mapleader = ' ' nnoremap h :helpgrep

04.

Lưu ý rằng văn bản đã sao chép thực sự được chuyển vào clipboard, vì vậy bạn có thể đóng ứng dụng mà bạn vừa sao chép văn bản đó trước khi dán nội dung vừa sao chép vào một ứng dụng khác mà không có vấn đề gì.

Bất cứ khi nào bạn thực hiện sao chép với clipboard trong Vim, bộ ghi nhớ (register)

:args /*.[ch] :argdo %s/foo/bar/ge | update

01 sẽ được lấp đầy với đoạn văn bản mà bạn đang chọn. Sử dụng

let mapleader = ' ' nnoremap h :helpgrep

06 và

let mapleader = ' ' nnoremap h :helpgrep

07 để sao chép và dán từ clipboard.

Nếu bạn không muốn Vim lúc nào cũng lưu nội dung bạn sao chép vào bộ ghi nhớ

:args /*.[ch] :argdo %s/foo/bar/ge | update

01, thêm đoạn sau vào file cấu hình vimrc của bạn:

Thông thường thì tất cả các hành động sao chép/xóa/dán sẽ được lưu vào bộ ghi nhớ

:h :version
:h feature-list
:h +feature-list
:h has-patch

69, lúc này thì bộ ghi nhớ

:args /*.[ch] :argdo %s/foo/bar/ge | update

01 được sử dụng cho hành động tương tự, do đó chỉ cần nhấn

:h :version
:h feature-list
:h +feature-list
:h has-patch

74 và

:args /*.[ch] :argdo %s/foo/bar/ge | update

17 là đủ để thực hiện hành động sao chép và dán văn bản.

Để tôi nhắc lại: Khi bạn thiết lập cài đặt phía trên, mỗi khi bạn sao chép/dán, thận chí khi bạn sử dụng trong cùng một window của Vim, các hành động sao chép/ dán đó sẽ thay đổi clipboard. Hãy tự mình quyết định xem cài đặt này có hữu ích hay không.

Nếu bạn quá lười để nhấn

:h :version
:h feature-list
:h +feature-list
:h has-patch

74, bạn có thể lưu tất cả những lần bạn lựa chọn văn bản trong chế độ visual vào clipboard bằng cách sử dụng các cài đặt:

:args /*.[ch] :argdo %s/foo/bar/ge | update

4

Xem thêm:

:args /*.[ch] :argdo %s/foo/bar/ge | update

5

Sử dụng Clipboard (Linux, BSD, ...)

Nếu hệ điều hành của bạn sử dụng X, thì có một chút khác biệt . X sử dụng X Window System Protocol từ phiên bản 11 từ năm 1987, do đó, thường thường người ta hay gọi X là X11.

Trước đó, ở phiên bản X10, được giới thiệu là sẽ hoạt động giống như một clipboard, như khi bạn sao chép văn bản, thông tin sao chép sẽ được X quản lý và bạn có thể truy cập chúng ở bất kì ứng dụng nào. Cơ chế này vẫn tồn tại trong X, nhưng việc sử dụng nó hiện không còn khả thi nữa, và hầu hết các ứng dụng đều không sử dụng nó nữa.

Ngày nay, dữ liệu được chuyển qua lại giữa các ứng dụng bằng . Trong 3 các lựa chọn được tình soạn thảo văn bản atoms định nghĩa, chỉ có 2 cái thường được sử dụng trong thực tế, đó là: PRIMARY và CLIPBOARD.

Các lựa chọn hoạt động giống như này:

:args /*.[ch] :argdo %s/foo/bar/ge | update

6

Lựa chọn Trường hợp sử dụng? Làm sao để dán? Làm sao để truy cập trong Vim? PRIMARY Chọn văn bản

let mapleader = ' ' nnoremap h :helpgrep

14,

let mapleader = ' ' nnoremap h :helpgrep

15

:args /*.[ch] :argdo %s/foo/bar/ge | update

01 register CLIPBOARD Chọn văn bản và thực hiện

let mapleader = ' ' nnoremap h :helpgrep

01

let mapleader = ' ' nnoremap h :helpgrep

03

:args /*.[ch] :argdo %s/foo/bar/ge | update

00 register

Lưu ý: Các lựa chọn (selections), thậm chí cả lựa chọn CLIPBOARD, không bao giờ được lưu trong X server! Do đó, bạn sẽ mất dữ liệu được sao chép với lệnh

let mapleader = ' ' nnoremap h :helpgrep

20 khi bạn đóng ứng dụng.

Sử dụng

let mapleader = ' ' nnoremap h :helpgrep

07 để dán lựa chọn PRIMARY hoặc

let mapleader = ' ' nnoremap h :helpgrep

22 để sao chép toàn bộ nội dung của file vào lựa chọn CLIPBOARD.

Nếu bạn tình cờ truy cập một trong hai bộ ghi nhớ (register) cùng một lúc, hãy cân nhắc sử dụng:

:args /*.[ch] :argdo %s/foo/bar/ge | update

7

(Dấu

let mapleader = ' ' nnoremap h :helpgrep

23 được dùng như giá trị mặc định, xem

let mapleader = ' ' nnoremap h :helpgrep

24.)

Điều này sẽ làm cho tất cả các hoạt động sao chép/xóa/dán sử dụng

:args /*.[ch] :argdo %s/foo/bar/ge | update

01 hoặc

:args /*.[ch] :argdo %s/foo/bar/ge | update

00 thay vì bộ ghi nhớ không tên

:h :version
:h feature-list
:h +feature-list
:h has-patch

69. Sau đó, bạn chỉ cần sử dụng

:h :version
:h feature-list
:h +feature-list
:h has-patch

74 hoặc

:args /*.[ch] :argdo %s/foo/bar/ge | update

17 để thao tác với các lựa chọn của bạn.

Xem thêm:

:args /*.[ch] :argdo %s/foo/bar/ge | update

8

Khôi phục vị trí của con trỏ khi mở file

Khi bạn mở một file, con trỏ sẽ được đặt ở dòng 1, cột 1. Nhưng may mắn thay, file viminfo đã ghi nhớ các cho bạn. Marker

:h :version
:h feature-list
:h +feature-list
:h has-patch

69 chứa vị trí con trỏ trong buffer mà bạn đã thoát.

:args /*.[ch] :argdo %s/foo/bar/ge | update

9

Giải thích: Nếu marker

:h :version
:h feature-list
:h +feature-list
:h has-patch

69 có số dòng lớn hơn 1 nhưng không lớn hơn số dòng cuối cùng trong file, hãy chuyển con trỏ đến đó.

Xem thêm: :h viminfo-' :h

let mapleader = ' ' nnoremap h :helpgrep

32

Các file tạm

Các file sao lưu

Trước khi sử dụng một file, Vim sẽ tạo một file sao lưu (backup file). Nếu ghi vào đĩa thành công, file sao lưu sẽ bị xóa.

Với lệnh

let mapleader = ' ' nnoremap h :helpgrep

33, sao lưu của bạn sẽ vẫn tồn tại. Nghĩa là , file sao lưu sẽ luôn có cùng nội dung với file gốc trước khi bạn lưu file của bạn lần gần nhất. Bạn hãy tự quyết định xem việc này có hữu ích với mình hay không.

Bạn có thể vô hiệu hóa hoàn toàn các sao lưu bằng lệnh

let mapleader = ' ' nnoremap h :helpgrep

34, nhưng bạn không nên làm điều này.

let mapleader = ' ' nnoremap h :helpgrep

35 là một tính năng bảo mật đảm bảo rằng bạn không làm mất file gốc trong trường hợp bạn lưu file của mình bị lỗi, bất kể bạn có giữ file sao lưu sao đó hay không.

Nếu bạn thường xuyên sử dụng Vim để chỉnh sửa các file lớn, , bạn có thể loại trừ những file đó khỏi danh sách sao lưu với lệnh

let mapleader = ' ' nnoremap h :helpgrep

36.

Vim có hai cách khác nhau để tạo bản sao lưu: sao chép và đổi tên.

  • Sao chép
    1. Một bản sao đầy đủ của file gốc được tạo và sử dụng làm bản sao lưu.
    2. File gốc được làm rỗng và sao đó được lấp đầy bằng nội dung của buffer hiện tại trong Vim.
  • Đổi tên
    1. Tệp gốc được đổi tên thành file sao lưu.
    2. Nội dung của buffer được ghi vào một file mới với tên của file gốc

Xem thêm

let mapleader = ' ' nnoremap h :helpgrep

37 để biết thêm nhiều thứ hay ho khác.


Demo:

:nmap :echo "foo"

0

:nmap :echo "foo"

1


Xem thêm: :h backup :h write-fail

Các file swap

Khi chỉnh sửa một file, các thay đổi chưa được lưu sẽ được ghi vào một file swap.

Xem tên của file swap hiện tại với lệnh

let mapleader = ' ' nnoremap h :helpgrep

38. Vô hiệu hóa chúng bằng lệnh

let mapleader = ' ' nnoremap h :helpgrep

39.

Một file swap sẽ được cập nhật cập sau khi bạn nhập 200 kí tự hoặc không có kí tự nào được nhập sau 4 giây. Chúng sẽ bị xóa khi bạn ngừng chỉnh sửa file đó. Bạn có thể thay đổi những thông số cài đặt này này bằng lệnh

let mapleader = ' ' nnoremap h :helpgrep

40 và

let mapleader = ' ' nnoremap h :helpgrep

41.

Nếu Vim bị tắt (ví dụ: khi mất điện), bạn sẽ mất tất cả các thay đổi kể từ lần cuối cùng file của bạn được ghi vào đĩa, nhưng file swap sẽ không bị xóa. Lúc này, nếu bạn chỉnh sửa lại file đó, Vim sẽ cho bạn cơ hội để khôi phục lại dữ liệu từ file swap đó.

Khi 2 người cố gắng cùng sửa một file, người thứ hai sẽ nhận được thông báo rằng file swap đã tồn tại. Nó ngăn không cho 2 người lưu các phiên bản khác nhau của cùng một file. Nếu bạn không muốn hành vi đó xuất hiện, xem

let mapleader = ' ' nnoremap h :helpgrep

42.

Xem thêm: :h swap-file :h usr_11

Các file hoàn tác

được giữ trong bộ nhớ và sẽ bị mất khi bạn thoát Vim. Nếu bạn muốn nó vẫn tồn tại, dùng lệnh

let mapleader = ' ' nnoremap h :helpgrep

43. Lệnh này sẽ lưu file hoàn tác cho file

let mapleader = ' ' nnoremap h :helpgrep

44 dưới dạng

let mapleader = ' ' nnoremap h :helpgrep

45.

Xem thêm: :h 'undofile' :h undo-persistence

File viminfo

Trong khi các file sao lưu, các file swap, các file hoàn tác đều được lưu ở dạng văn bản, các file viminfo được sử dụng để lưu mọi thứ khác, những thứ có thể mất đi khi bạn thoát Vim. File viminfo sẽ lưu lại lịch sử (các lệnh, các tìm kiếm, input), các bộ ghi nhớ, đánh dấu, danh sách buffer, window, các biến...

Mặc định, file viminfo sẽ được lưu ở

let mapleader = ' ' nnoremap h :helpgrep

46.

Xem thêm: :h viminfo :h 'viminfo'

Cấu hình ví dụ cho các file tạm

Đặt tất cả các file tạm vào thư mục riêng của chúng trong

let mapleader = ' ' nnoremap h :helpgrep

47:

:nmap :echo "foo"

2

Chỉnh sửa file từ xa

Vim đi kèm với plugin netrw cho phép chỉnh sửa các file từ xa. Trên thực tế, chúng chuyển các file từ xa (remote files) sang các file cục bộ thông qua scp, mở một buffer sử dụng file đó, và ghi lại các thay đổi vào file từ xa khi bạn lưu file cục bộ.

Điều này cực kỳ hữu ích nếu bạn muốn sử dụng cấu hình cục bộ của mình thay vì phải ssh vào một server và sử dụng cấu hình VIm mà quản trị viên của server đó đang sử dụng.

:nmap :echo "foo"

3

Nếu bạn đã thiết lập

let mapleader = ' ' nnoremap h :helpgrep

48 sẵn, chúng sẽ được tự động sử dụng:

:nmap :echo "foo"

4

Giả sử, nội dung trên nằm trong file

let mapleader = ' ' nnoremap h :helpgrep

48, lệnh này cũng sẽ hoạt động tốt:

Điều tương tự có thể được thực hiện với lệnh

let mapleader = ' ' nnoremap h :helpgrep

50, xem

let mapleader = ' ' nnoremap h :helpgrep

51.

Hãy đảm bảo rằng bạn đã đọc

let mapleader = ' ' nnoremap h :helpgrep

52 và

let mapleader = ' ' nnoremap h :helpgrep

53.


Một khả năng khác là bạn có thể dùng sshfs , sshfs sử dụng FUSE để mount một hệ thống remove vào hệ thống cục bộ của bạn.

Quản lý plugins

Pathogen là công cụ phổ biến đầu tiên nếu như bạn muốn quản lý các plugin của mình. Trên thực tế, nó chỉ điều chỉnh runtimepath (

let mapleader = ' ' nnoremap h :helpgrep

  1. để đặt tất cả các cài đặt vào một thư mục nhất định. Bạn phải tự sao chép repo của các plugin đó để có thể sử dụng.

Các trình quản lý plugin sẽ chìa ra các lệnh giúp bạn cài đặt và cập nhật các plugin ngay trong Vim.

Chèn khối

Chèn khối (block insert) là một kĩ thuật để chèn cùng một văn bản trên nhiều dòng liên tiếp cùng một lúc. Xem demo.

Chuyển sang chế độ visual block với lệnh

let mapleader = ' ' nnoremap h :helpgrep

55. Sau đó, chọn một vài dòng. Nhấn

let mapleader = ' ' nnoremap h :helpgrep

56 hoặc

:h :version
:h feature-list
:h +feature-list
:h has-patch

85 và bắt đầu thêm văn bản của bạn.

Lúc đầu có thể hơi khó hiểu, nhưng văn bản sẽ được nhập ở dòng hiện tại, sau khi bạn kết thúc việc nhập nhiệu, văn bản vừa nhập sẽ được áp dụng cho tất cả các dòng mà bạn đã chọn.

Một ví dụ đơn giản:

let mapleader = ' ' nnoremap h :helpgrep

58.

Nếu bạn có các dòng có độ dài khác nhau, và muốn nối cùng một văn bản vào sau mỗi dòng, hãy dùng lệnh:

let mapleader = ' ' nnoremap h :helpgrep

59.

Đôi khi, bạn cần đặt con trỏ ở đâu đó sau khi kết thúc dòng hiện tại. Mặc định, bạn không thể làm điều đó, nhưng bạn có thể cài đặt trong vimrc của mình với cài đặt

let mapleader = ' ' nnoremap h :helpgrep

60:

Sau đó

let mapleader = ' ' nnoremap h :helpgrep

61 or

let mapleader = ' ' nnoremap h :helpgrep

62 hoạt động ngay cả khi con trỏ của bạn đang ở cuối một dòng.

Xem

let mapleader = ' ' nnoremap h :helpgrep

63 để biết thêm chi tiết. Ban đầu có thể hơi khó khăn, nhưng nó sẽ sớm trở nên tự nhiên với bạn.

Đây là một plugin hỗ trợ cho tính năng này mà bạn nên xem qua: multiple-cursors.

Chạy các chương trình bên ngoài Vim và sử dụng các bộ lọc

Lưu ý: Vim chỉ xử lý một luồng duy nhất (single-threaded), vì vậy việc chạy một chương trình bên ngoài sẽ chặn Vim thực hiện các xử lý tiếp theo. Dĩ nhiên, bạn có thể sử dụng các ngôn ngữ lập trình Vim, ví dụ: Lua, và xử dụng các xử lý hỗ trợ đa luồng của chúng, tuy nhiên, trong quá trình xử lý đó, các luồng xử lý khác của Vim vẫn bị chặn lại. Neovim (Một phiên bản được viết lại của Vim) đã khắc phục điều đó bằng các thêm một API thích hợp.

(Rõ ràng là Bram cũng đang nghĩ đến việc thêm quyền kiểm soát các tiến trình vào Vim. Nếu bạn đang sử dụng một phiên bản Vim được publish gần đây, hãy xem

let mapleader = ' ' nnoremap h :helpgrep

64)

Sử dụng

let mapleader = ' ' nnoremap h :helpgrep

65 để bắt đầu một công việc. Nếu bạn muốn liệt kê danh sách các file trong thư mục hiện tại, hãy dùng

let mapleader = ' ' nnoremap h :helpgrep

66. Dùng

let mapleader = ' ' nnoremap h :helpgrep

67 để thực hiện piping như khi bạn sử dụng các lệnh trong shell của mình, ví dụ

let mapleader = ' ' nnoremap h :helpgrep

68.

Nếu không được chỉ định phạm vi (ranges), kết quả của lệnh

let mapleader = ' ' nnoremap h :helpgrep

65 sẽ được hiển thị trong một window mà bạn có thể cuộn lên, xuống (scroll). Mặt khác, nếu một phạm vi được chỉ định, các dòng này sẽ được lọc lại. Điều này nghĩa là chúng sẽ được chuyển đến của chương trình lọc và sau khi xử lý chúng sẽ được thay thế bởi của bộ lọc. Ví dụ: để đánh số đầu dòng cho 5 dòng tiếp theo, hãy dùng.

Bởi vì việc thêm vào các phạm vi (ranges) một cách thủ công là khá rườm rà, nên Vim cung cấp một số trợ giúp để thuận tiện cho bạn hơn. Như khi sử dụng phạm vi, bạn có thể chọn nhiều dòng trong chế độ visual, sau đó nhấn

:h :version
:h feature-list
:h +feature-list
:h has-patch

90. Ngoài ra còn có một toán từ

let mapleader = ' ' nnoremap h :helpgrep

71 chấp nhận các chuyển động (motions). Ví dụ:

let mapleader = ' ' nnoremap h :helpgrep

72 sẽ xắp xếp các dòng của đoạn hiện tại.

Một trường hợp tốt để sử dụng bộ lọc trong vim đó là Ngôn ngữ lập trình Go. Việc căn thụt đầu dòng khá là cần thiết, nên go còn có sẵn luôn một bộ lọc gọi là

let mapleader = ' ' nnoremap h :helpgrep

73 để thụt lề mã nguồn Go đúng cách. Vì vậy các plugin cho Go thường cung cấp các lệnh trợ giúp được gọi là

let mapleader = ' ' nnoremap h :helpgrep

74, về cơ bản, chúng sẽ thực hiện lện

let mapleader = ' ' nnoremap h :helpgrep

75, lệnh này sẽ tự động căn lề tất cả các dòng trong file mã nguồn Go mà bạn đang mở.

Mọi người thường sử dụng lệnh

let mapleader = ' ' nnoremap h :helpgrep

76 để đặt đầu ra (output) của chương trình bên dưới dòng hiện tại, điều này tốt cho các tập lệnh, nhưng khi cần thực hiện nó một cách nhanh chóng, tôi thấy dễ dàng hơn khi sử dụng lệnh

let mapleader = ' ' nnoremap h :helpgrep

77, lệnh này sẽ thay thế đầu ra cho dòng hiện tại.

Xem thêm: :h filter :h :read!

Cscope

Cscope làm được nhiều thức hơn ctags, nhưng chỉ hỗ trợ ngôn ngữ lập trình C (C++ và Java với một khía cạnh nào đó).

Trong khi một file tags chỉ biết vị trí của một symbol cụ thể, thì một cơ sở dữ liệu cscope biết nhiều hơn về dữ liệu của bạn:

  • Symbol này được xác định ở đâu?
  • Symbol này được dùng ở đâu?
  • Định nghĩa toàn của của symbol này là gì?
  • Biến này lấy giá trị ở đâu?
  • Hàm này nằm ở đâu trong các file mã nguồn?
  • Các hàm nào gọi đến hàm này?
  • Hàm nào được gọi bởi hàm này?
  • Thông báo "out of space" đến từ đâu?
  • File nguồn này nằm ở đâu trong cấu trúc thư mục?
  • File nào include file header này

1. Xây dựng cơ sở dữ liệu

Chạy lệnh này trong thư mục hiện tại của project bạn đang làm:

Lệnh trên sẽ tạo ra 3 file:

let mapleader = ' ' nnoremap h :helpgrep

78 trong thư mục hiện tại. Cứ nghĩ chúng là cơ sở dữ liệu (database) của bạn đi.

Không may thay, theo mặc định thì

let mapleader = ' ' nnoremap h :helpgrep

79 chỉ phân tích các file

let mapleader = ' ' nnoremap h :helpgrep

80. nên nếu bạn muốn sử dụng cscope cho một project Java, hãy dùng lệnh:

:nmap :echo "foo"

5

2. Thêm cơ sở dữ liệu

Mở một kết nối đến cơ sở dữ liệu mới được tạo:

Xác minh rằng kết nối đã được thực hiện:

(Dĩ nhiên, bạn có thể thêm nhiều kết nối.)

3. Truy vấn cơ sở dữ liệu

Ví dụ: lệnh

let mapleader = ' ' nnoremap h :helpgrep

81 sẽ liệt kê tất cả các hàm được gọi bởi hàm

let mapleader = ' ' nnoremap h :helpgrep

82.

Loại Giải thích s symbol: tìm tất cả tham chiếu đến token g global: tìm các định nghĩa toàn cục của token c calls: tìm tất cả các liên kết gọi đến hàm t text: tìm tất cả các bản sao (instance) của văn bản e egrep: egrep để tìm một từ f file: mở file với tên file i includes: tìm các file có chứa tên file d depends: tìm các hàm được gọi bởi hàm này

Đây là một số mapping tiện lợi mà tôi có thể gợi ý. Ví dụ:

:nmap :echo "foo"

6

Vì vậy, lệnh

:h key-notation
:h mapping
:h 05.3

08 (hoặc

let mapleader = ' ' nnoremap h :helpgrep

  1. sẽ nhảy đến một định nghĩa trong các file tag,

let mapleader = ' ' nnoremap h :helpgrep

85 cũng làm điều tương tự, nhưng cũng nhận các kết nối đến csdl cscope. Tùy chọn

let mapleader = ' ' nnoremap h :helpgrep

86 sẽ làm cho

:h key-notation
:h mapping
:h 05.3

08 hoạt động giống

let mapleader = ' ' nnoremap h :helpgrep

85 một cách tự động. Điều này rất thuận tiện nếu bạn đã có các mapping liên quan đến tag.

Xem thêm:

let mapleader = ' ' nnoremap h :helpgrep

89

MatchIt

Vì Vim được viết bằng ngôn ngữ lập trình C, nên rất nhiều tính năng đều được giả định giống như ngôn ngữ C. Theo mặc định, nếu con trỏ của bạn đang ở

:h key-notation
:h mapping
:h 05.3

05 hoặc

let mapleader = ' ' nnoremap h :helpgrep

91, bạn có thể dùng

:h :version
:h feature-list
:h +feature-list
:h has-patch

92 để nhảy đến kí tự

:h key-notation
:h mapping
:h 05.3

06 hoặc

let mapleader = ' ' nnoremap h :helpgrep

94 tương ứng.

Vim đi kèm với một plugin có tên là matchit.vim, theo mặc định, plugin này sẽ không hoạt động. Plugin này làm cho phím

:h :version
:h feature-list
:h +feature-list
:h has-patch

92 cũng nhảy quanh các thẻ HTML, các lệnh if/else/endif trong VimL, và plugin này cũng giới thiệu thêm một vài lệnh khác cũng khá hữu dụng.

Cài đặt MatchIt cho Vim 8

Cài đặt MatchIt cho Vim 7 và các phiên bản cũ hơn

:nmap :echo "foo"

7

Vì tài liệu về matchit khá phong phú, tôi khuyên bạn nên làm như sau:

:nmap :echo "foo"

8

Giới thiệu nhanh

Sau khi cài đặt, plugin đã sẵn sàng để bạn sử dụng. Xem

let mapleader = ' ' nnoremap h :helpgrep

96, để biết các lệnh được hỗ trợ và

let mapleader = ' ' nnoremap h :helpgrep

97 để biết các ngôn ngữ được matchit hỗ trợ.

Bạn cũng có thể dễ dàng định nghĩa các matching pairs phù hợp cho riêng bạn:

:nmap :echo "foo"

9

Với lệnh trên, bạn có thể nhảy lần lượt từ if, đến elif, rồi đến else trong bất kì file Python nào bằng cách sử dụng

:h :version
:h feature-list
:h +feature-list
:h has-patch

92 (forward) hoặc

let mapleader = ' ' nnoremap h :helpgrep

99 (backward).

Đọc thêm:

:h key-notation
:h mapping
:h 05.3

0

True colors

Sử dụng các màu sắc trong một trình giả lập terminal nghĩa là bạn có thể sử dụng 24 bits cho màu RGB. Điều này sẽ tạo ra 16777216 (2^24) màu thay vì 256 màu thông thường.

Như đã giải thích , mỗi bảng màu (colorschemes) thực chất đều có hai phiên bản, một được định nghĩa cho các terminal (xterm) và phiên bản còn lại là cho giao diện GUIs (gvim). Điều này có ý nghĩa vì nếu các terminal không thể sử dụng true colors, chúng sẽ sử dụng bảng màu dành riêng cho terminal.

Sau khi chạy lệnh

:h cmdline-ranges
:h 10.3

00, Vim bắt đầu phát ra các chuỗi chỉ được hiểu bởi terminal được hỗ trợ true colors. Khi màu sắc của bạn trông kỳ lạ, rất có thể trình giả lập terminal của bạn không hỗ trợ true colors hoặc bảng màu của bạn không được định nghĩa sẵn các màu sắc cho phiên bản GUIs.

Có rất nhiều người sửa dụng tmux, tmux về cơ bản sẽ nằm giữa terminal và Vim. Để cho tmux nhận được các màu sắc cụ thể từ vim, đặc biệt là true colors, bạn cần phải đặt những thứ sau vào file cấu hình tmux

:h cmdline-ranges
:h 10.3

01 của bạn:

:h key-notation
:h mapping
:h 05.3

1

Vì vậy, đây là danh sách những việc cần làm để sử dụng true colors:

  • Đọc

    :h key-notation :h mapping :h 05.3

    77.
  • Đặt

    :h cmdline-ranges :h 10.3

    03 vào file cấu hình vimrc của bạn.
  • Đảm bảo rằng bảng màu (colorscheme) mà bạn đang dùng hỗ trợ GUIs. (Nó phải chứa các dòng đại loại như

    :h cmdline-ranges :h 10.3

    04 và

    :h key-notation :h mapping :h 05.3

    74.)
  • Đảm bảo terminal của bạn hỗ trợ true colors.
  • Nếu bạn dùng tmux, cấu hình nó và thêm

    :h cmdline-ranges :h 10.3

    06 vào file cấu hình.

Xem thêm: https://gist.github.com/XVilka/8346728

Các mẹo sử dụng

Chuyển đến đầu hoặc cuối của văn bản đang được chọn

:h cmdline-ranges
:h 10.3

07 và

:h cmdline-ranges
:h 10.3

08 trong chế độ visual sẽ nhảy con trỏ của bạn đến đầu và cuối văn bản đang được chọn. Hãy thử lựa chọn theo khối (blockwise selection) để thử sự khác biệt. Điều này hữu ích khi bạn muốn thay đổi kích thước của văn bản một cách nhanh chóng.

Hành vi tốt hơn của n và N

Hướng của

:nmap :echo "foo"

98 và

:nmap :echo "foo"

99 phụ thuộc vào việc bạn sử dụng

:args /*.[ch] :argdo %s/foo/bar/ge | update

11 hay

:args /*.[ch] :argdo %s/foo/bar/ge | update

13 để tìm kiếm tới, hoặc tìm kiếm lùi về trước đó. Điều này khá khó hiểu với tôi.

Nếu bạn muốn

:nmap :echo "foo"

98 luôn tìm kiếm tới phía trước và

:nmap :echo "foo"

99 luôn tìm kiếm ngược lại, hãy dùng:

:h key-notation
:h mapping
:h 05.3

2

Lịch sử các lệnh sử dụng tốt hơn

Nếu bạn giống như tôi, bạn đã quen với việc chuyển đến các mục tiếp theo, và trước đó thông qua các lệnh

:nmap :echo "foo"

45 và

:nmap :echo "foo"

46 tương ứng. Theo mặc định, điều này cũng hoạt động trong command-line và sẽ gọi lại các lệnh cũ hơn hoặc gần đây hơn từ lịch sử các lệnh đã được sử dụng.

Nhưng

:h cmdline-ranges
:h 10.3

17 và

:h cmdline-ranges
:h 10.3

18 thậm chí còn thông minh hơn! Chúng nhớ lại lệnh có phần đầu khớp với lệnh hiện tại. Ví dụ:

:h cmdline-ranges
:h 10.3

19 có thể thay đổi thành

:h cmdline-ranges
:h 10.3

20.

Dĩ nhiên, tôi không muốn bạn phải rướn tay của mình tới các phím điều hướng, vì vậy hãy map chúng như sau:

:h key-notation
:h mapping
:h 05.3

3

Tôi sử dụng các lệnh này vài lần mỗi ngày.

CTRL-L tốt hơn

Theo mặc dịnh, lệnh

:h cmdline-ranges
:h 10.3

21 sẽ xóa và vẽ lại màn hình (giống lệnh

:h cmdline-ranges
:h 10.3

22). Mapping sau đây cũng làm điều tương tự, thêm nữa là chúng sẽ highlight các kết quả phù hợp tìm được thông qua

:args /*.[ch] :argdo %s/foo/bar/ge | update

11,

:args /*.[ch] :argdo %s/foo/bar/ge | update

13, highlight cú pháp (đôi khi Vim mất đi các highlight do các quy tắc highlight phức tạp.), cập nhật các highlight cú pháp trong chế độ diff:

:h key-notation
:h mapping
:h 05.3

4

Tắt hình ảnh và âm thanh của chuông

:h key-notation
:h mapping
:h 05.3

5

Xem thêm Vim Wiki: Disable beeping.

Di chuyển nhanh dòng hiện tại

Thỉnh thoảng tôi cần di chuyển nhanh một dòng lên trên hoặc xuống dưới:

:h key-notation
:h mapping
:h 05.3

6

Các mapping này sẽ nhận vào một số đếm, ví dụ

:h cmdline-ranges
:h 10.3

25 sẽ di chuyển dòng hiện tại xuống 2 dòng.

Thêm nhanh các dòng trống

:h key-notation
:h mapping
:h 05.3

7

Bây giờ

:h cmdline-ranges
:h 10.3

26 sẽ chèn 5 dòng trống lên trên dòng hiện tại.

Chỉnh sửa nhanh macros của bạn

Đây thực sự là một viên quá quý! Mapping sẽ nhận vào một bộ ghi nhớ (register) (Hoặc

:args /*.[ch] :argdo %s/foo/bar/ge | update

01 theo mặc định) và mở nó trên cửa sổ command line. Nhấn

:h key-notation
:h mapping
:h 05.3

45 khi bạn đã chỉnh sửa xong văn bản để cài đặt cho bộ ghi nhớ.

Tôi thường sử dụng mapping này để chỉnh sửa lỗi chính tả mà tôi mắc phải khi tôi đang ghi lại một macro.

:h key-notation
:h mapping
:h 05.3

8

Sử dụng như sau

:h cmdline-ranges
:h 10.3

29 hoặc

:h cmdline-ranges
:h 10.3

30.

Lưu ý việc sử dụng

:h cmdline-ranges
:h 10.3

31 để đảm bảo

:h key-notation
:h mapping
:h 05.3

23 được chèn theo nghĩa đen. Xem

:h cmdline-ranges
:h 10.3

33.

Nhảy nhanh đến file header hoặc file mã nguồn

Kĩ thuật này có thể được áp dụng cho nhiều loại file khác nhau. Nó sẽ đặt các đánh dấu file (xem

:h cmdline-ranges
:h 10.3

  1. khi bạn rời khỏi một file mã nguồn hoặc file header, vì vậy bạn có thể nhảy nhanh ngược lại bằng cách dùng

:h cmdline-ranges
:h 10.3

35 hoặc

:h cmdline-ranges
:h 10.3

36 (Xem thêm

:h cmdline-ranges
:h 10.3

37).

:h key-notation
:h mapping
:h 05.3

9

LƯU Ý: Thông tin được lưu trong file viminfo, vì vậy hãy đảm bảo rằng lệnh

:h cmdline-ranges
:h 10.3

38 đã được bạn đặt vào file cài đặt. Xem thêm

:args /*.[ch] :argdo %s/foo/bar/ge | update

83.

Thay đổi kích thước font trong giao diện

Tôi nghĩ rằng config này được lấy từ config của tpope:

nnoremap h :helpgrep

0

Thay đổi kiểu con trỏ tùy thuộc vào chế độ

Tôi thích dùng con trỏ hình khối ở chế độ normal, con trỏ dạng i-beam ở chế độ insert, và con trỏ gạch dưới ở chế độ replace.

nnoremap h :helpgrep

1

Điều này chỉ đơn giản là yêu cầu Vim in một chuỗi kí tự nhất định (escape sequence) khi bạn vào/ rời chế độ insert. Terminal, hoặc chương trình như tmux đứng giữa terminal và vim, sẽ xử lý và đánh giá nó. Các cấu hình trên có thể không hoạt động với bạn. Cài đặt của thạm thậm chí còn có thể không hỗ trợ nhiều kiểu con trỏ khác nhau. Hãy đọc tài liệu của chúng sẽ rõ.

Ví dụ trên hoạt động tốt với iTerm2.

Không bị mất những lựa chọn (selection) khi di chuyển sang một bên

Nếu bạn chọn một hoặc nhiều dòng, bạn có thể dùng

:h cmdline-ranges
:h 10.3

40 hoặc

:nmap :echo "foo"

62 để chuyển chúng sang một bên. Thật không may bạn sẽ bị mất các lựa chọn sau khi dùng

:h cmdline-ranges
:h 10.3

40 và

:nmap :echo "foo"

62.

Bạn có thể gùn

:h cmdline-ranges
:h 10.3

44 để chọn lại lựa chọn mà bạn thực hiện lần gần nhất (xem

:h cmdline-ranges
:h 10.3

45), do đó, bạn có thể map lệnh lại như sau:

nnoremap h :helpgrep

2

Bây giờ bạn có thể dùng

:h cmdline-ranges
:h 10.3

46 mà không có vấn đề gì.

Lưu ý: Bạn có thể đạt được điều tương tự với lệnh

:h :version
:h feature-list
:h +feature-list
:h has-patch

91, lệnh lặp lại thay đổi cuối cùng.

Tải lại file khi lưu

Sử dụng bạn có thể làm bất kì thứ gì khi bạn lưu một file. Ví dụ, source nó nếu nó làm một dotfile hoặc chạy linter cho file đó để kiểm tra lỗi cũ pháp của nội dung trong file.

nnoremap h :helpgrep

3

Con trỏ thông minh hơn

Tôi thích con trỏ, nhưng tôi chỉ muốn dùng nó trong window hiện tại chứ không muốn ở chế độ chèn.

nnoremap h :helpgrep

4

Hoàn thành từ khóa nhanh hơn

Hoàn thành từ khóa khi bạn sử dụng gợi ý code (

:nmap :echo "foo"

45/

:nmap :echo "foo"

  1. sẽ cố gắng lựa chọn các lựa chọn trong

:nmap :echo "foo"

44. Theo mặc định, điều này cũng bao gồm các tag (có thể khá khó chịu) và quét tất cả các file được include (có thể sẽ rất chậm). Nếu bạn có thể sống mà không cần những thứ này, hãy tắt chúng đi:

nnoremap h :helpgrep

5

Thay đổi màu sắc

Luôn sử dụng dòng trạng thái (statusline) màu tối, bất kể bảng màu nào đang được sử dụng:

nnoremap h :helpgrep

6

Lệnh trên sẽ được kích hoạt mỗi khi bạn sử dụng

:h cmdline-ranges
:h 10.3

51. Nếu bạn muốn nó chỉ kích hoạt cho một số bảng màu nhất định, hãy dùng.

nnoremap h :helpgrep

7

Lệnh trên chỉ được thực thi cho bảng màu

:h cmdline-ranges
:h 10.3

52.

Các lệnh

Các lệnh hữu ích mà bạn cần biết. Dùng

:h cmdline-ranges
:h 10.3

53, để đọc thêm về chúng, ví dụ

:h cmdline-ranges
:h 10.3

54.

:global và :vglobal

Thực hiện một lệnh trên tất cả các dòng phừ hợp. Ví dụ

:h cmdline-ranges
:h 10.3

55 sẽ gọi lệnh

:h cmdline-ranges
:h 10.3

56 trên tất cả các dòng có chứa "regexp".

Thực tế thú vị: Có thể bạn biết rằng grep được viết bởi Ken Thompson hoạt động rất tốt. Nó làm gì? Nó sẽ in ra tất cả các dòng khớp với một biểu thức chính quy (regex) nhất định! Bây giờ hãy đoán dạng rút gọn của

:h cmdline-ranges
:h 10.3

55 xem? ĐÚng rồi! Đó là

:h cmdline-ranges
:h 10.3

58. Ken Thompson đã lấy cảm hứng từ lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

14 trong vi (phiên bản cũ hơn của Vim) khi anh ấy lập trình ra grep.

Không như tên gọi của nó,

:args /*.[ch] :argdo %s/foo/bar/ge | update

14 chỉ hoạt động trên tất cả các dòng theo mặc định, nhưng nó cũng nhận vào một phạm vi (ranges). Giả sử bạn muốn dùng lệnh

:args /*.[ch] :argdo %s/foo/bar/ge | update

37 trên tất cả các dòng từ dòng hiện tại đến dòng trống tiếp theo (khớp với regex

:h cmdline-ranges
:h 10.3

  1. có chứa "foo":

Để thực hiện các lệnh trên tất cả các dòng mà không có một một mẫu (pattern) nhất định, sử dụng

:h cmdline-ranges
:h 10.3

63 hoặc bí danh của nó

:h cmdline-ranges
:h 10.3

64 (inVerse) để thay thế.

:normal and :execute

Các lệnh này thường được dùng khi viết mã nguồn cho Vim với VimL.

Với lệnh

:h cmdline-ranges
:h 10.3

65 bạn có thể thực hiện mapping trong command-line. Ví dụ:

:h cmdline-ranges
:h 10.3

66 sẽ làm cho con trỏ đi xuống 4 dòng (mà không sử dụng bất kì mapping khác nào cho "j" bởi vì đã có dấu "!").

Lưu ý rằng: lệnh

:h cmdline-ranges
:h 10.3

65 cũng nhận vào một , vì vậy

:h cmdline-ranges
:h 10.3

68 sẽ thêm "abc" vào trước mỗi dòng.

Với

:h cmdline-ranges
:h 10.3

69 bạn có thể trộn các lệnh với các biểu thức (expressions). Giả sử bạn đang chỉnh sửa một file C và muốn đổi sang file header của nó, dùng:

nnoremap h :helpgrep

8

Cả hai lệnh thường được sử dụng cùng nhau. Giả sử bạn muốn đưa con trỏ xuống dòng "n" dòng:

nnoremap h :helpgrep

9

:redir and execute()

Rất nhiều lệnh sẽ in ra thông báo, và

:h cmdline-ranges
:h 10.3

70 cho phép bạn chuyển hướng đầu ra của các thông báo đó. Bạn có thể chuyển hướng đến các file, hoặc các biến (variables).

let mapleader = ' ' nnoremap h :helpgrep

0

Trong Vim 8 thậm chí còn có cách ngắn ngọn hơn:

Xem thêm:

Gỡ lỗi

Các mẹo chung

Nếu bạn gặp phải một lỗi lạ, hãy thử tái lập lại lỗi đó:

Lệnh trên sẽ khởi động Vim mà không có vimrc (nghĩa là Vim sẽ chạy các cài đặt mặc định). (Xem

:h cmdline-ranges
:h 10.3

71 để biết những gì cần thiết khi Vim khởi động).

Nếu bạn vẫn có thể tái lập lại lỗi đó, rất có thể đó làm một lỗi của Vim! Hãy báo có nó tại . Hầu hết thời gian, vấn đề sẽ không được giải quyết ngay lập tức và bạn sẽ cần phải kiểm tra thêm để xác định.

Các plugin thường giới thiệu chức năng mới/các thay đổi/các lỗi nếu chúng xảy ra khi bạn lưu file, hãy kiểm tra

:h cmdline-ranges
:h 10.3

72 để xem danh sách các nguyên nhân có thể gây ra lỗi.

Nếu bạn đang sử dụng một trình quản lý plugin, hãy thử comment chúng lại cho tới khi bạn tìm ra nguyên nhân.

Vấn đề vẫn chưa được giải quyết? Nếu đó không phải lỗi từ một plugin, đó có thể là một trong những cài đặt của bạn, vì vậy bạn nên kiểm tra lại các cài đặt, lệnh tự động (autocmd) của mình.

Đã đến lúc sử dụng tìm kiếm nhị phân (binary search). Hãy liên tục chia đôi không gian tìm kiếm của bạn cho đến khi bạn tìm ra nguyên nhân. (Ví dụ, thử comment một vài dòng để kiểm tra liệu chúng có phải nguyên nhân gây ra lỗi hay không). Vì đó là bản chất của tìm kiếm nhị phân, bạn sẽ không phải mất quá nhiều bước.

Trong thực tế, bạn có thể làm như sau: Đặt lệnh

:h cmdline-ranges
:h 10.3

73 vào giữa file cấu hình vimrc của bạn. Vim sẽ bỏ qua tất cả các lệnh phía sau nó. Nếu lỗi vẫn còn tồn tại, vậy vấn đề là ở phần cấu hình ở trên, nếu không có lỗi xảy ra, vậy có nghĩa là lỗi nằm ở phần dưới. Di chuyển lệnh

:h cmdline-ranges
:h 10.3

73 của bạn vào phần mà bạn đã xác định là gây ra lỗi, đặt nó vào giữa phần đó, và cứ thế lặp đi lặp lại, bạn sẽ nhanh chóng tìm ra nguyên nhân gây ra lỗi.

Độ chi tiết

Một cách hữu ích khác để quan sát những gì Vim đang thực hiện là tăng độ chi tiết. Hiện tại Vim hỗ trợ 9 cấp độ khác nhau. Xem

:h cmdline-ranges
:h 10.3

75 để biết danh sách đầy đủ.

let mapleader = ' ' nnoremap h :helpgrep

1

Lệnh trên sẽ hiển thị tất cả các file được thực thi, ví dụ, file undo hoặc các plugin khác nhau được thực hiện khi bạn lưu file.

Nếu bạn chỉ muốn tăng độ chi tiết cho một lệnh, thì cũng có lệnh

:h cmdline-ranges
:h 10.3

76, lệnh này được sử dụng bằng cách đặt trước các lệnh khác. Bạn có thể cấu hình mức độ chi tiết (mặc định là 1):

let mapleader = ' ' nnoremap h :helpgrep

2

Lệnh này thường được sử dụng với độ chi tiết là 1, để xem một cài đặt được thiết lập lần cuối ở đâu:

let mapleader = ' ' nnoremap h :helpgrep

3

Đương nhiên, mức độ chi tiết càng cao thì kết quả trả ra sẽ càng nhiều. Nhưng đừng lo, bạn có thể chỉ cần chuyển hướng danh sách đó thành một file:

let mapleader = ' ' nnoremap h :helpgrep

4

Bạn cũng có thể kích hoạt độ chi tiết khi Vim khởi động, với tùy chọn

:h cmdline-ranges
:h 10.3

77. Nó được mặt định ở mức 10. Bạn có thể đặt lại theo bạn muốn, ví dụ

:h cmdline-ranges
:h 10.3

78.

Lập hồ sơ thời gian khởi động

Vim của bạn khởi động chậm? Đã đến lúc xem qua vài thông số:

let mapleader = ' ' nnoremap h :helpgrep

5

Cột đầu tiên là cột quan trọng nhất vì nó hiển thị thời gian tuyệt đối đã trôi qua. Nếu có một sự thay đổi lớn về thời gian giữa hai dòng, dòng thứ 2 là một file rất lớn hoặt một file có code VimL bị lỗi đáng để điều tra.

Lập hồ sơ thời gian trong quá trình sử dụng Vim

Cần có :

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

9

Vim tích hợp sẵn một tính năng để bạn có thể lập hồ sơ trong khi bạn đang sử dụng Vim, và đó là một cách tuyệt vời để bạn biết phần nào khiến Vim của bạn chạy chậm.

Lệnh

:h cmdline-ranges
:h 10.3

80 nhận một loạt các lệnh phụ để chỉ định những gì cần thiết để lập nên hồ sơ.

Nếu bạn muốn lập hồ sơ cho tất cả mọi thứ, hãy dùng:

let mapleader = ' ' nnoremap h :helpgrep

6

Vim giữ thông tin hồ sơ trong bộ nhớ và chỉ ghi nó ra file log khi bạn thoát Vim. (Neovim đã sửa lỗi này bằng cách dùng lệnh

:h cmdline-ranges
:h 10.3

81).

Hãy xem file log

:h cmdline-ranges
:h 10.3

82. Tất cả các lệnh được thực thi trong quá trình lập hồ sơ sẽ được hiển thị. Mỗi dòng sẽ hiển thị tần suất thực thi, mất bao lâu để thực thi lệnh đó.

Hảy nhảy đến cuối file log. Ở đây có hai phần khác nhau

:h cmdline-ranges
:h 10.3

83 và

:h cmdline-ranges
:h 10.3

84 rất đáng giá. Chỉ cần nhìn sơ bạn cũng có thể biết hàm nào chạy chậm nhất.

Bạn có thể dùng

:h cmdline-ranges
:h 10.3

80 khi khởi động Vim:

let mapleader = ' ' nnoremap h :helpgrep

7

Gỡ lỗi các lệnh Vim

Nếu bạn đã từng sử dụng trình gỡ lỗi trên command line,

:h cmdline-ranges
:h 10.3

86 sẽ quen thuộc với bạn.

Chỉ cần thêm trước

:h cmdline-ranges
:h 10.3

86 vào bất kì lệnh nào và bạn sẽ được đưa vào chế độ gỡ lỗi. Tức là việc thực thi sẽ dừng lại ở dòng đầu tiên chuẩn bị được thực thi và dòng đó sẽ được hiển thị ra.

Xem

:h cmdline-ranges
:h 10.3

88 và nội dung bên dưới để biết 6 lệnh gỡ lỗi có sẵn trong Vim, và hãy lưu ý rằng, giống như trong gdb và các trình gỡ lỗi tương tự, bạn cũng có thể sử dụng các dạng rút gọn của chúng:

:h :version
:h feature-list
:h +feature-list
:h has-patch

71,

:h key-notation
:h mapping
:h 05.3

61,

:nmap :echo "foo"

98,

:h :version
:h feature-list
:h +feature-list
:h has-patch

72,

:nmap :echo "foo"

71, and

:h cmdline-ranges
:h 10.3

94.

Ngoài những điều đó, bạn có thể tự do sử dụng bất kì lệnh Vim nào, ví dụ

:h cmdline-ranges
:h 10.3

95, sẽ được thực thi ở vị trí hiện tại trong file code.

Về cơ bản, bạn sẽ nhận được một REPL bằng cách rất đơn giản, đó là sử dụng

:h cmdline-ranges
:h 10.3

96

Sẽ rất khó khăn nếu bạn phải đi qua từng dòng một, vì vậy, tất nhiên chúng ta cũng có thể xác định các điểm ngắt (breakpoints). (Các điểm ngắt được gọi là điểm ngắt vì quá trình thực thi các lệnh sẽ dừng lại khi chúng gặp điểm ngắt, do đó, bạn có thể đơn giản bỏ qua các lệnh mà bạn không quan tâm). Xem

:h cmdline-ranges
:h 10.3

97,

:h cmdline-ranges
:h 10.3

98, và

:h cmdline-ranges
:h 10.3

99 để biết thêm chi tiết.

Giả sử, bạn muốn biết lệnh nào được chạy mỗi khi bạn lưu file:

let mapleader = ' ' nnoremap h :helpgrep

8

Như bạn có thể thấy, việc sử dụng

:h key-notation
:h mapping
:h 05.3

45 sẽ lặp lại lệnh gỡ lỗi trước đó, trong trường hợp này là

:h :version
:h feature-list
:h +feature-list
:h has-patch

72.

:h cmdline-ranges
:h 10.3

86 có thể được sử dụng chung với .

Gỡ lỗi các file syntax

Các file syntax (cú pháp) thường là nguyên nhân gây ra sự chập chạp do các biểu thức chính quy (regex) sai và/hoặc phức tạp. Nếu :

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

9 được biên dịch sẵn trong Vim, Vim sẽ cung cấp cho bạn một lệnh vô cùng hữu ích, đó là

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

04.

let mapleader = ' ' nnoremap h :helpgrep

9

Đầu ra có chứa các số liệu quan trọng. Ví dụ: bạn có thể thấy regexp nào mất quá nhiều thời gian và cần được tối ưu, hoặc regexp nào được sử dụng mọi lúc mà không cần thiết.

Xem thêm

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

05.

Linh tinh

Tài liệu bổ sung

Tài liệu Mô tả Seven habits of effective text editing By Bram Moolenaar, the author of Vim. Seven habits of effective text editing 2.0 (PDF) See above. IBM DeveloperWorks: Scripting the Vim editor Five-part series on Vim scripting. Learn Vimscript the Hard Way Develop a Vim plugin from scratch. Practical Vim (2nd Edition) Hands down the best book about Vim. Why, oh WHY, do those #?@! nutheads use vi? Common misconceptions explained. Your problem with Vim is that you don't grok vi Concise, informative and correct. A real gem.

Screencasts

  • vimcasts.org
  • By wincent
  • By Derek Wyatt

Các bản phân phối Vim

Các bản phân phối của Vim là các gói cài đặt và plugin tùy chỉnh cho Vim được làm sẵn.

Những người dùng Vim nâng cao hơn sẽ biết cách định cấu hình của Vim theo ý thích của họ, do vậy, các bản phân phối của Vim thường chỉ nhắm đến những người mới bắt đầu. Nếu bạn nghĩ về điều đó, thì thật là nghịch lý: làm cho nó dễ dàng hơn bằng cách thêm nhiều thứ hơn để phải tìm hiểu?

Tôi biết rằng nhiều người không muốn dành hàng giờ đồng hồ để tùy chỉnh trình soạn thảo văn bản của mình (và thực sự là bạn không bao giờ có thể ngừng tùy chỉnh vimrc của mình khi bạn đã dính vào Vim), nhưng cuối cùng, hiệu quả mà bạn đạt được sẽ xứng đáng nếu bạn chịu khó dành thời gian để học Vim.

Nhắc lại theo tôi: "Một lập trình viên nên biết sử dụng các công cụ của họ"

Dù sao, nếu bạn biết mình đang làm gì, bạn có thể có được một số cảm hứng khi xem một vài bản phân phối như:

  • cream
  • janus
  • spacevim
  • spf13

Các plugin tiêu chuẩn

Nhiều người sẽ ngạc nhiên khi biết Vim đi kèm với một số plugin tiêu chuẩn. Một số được sử dụng mặc định (

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

  1. và một số thì không (

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

07). Đọc

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

08 để biết cách sử dụng chúng sau này.

Tuy nhiên, hầu hết các plugin được chạy mặc định sẽ không bao giờ được bạn sử dụng. Hãy tắt chúng khi bạn thấy phù hợp. Chúng sẽ vẫn được hiển thị là đã chạy (sourced) (Xem

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

09), nhưng chỉ những dòng đầu tiên thực sự được đọc trước khi Vim ngừng hoạt động. Sẽ không có lệnh nào khác (mappings, các lệnh, logic) được xử lý.

Plugin Tắt nó bằng cách.. Xem thêm 2html

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

10

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

11 getscript

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

12

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

13 gzip

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

14

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

15 logipat

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

16

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

17 matchparen

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

18

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

19 netrw

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

20

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

21 rrhelper

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

22

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

23 spellfile

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

24

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

25 tar

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

26

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

27 vimball

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

28

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

29 zip

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

30

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

31

Map CapsLock sang Control

CapsLock là một trong những phím vô dụng nhất trên bàn phím của bạn, nhưng nó lại nằm ở một vị trí dễ với tới hơn so với phím Control, bởi vì nó nằm trên home row của bạn. Vì vậy, mapping CapsLock thành Control là một cách tối để ngăn chặn, hay ít nhất là giảm RSI nếu bạn lập trình hoặc sử dụng bàn phím nhiều.

Chú ý: Khi đã quen rồi thì bạn sẽ không thể sống thiếu nó nữa.

Với macOS:

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

32.Đổi "CapsLock" thành "Control".

Với Linux:

Để thay đổi các phím trong X, thêm các dòng sau vào

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

33:

:h cmdline-ranges
:h 10.3

0

Sau đó hãy áp dụng nó

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

34.

Một giải pháp thay thế là sử dụng caps2esc hoặc xcape.

Với Windows:

Xem superuser.com: Map Caps-Lock to Control in Windows 8.1.

Tạo file HTML từ buffer

Tạo HTML từ buffer với lệnh

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

35 từ . Kết quả cho ra có thể được dùng để in hoặc chạy một trang web.

Lệnh trên sẽ tạo một buffer mới có cùng tên và được thêm

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

36 vào sau đuôi. Các màu sắc cũng tương tự như khi bạn xem trên Vim. Chúng phụ thuộc vào mà bạn đang sử dụng.

Plugin cũng cung cấp một số tùy chọn để tinh chỉnh đầu ra (output). Ví dụ: để cài đặt mã encode và font.

Xem thêm

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

37.

Những điều thú vị

Lệnh Tin nhắn

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

38

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

39

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

40

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

41

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

42

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

43

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

44

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

45

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

46

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

47

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

48

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

49

:h :version
:h feature-list
:h +feature-list
:h has-patch

47

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

51

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

52

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

53 (Glitch? When used in a help buffer (

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

  1. this works like

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

55 instead.)

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

56 Tự thử nó đi. ;-) Được thêm vào vim từ phiên bản 7.4.1005.

Tại sao lại dùng hjkl để điều hướng?

Khi Bill Joy tạo ra vi, tiền thân của Vim, anh ấy sử dụng ADM-3A, thiết bị này không có các phím điều hướng để sử dụng, bạn có thể đoán ra rồi đó, anh ta sử dụng hjkl để thay thế.

Bố cục bàn phím: click

Điều này cũng cho thấy lý do tại sao

:args /*.[ch] :argdo %s/foo/bar/ge | update

04 được sử dụng để biểu thị cho thư mục chính trên hệ thống Linux.

Các vấn đề thường gặp

Chỉnh sửa file nhỏ bị chậm

Có hai điều có thể gây ảnh hưởng lớn đến hiệu năng của Vim:

  1. Biểu thức chính quy (regex) phức tạp. Đặc biệt là file cú pháp của ngôn ngữ Ruby đã từng khiến mọi người bị chậm trong quá khứ. (Bạn cũng nên xem .)
  2. Vẽ lại màn hình. Một vài tính năng bắt buộc tất cả các dòng phải vẽ (render) lại. Thủ phạm điển hình Tại sao? Giải pháp?

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

58 Khiến tất cả các dòng phải vẽ lại.

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

59

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

60 Khiến tất cả các dòng phải vẽ lại.

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

61

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

62 Khiến tất cả các dòng phải vẽ lại.

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

63

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

64 Nếu file cú pháp đã chậm sẵn, lệnh này còn khiến nó tệ hơn.

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

65,

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

66 or FastFold

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

67 Nhìn chung là Vim có vấn đề với các file có nhiều dòng.

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

68 matchparen.vim Được sử dụng mặc định. Sử dụng regex để tìm dấu ngoặc đơn đi kèm. Vô hiệu hóa plugin:

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

69

Lưu ý: Bạn chỉ làm điều này nếu bạn gặp phải những hạn chế về hiệu suất thực tế. Trong hầu hết các trường hợp, việc bạn sử dụng các giải pháp được nêu trên đều hoàn toàn tốt.

Chỉnh sửa file lớn bị chậm

Vấn đề lớn nhất với các file lớn là Vim đọc toàn bộ file cùng một lúc. Đều này được thực hiện do cách buffer được hiển thị bên trong. ()

Nếu bạn chỉ muốn đọc,

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

70 là một giải pháp tốt.

Nếu bạn có thể sống mà không cần syntax, đây là lúc cài đặt và sử dụng các plugin:

Đều này sẽ làm cho việc điều hướng nhanh hơn rất nhiều, đặc biệt là vì không sử dụng các regex phức tạp để tô màu cho các cú pháp. Bạn cũng nên yêu cầu Vim không sử dụng file swap và file viminfo để tránh sự chậm trễ khi sử dụng Vim:

:h cmdline-ranges
:h 10.3

1

Tóm lại, hãy cố gắng tránh sử dụng Vim khi có ý định viết các file thực sự lớn . :\

Dán nội dung trong ngoặc (hoặc tại sao tôi phải đặt lệnh 'dán' mọi lúc?

Chế độ dán trong ngoặc (bracketed paste) cho phép terminal phân biệt giữ văn bản đã nhập và văn bản đã được dán.

Bạn đã bao giờ thử dán code của mình vào Vim và sau đó mọi thứ dường như rối tung lên?

Điều này chỉ xảy ra nếu bạn dán văn bản sử dụng

let mapleader = ' ' nnoremap h :helpgrep

04,

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

72,

let mapleader = ' ' nnoremap h :helpgrep

14, .v.v bởi vì khi bạn đang dán văn bản vào terminal. Vim không biết rằng bạn vừa dán văn bản đó, nó chỉ nghĩ rằng bạn đang gõ bàn phím cực kì nhanh. Do đó, Vim cố gắng thụt lề các dòng nhưng tất nhiên là không thành công.

Dĩ nhiên đây không phải là một vấn đề, nếu bạn dán văn bản sử dụng bộ ghi nhớ (register) trong Vim, bởi vì Vim biết rằng bạn đang thực sự dán văn bản đó.

Để giải quyết vấn đề này, bạn phải sử dụng

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

74. Xem thêm

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

75 và

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

76.

Nếu bạn đã chán ngấy với việc chuyển đối các chế đọ

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

77 (paste) mọi lúc, hãy xem plugin này: bracketed-paste.

Đọc thêm bài viết từ tác giả của plugin: tại đây.

Neovim: Neovim cố gắng làm cho tất cả những điều này trở nên liền mạch hơn nhiều và tự động đặt chế độ dán nếu terminal của bạn hỗ trợ nó.

Độ trễ khi sử dụng phím esc trong terminal

Nếu bạn sống với command-line, bạn có thể sử dụng thứ gọi là trình giả lập terminal như xterm, gnome-terminal, iTerm2, v.v. (trái ngược với terminal).

Cũng giống như tổ tiên của mình, các trình giả lập terminal sử dụng escape sequences (hoặc control sequences) để điều khiển những thứ như di chuyển con trỏ, thay đổi màu của văn bản.v.v Chúng chỉ đơn giả là các chuỗi ký tự ASCII bắt đầu bằng một ký tự (được hiển thị trong kí hiệu dấu mũ) như là

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

78). Khi trình tự như vậy xuất hiện, trình giả lập terminal sẽ tra cứu hành động kèm theo trong csdl terminfo.

Để làm rõ các vấn đề hơn, trước tiên tôi sẽ giải thích thời gian chờ của việc mapping. Chúng luôn xảy ra khi có sự không rõ ràng giữa các mapping:

:h cmdline-ranges
:h 10.3

2

Cả hai mapping đều hoạt động như mong đợi, nhưng khi nhập

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

79, sẽ có độ trễ 1 giây, vì Vim sẽ chờ xem người dùng có nhập phím

:h :version
:h feature-list
:h +feature-list
:h has-patch

49 hay không.

Các sự kiện liên tiếp đều phơi bày ra cùng một vấn đề:

  • :h ins-completion :h popupmenu-keys :h new-omni-completion

    81 được sử dụng rất nhiều để quay lại chế độ bình thường hoặc thoát một hành động nào đó.
  • Các phím điều hướng được mã hóa sử dụng chuỗi các phím escape.
  • Vim hy vọng rằng phím Alt (còn được gọi là Meta key) sẽ gửi một thông tin 8-bit đã được mã hóa thích hợp với với bộ bit cao hơn, nhưng rất nhiều terminal giả lập không hỗ trợ nó (hoặc không bật nó) mà thay vào đó, chúng gửi một chuỗi các nút escape.

Bạn có thể kiểm tra lại phần trên như sau:

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

82 và gõ

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

83, bạn sẽ thấy một chuỗi được chèn vào, bắt đầu bằng

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

78, biểu trưng cho nút escape.

Tóm lại, Vim gặp khó khăn trong việc phân biệt giữa ký tự

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

81 và một chuỗi kí tự escape thật sự.

Theo mặc định, Vim sử dụng

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

86, do đó, nó sẽ trì hoãn sự không rõ ràng của các mapping và các phím trong 1 giây. Đây là một cách giải quyết phổ biến nhất cho toàn bộ vấn đề này:

:h cmdline-ranges
:h 10.3

3

Trong

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

87 bạn sẽ tìm thấy một bảng nhỏ hiển thị mối quan hệ giữa các tùy chọn này.

Nếu bạn đang sử dụng tmux giữa Vim và Terminal giả lập của mình, hãy thêm cài đặt sau vào

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

88:

Hoàn tác các hàm tìm kiếm

  • Một tìm kiếm với lệnh ( :args /*.[ch]

    :argdo %s/foo/bar/ge | update 11,

    :h ins-completion :h popupmenu-keys :h new-omni-completion

    90, ...) sẽ thay đổi "tìm kiếm được sử dụng lần gần nhất". (Nó được lưu vào bộ ghi nhớ :args
    /*.[ch]

    :argdo %s/foo/bar/ge | update 11; bạn có thể in danh sách đó ra với lệnh

    :h ins-completion :h popupmenu-keys :h new-omni-completion

    92).
  • Một thay đổi văn bản đơn giản có thể được hoàn tác với lệnh

    :h :version :h feature-list :h +feature-list :h has-patch

    91. (Nó được lưu vào bộ ghi nhớ

    :h :version :h feature-list :h +feature-list :h has-patch

    91; bạn có thể in danh sách này ra với lệnh

    :h ins-completion :h popupmenu-keys :h new-omni-completion

    95)

Cả hai đều không phải là vấn đề, nếu bạn thực hiện chúng từ một hàm. Do đó, bạn không thể dễ dàng highlight các từ từ một hàm hoặc thực hiện lại các thay đổi văn bản được thực hiện bởi nó.

Xem thêm:

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

96

Các vấn đề kĩ thuật kì quặc

Dòng mới được sử dụng cho NUL

Ký tự NUL (

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

  1. trong một file, được lưu trữ dưới dạng một dòng mới (

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

  1. trong bộ nhớ và hiển thị trong một buffer dưới dạng

:h ins-completion
:h popupmenu-keys
:h new-omni-completion

99.

Xem

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

00 và

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

01 để biết thêm chi tiết.

Thuật ngữ

Vim script? Vimscript? VimL?

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

02,

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

03, and

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

04 đều đề cập đến cùng một thứ: Ngôn ngữ lập trình dùng để viết kịch bản cho Vim (Ngôn ngữ lập trình Vim). Mặc dù phiên bản 8.0.360 đã thay đổi các tham chiếu đến

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

04 thành

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

02, hiện nay có thể được coi là thuật ngữ chính thức,

autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#

07 vẫn còn phổ biến trên internet.