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
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 VimVim 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
5. Để xóa toàn bộ nội dung của một đoạn văn bản, chỉ cần nhấn
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ênVim đ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
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:
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ảnBạn có thể đặt file cấu hình vimrc của bạn ở
8 hoặc để quản lý tốt hơn, bạn có thể phân chia nó ra và đặt nó vào
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
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
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
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à
3 hoặc
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
5 từ shell hoặc chạy
6 từ Vim trong terminal. Một thông tin quan trọng khác là
7 và
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ư
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
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
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
00,
01,
02,
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:
Cheatsheets
Hoặc bạn cũng có thể mở nhanh một bảng cheatsheet ngay bên trong vim: vim-cheat40. Cơ bảnBuffer, window và tabVim 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ề bufferBạn có thể khởi động Vim bằng các chạy lệnh
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
05,
06 sẽ trở thành hidden buffer (buffer ẩn) và
07 sẽ trở thành
08. Cả hai buffer đều được liệt kê trong danh sách buffer, do đó, khi bạn dùng lệnh
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
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
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ụ:
12, nội dung bạn vừa gõ sẽ được lưu vào file
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
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
15. Chuyển đổi qua lại giữa các file từ danh sách tham số với lệnh
16,
17,
18,
19,
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
21,
22 hoặc
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
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:
25 Mapping lệnhBạn có thể định nghĩa các mapping của mình với danh sách các lệnh
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ế độ
26
28
29 normal, visual, operator-pending
30
31
32 normal
33
34
35 visual
36
37
38 command-line
39
40
41 operator-pending
42
43
44 insert Ví dụ: lệnh sau đây sẽ map phím
45 cho chế độ normal :nmap Bỏ mapping của phím vừa map bằng lệnh
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
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,
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
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
49 cho một hành động khác rồi, đó là
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
30. Lệnh
30 sẽ liệt kê tất cả các mapping normal và
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
55 , ví dụ:
56. Xem thêm:
Phím leaderPhí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à
57; nnoremap 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
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
59 bằng
60. let mapleader = ' '
nnoremap Ngoài
61
62
63
64
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.
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
67 và
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
69 vim [ ] Thông tin sao chép hoặc xóa gần nhất. (
70,
71,
72,
73,
75 to
76 vim [ ] bộ ghi nhớ
75: Lần sao chép gần nhất. bộ ghi nhớ
78: Lần xóa gần nhất. bộ ghi nhớ
79: Lần xóa gần thứ nhì. Và cứ như vậy. Các bộ ghi nhớ từ
78-
76 không được phép chỉnh sửa queue. Small delete
82 vim [ ] Lần xóa gần nhất mà có ít hơn 1 dòng. Named
83 to
84,
85 to
86 user [ ] Nếu bạn muốn sao chép vào bộ ghi nhớ
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ớ
85, bạn thêm nó vào sau nội dung của bộ ghi nhớ
83. Read-only
90,
91,
92 vim [x]
90: Lệnh bạn dùng cuối cùng,
91: Những từ gần nhất bạn thêm vào,
92: Tên file của buffer hiện tại. Alternate buffer
96 vim [ ] Những buffer được truy cập gần nhất của window hiện tại. Xem
97 Expression
98 user [ ] Đánh giá biểu thức VimL đã được sao chép. Ví dụ, nhập lệnh sao đây trong chế độ insert:
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ớ
69,
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
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
: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ớ
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ớ
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 viRanges (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.
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
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:
Đánh dấuBạ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
83 -
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.
85 -
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.
75 -
76 viminfo
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.
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 00 Vị trí bạn thực hiện chèn kí tự lần gần nhất. :nmap 01, :nmap 02 Vị trí bạn thực hiện thay đổi lần gần nhất. :nmap 03, :nmap 04 Bắt đầu câu hiện tại. :nmap 05, :nmap 06 Kết thúc của câu hiện tại. :nmap 07, :nmap 08 Bắt đầu của đoạn văn bản hiện tại. :nmap 09, :nmap 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
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 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 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 14. Gợi ý codeVim 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 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 16 toàn bộ dòng :nmap 17 :nmap 18 các từ khóa trong file hiện tại :nmap 19 :nmap 20 các từ khóa trong tùy chọn :nmap 21 :nmap 22 :nmap 23 các từ khóa trong tùy chọn :nmap 24 :nmap 25 :nmap 26 các từ khóa trong các files hiện tại được mở :nmap 27 :nmap 28 các thẻ (tags) :nmap 29 :nmap 30 tên file :nmap 31 :nmap 32 các định nghĩa (definitions) hoặc macros :nmap 33 :nmap 34 các lệnh của Vim :nmap 35 :nmap 36 người dùng tự định nghĩa (như đã được chỉ định trong :nmap 37) :nmap 38 :nmap 39 omni completion (như đã được chỉ định trong :nmap 40) :nmap 41 :nmap 42 gợi ý chính tả :nmap 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 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 45 (chọn gợi ý tiếp theo) and :nmap 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 47 và :nmap 48 để có thêm nhiều thông tin bổ ích. Bạn cũng phải xem qua :nmap 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:
Chuyển động, các toán tử, các đối tượng văn bảnSự 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 50/ :nmap 51/ :nmap 52/ :nmap 53. Hoặc :nmap 54 và
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 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 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ư
70, :args /*.[ch] :argdo %s/foo/bar/ge | update 04, :nmap 61, :nmap 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 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 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 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 66 cũng hoạt động giống như :nmap 67 nhưng được thực hiện 2 lần. Xem :nmap 68 để biết tất cả các toán tử khả dụng. Sử dụng :nmap 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 71 (inner) hoặc
83 (around) theo sau là một ký tự biểu thị đối tượng. Với :nmap 71, chúng chỉ hoạt động trên chính đối tượng đó, còn với
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 75 sẽ xóa từ hiện tại và
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 77 và con trỏ trên hoặc giữa đấu ngoặc đơn trong cùng, thì :nmap 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 79 để biết tất cả các đối tượng văn bản khả dụng. Lệnh tự độngBạ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 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 81 để biết một cách tổng quan về các sự kiện có sẵn trong Vim và :nmap 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 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 84. Điều này hiểu nôm na là :nmap 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 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 80 chúng sẽ được liệt kê theo đúng thứ tự (từ trên xuống).
0 Các sự kiện :nmap 88 và :nmap 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 90 và các lệnh tương tự. Sau đó, hàng trăm loại file đều được :nmap 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 92 Danh sách thay đổi, danh sách nhảyVị 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 95, :args /*.[ch] :argdo %s/foo/bar/ge | update 11, :args /*.[ch] :argdo %s/foo/bar/ge | update 13, :nmap 98, :nmap 99,
92,
01,
02,
03,
04,
05,
06,
07,
08,
09,
10,
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
12
13
14 changelist
15
16
17 Khi bạn liệt kê tất cả các mục, một marker :nmap 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à
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:
1 Cây hoàn tácNhữ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.
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:
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 (
22 sẽ hoàn tác lại nguyên trạng văn bản của nút "bar". Nhấn
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
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,
27 và
28 duyệt cây theo thời gian. Do đó,
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
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
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
27 và
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
34,
35 Hoàn tác thay đổi [số] lần.
36,
37 Áp dụng lại thay đổi [số] lần.
38 Hoàn tác tất cả các thay đổi đối với dòng được thay đổi gần nhất.
39,
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ụ:
41 sẽ hoàn tác văn bản về trạng thái của 2 ngày trước.
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.
43,
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
45 để mở một mục đang được chọn trong window đang được liên kết và
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:
47
48 đóng window
49
50 mục tiếp theo
51
52 mục trước đó
53
54 mục đầu tiên
55
56 mục cuối cùng
57
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
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
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.
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. MacrosVim 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ế.)
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
67, lệnh này có thể được viết dưới dạng
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
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:
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:
5 Bảng màuBả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:
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
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
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
73 và
74. Theo định nghĩa của thì (
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:
Thu gọn CodeMọ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
78 to basically create a new fold method. indent Folds based on indentation. manual Create folds yourself via
79,
80, and
81. marker Folds based on markers in the text (often in comments). syntax Folds based on syntax, e.g. folding
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ệcNếu bạn lưu một view (Xem
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 (
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
85. Nếu bạn không điền tên file,
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
87. Khởi động lại Vim là nhập
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
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:
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
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)
92. Xem thêm:
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
93
94 buffer or window
95
26
97 buffer
98
99 nnoremap 00 buffer nnoremap 01 nnoremap 02 nnoremap 03 window nnoremap 04
59 nnoremap 06 buffer
68 . Cách sử dụngNhận trợ giúp ngoại tuyếnVim đ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 08. Chạy lệnh trên sẽ mở file nnoremap 09 trong một window mới và nhảy tới thẻ nnoremap 10 trong file đó. Một vài quy tắc đơn giản:
Bạn có thể dùng nnoremap 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 17 sẽ cung cấp cho bạn danh sách tất cả các thẻ từ nnoremap 18, nnoremap 19 cho tới nnoremap 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 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 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 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 24/ nnoremap 25 để nhảy qua lại giữa các kết quả tìm được. Hoặc dùng
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
45 để nhảy đến file tài liệu ứng với kết quả đó. Xem thêm
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ứ).
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 37 mentions the user guide topics nnoremap 83 and nnoremap 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 37 sẽ đề cập đến các chủ đề hướng đẫn sử dụng nnoremap 83 và nnoremap 84. Nhận trợ giúp trực tuyếnNế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
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 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.
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:
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 90. Nhưng điều này lại có nhược điểm đó là bạn không thể sử dụng nnoremap 91 trong lênh tự động :autocmd, mà bạn cần phải sử dụng nnoremap 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 93 Các lệnh tự động lồng vào nhauTheo 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 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 95 sẽ không bao giờ được thực thi. Xem thêm nnoremap 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 97 ClipboardClipboard (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 99 nếu bạn muốn sử dụng let mapleader = ' '
nnoremap 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 01/ let mapleader = ' '
nnoremap 02 và dán chúng vào một ứng dụng khác với lệnh let mapleader = ' '
nnoremap 03/ let mapleader = ' '
nnoremap 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 06 và let mapleader = ' '
nnoremap 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ớ
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
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
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 14, let mapleader = ' '
nnoremap 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 01 let mapleader = ' '
nnoremap 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 20 khi bạn đóng ứng dụng. Sử dụng let mapleader = ' '
nnoremap 07 để dán lựa chọn PRIMARY hoặc let mapleader = ' '
nnoremap 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 23 được dùng như giá trị mặc định, xem let mapleader = ' '
nnoremap 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
69. Sau đó, bạn chỉ cần sử dụng
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ở fileKhi 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
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
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 32 Các file tạmCác file sao lưuTrướ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 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 34, nhưng bạn không nên làm điều này. let mapleader = ' '
nnoremap 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 36. Vim có hai cách khác nhau để tạo bản sao lưu: sao chép và đổi tên.
Xem thêm let mapleader = ' '
nnoremap 37 để biết thêm nhiều thứ hay ho khác. Demo: :nmap 0 :nmap 1 Xem thêm: :h backup :h write-fail Các file swapKhi 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 38. Vô hiệu hóa chúng bằng lệnh let mapleader = ' '
nnoremap 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 40 và let mapleader = ' '
nnoremap 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 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 43. Lệnh này sẽ lưu file hoàn tác cho file let mapleader = ' '
nnoremap 44 dưới dạng let mapleader = ' '
nnoremap 45. Xem thêm: :h 'undofile' :h undo-persistence File viminfoTrong 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 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 47: :nmap 2 Chỉnh sửa file từ xaVim đ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 3 Nếu bạn đã thiết lập let mapleader = ' '
nnoremap 48 sẵn, chúng sẽ được tự động sử dụng: :nmap 4 Giả sử, nội dung trên nằm trong file let mapleader = ' '
nnoremap 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 50, xem let mapleader = ' '
nnoremap 51. Hãy đảm bảo rằng bạn đã đọc let mapleader = ' '
nnoremap 52 và let mapleader = ' '
nnoremap 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ý pluginsPathogen 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
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ốiChè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 55. Sau đó, chọn một vài dòng. Nhấn let mapleader = ' '
nnoremap 56 hoặc
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 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 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 60: Sau đó let mapleader = ' '
nnoremap 61 or let mapleader = ' '
nnoremap 62 hoạt động ngay cả khi con trỏ của bạn đang ở cuối một dòng. Xem let mapleader = ' '
nnoremap 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ọcLư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 64) Sử dụng let mapleader = ' '
nnoremap 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 66. Dùng let mapleader = ' '
nnoremap 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 68. Nếu không được chỉ định phạm vi (ranges), kết quả của lệnh let mapleader = ' '
nnoremap 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
90. Ngoài ra còn có một toán từ let mapleader = ' '
nnoremap 71 chấp nhận các chuyển động (motions). Ví dụ: let mapleader = ' '
nnoremap 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 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 74, về cơ bản, chúng sẽ thực hiện lện let mapleader = ' '
nnoremap 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 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 77, lệnh này sẽ thay thế đầu ra cho dòng hiện tại. Xem thêm: :h filter :h :read! CscopeCscope 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:
1. Xây dựng cơ sở dữ liệuChạ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 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 79 chỉ phân tích các file let mapleader = ' '
nnoremap 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 5 2. Thêm cơ sở dữ liệuMở 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ệuVí dụ: lệnh let mapleader = ' '
nnoremap 81 sẽ liệt kê tất cả các hàm được gọi bởi hàm let mapleader = ' '
nnoremap 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 6 Vì vậy, lệnh
08 (hoặc let mapleader = ' '
nnoremap
let mapleader = ' '
nnoremap 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 86 sẽ làm cho
08 hoạt động giống let mapleader = ' '
nnoremap 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 89 MatchItVì 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 ở
05 hoặc let mapleader = ' '
nnoremap 91, bạn có thể dùng
92 để nhảy đến kí tự
06 hoặc let mapleader = ' '
nnoremap 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
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 8Cài đặt MatchIt cho Vim 7 và các phiên bản cũ hơn:nmap 7 Vì tài liệu về matchit khá phong phú, tôi khuyên bạn nên làm như sau: :nmap 8 Giới thiệu nhanhSau khi cài đặt, plugin đã sẵn sàng để bạn sử dụng. Xem let mapleader = ' '
nnoremap 96, để biết các lệnh được hỗ trợ và let mapleader = ' '
nnoremap 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 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
92 (forward) hoặc let mapleader = ' '
nnoremap 99 (backward). Đọc thêm:
0 True colorsSử 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
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
01 của bạn:
1 Vì vậy, đây là danh sách những việc cần làm để sử dụng true colors:
Xem thêm: https://gist.github.com/XVilka/8346728 Các mẹo sử dụngChuyển đến đầu hoặc cuối của văn bản đang được chọn
07 và
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à NHướng của :nmap 98 và :nmap 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 98 luôn tìm kiếm tới phía trước và :nmap 99 luôn tìm kiếm ngược lại, hãy dùng:
2 Lịch sử các lệnh sử dụng tốt hơnNế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 45 và :nmap 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
17 và
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ụ:
19 có thể thay đổi thành
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:
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ơnTheo mặc dịnh, lệnh
21 sẽ xóa và vẽ lại màn hình (giống lệnh
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:
4 Tắt hình ảnh và âm thanh của chuông
5 Xem thêm Vim Wiki: Disable beeping. Di chuyển nhanh dòng hiện tạiThỉ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:
6 Các mapping này sẽ nhận vào một số đếm, ví dụ
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
7 Bây giờ
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
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.
8 Sử dụng như sau
29 hoặc
30. Lưu ý việc sử dụng
31 để đảm bảo
23 được chèn theo nghĩa đen. Xem
33. Nhảy nhanh đến file header hoặc file mã nguồnKĩ 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
35 hoặc
36 (Xem thêm
37).
9 LƯU Ý: Thông tin được lưu trong file viminfo, vì vậy hãy đảm bảo rằng lệnh
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ệnTôi nghĩ rằng config này được lấy từ config của tpope: nnoremap 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 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ênNếu bạn chọn một hoặc nhiều dòng, bạn có thể dùng
40 hoặc :nmap 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
40 và :nmap 62. Bạn có thể gùn
44 để chọn lại lựa chọn mà bạn thực hiện lần gần nhất (xem
45), do đó, bạn có thể map lệnh lại như sau: nnoremap 2 Bây giờ bạn có thể dùng
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
91, lệnh lặp lại thay đổi cuối cùng. Tải lại file khi lưuSử 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 3 Con trỏ thông minh hơnTô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 4 Hoàn thành từ khóa nhanh hơnHoàn thành từ khóa khi bạn sử dụng gợi ý code ( :nmap 45/ :nmap
:nmap 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 5 Thay đổi màu sắcLuô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 6 Lệnh trên sẽ được kích hoạt mỗi khi bạn sử dụng
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 7 Lệnh trên chỉ được thực thi cho bảng màu
52. Các lệnhCác lệnh hữu ích mà bạn cần biết. Dùng
53, để đọc thêm về chúng, ví dụ
54. :global và :vglobalThực hiện một lệnh trên tất cả các dòng phừ hợp. Ví dụ
55 sẽ gọi lệnh
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
55 xem? ĐÚng rồi! Đó là
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
Để 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
63 hoặc bí danh của nó
64 (inVerse) để thay thế. :normal and :executeCá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
65 bạn có thể thực hiện mapping trong command-line. Ví dụ:
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
65 cũng nhận vào một , vì vậy
68 sẽ thêm "abc" vào trước mỗi dòng. Với
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 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 9 :redir and execute()Rất nhiều lệnh sẽ in ra thông báo, và
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 0 Trong Vim 8 thậm chí còn có cách ngắn ngọn hơn: Xem thêm: Gỡ lỗiCác mẹo chungNế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
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
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
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
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ếtMộ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
75 để biết danh sách đầy đủ. let mapleader = ' '
nnoremap 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
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 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 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 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
77. Nó được mặt định ở mức 10. Bạn có thể đặt lại theo bạn muốn, ví dụ
78. Lập hồ sơ thời gian khởi độngVim của bạn khởi động chậm? Đã đến lúc xem qua vài thông số: let mapleader = ' '
nnoremap 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 VimCầ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
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 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
81). Hãy xem file log
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
83 và
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
80 khi khởi động Vim: let mapleader = ' '
nnoremap 7 Gỡ lỗi các lệnh VimNếu bạn đã từng sử dụng trình gỡ lỗi trên command line,
86 sẽ quen thuộc với bạn. Chỉ cần thêm trước
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
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:
71,
61, :nmap 98,
72, :nmap 71, and
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ụ
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
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
97,
98, và
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 8 Như bạn có thể thấy, việc sử dụng
45 sẽ lặp lại lệnh gỡ lỗi trước đó, trong trường hợp này là
72.
86 có thể được sử dụng chung với . Gỡ lỗi các file syntaxCá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à
04. let mapleader = ' '
nnoremap 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
05. Linh tinhTài liệu bổ sungTà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
Các bản phân phối VimCá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ư:
Các plugin tiêu chuẩnNhiề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 (
07). Đọc
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
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
10
11 getscript
12
13 gzip
14
15 logipat
16
17 matchparen
18
19 netrw
20
21 rrhelper
22
23 spellfile
24
25 tar
26
27 vimball
28
29 zip
30
31 Map CapsLock sang ControlCapsLock 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:
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
33:
0 Sau đó hãy áp dụng nó
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ừ bufferTạo HTML từ buffer với lệnh
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
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
37. Những điều thú vịLệnh Tin nhắn
38
39
40
41
42
43
44
45
46
47
48
49
47
51
52
53 (Glitch? When used in a help buffer (
55 instead.)
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ặpChỉnh sửa file nhỏ bị chậmCó hai điều có thể gây ảnh hưởng lớn đến hiệu năng của Vim:
58 Khiến tất cả các dòng phải vẽ lại.
59
60 Khiến tất cả các dòng phải vẽ lại.
61
62 Khiến tất cả các dòng phải vẽ lại.
63
64 Nếu file cú pháp đã chậm sẵn, lệnh này còn khiến nó tệ hơn.
65,
66 or FastFold
67 Nhìn chung là Vim có vấn đề với các file có nhiều dòng.
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:
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ậmVấ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,
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:
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 04,
72, let mapleader = ' '
nnoremap 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
74. Xem thêm
75 và
76. Nếu bạn đã chán ngấy với việc chuyển đối các chế đọ
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 terminalNế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à
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:
2 Cả hai mapping đều hoạt động như mong đợi, nhưng khi nhập
79, sẽ có độ trễ 1 giây, vì Vim sẽ chờ xem người dùng có nhập phím
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 đề:
Bạn có thể kiểm tra lại phần trên như sau:
82 và gõ
83, bạn sẽ thấy một chuỗi được chèn vào, bắt đầu bằng
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ự
81 và một chuỗi kí tự escape thật sự. Theo mặc định, Vim sử dụng
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:
3 Trong
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
88: Hoàn tác các hàm tìm kiếm
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:
96 Các vấn đề kĩ thuật kì quặcDòng mới được sử dụng cho NULKý tự NUL (
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. |