Phím tắt hiệu quả nhất của bạn với Vim là gì?


1126

Tôi đã nghe rất nhiều về Vim , cả ưu và nhược điểm. Có vẻ như bạn nên (với tư cách là nhà phát triển) nhanh hơn với Vim so với bất kỳ trình soạn thảo nào khác. Tôi đang sử dụng Vim để thực hiện một số nội dung cơ bản và tôi hoạt động kém hiệu quả hơn 10 lần với Vim.

Hai điều duy nhất bạn nên quan tâm khi bạn nói về tốc độ (bạn có thể không quan tâm đúng mức đến chúng, nhưng bạn nên) là:

  1. Sử dụng luân phiên tay trái và tay phải là cách nhanh nhất để sử dụng bàn phím.
  2. Không bao giờ chạm vào chuột là cách thứ hai để nhanh nhất có thể. Bạn phải mất nhiều thời gian để di chuyển bàn tay, nắm lấy chuột, di chuyển và đưa nó trở lại bàn phím (và bạn thường phải nhìn vào bàn phím để chắc chắn rằng bạn đã đưa tay trở lại đúng vị trí)

Đây là hai ví dụ minh họa tại sao tôi kém năng suất hơn với Vim.

Sao chép / Cắt và dán. Tôi làm nó suốt. Với tất cả các trình soạn thảo hiện đại, bạn nhấn Shift bằng tay trái và bạn di chuyển con trỏ bằng tay phải để chọn văn bản. Sau đó Ctrl+ Cbản sao, bạn di chuyển con trỏ và Ctrl+ Vdán.

Với Vim, điều đó thật kinh khủng:

  • yy để sao chép một dòng (bạn gần như không bao giờ muốn toàn bộ dòng!)
  • [number xx]yyđể sao chép xxcác dòng vào bộ đệm. Nhưng bạn không bao giờ biết chính xác nếu bạn đã chọn những gì bạn muốn. Tôi thường phải làm [number xx]ddsau đó uđể hoàn tác!

Một vi dụ khac? Tìm kiếm & thay thế.

  • Trong PSPad : Ctrl+ fsau đó nhập nội dung bạn muốn bạn tìm kiếm, sau đó nhấn Enter.
  • Trong Vim : /, sau đó nhập nội dung bạn muốn tìm kiếm, sau đó nếu có một số ký tự đặc biệt được đặt \trước mỗi ký tự đặc biệt, sau đó nhấn Enter.

Và mọi thứ với Vim đều như vậy: dường như tôi không biết cách xử lý nó đúng cách.

NB: Tôi đã đọc tờ cheat Vim :)

Câu hỏi của tôi là:

Cách bạn sử dụng Vim giúp bạn làm việc hiệu quả hơn so với một biên tập viên đương đại là gì?


"Sử dụng luân phiên tay trái và tay phải là cách nhanh nhất để sử dụng bàn phím." Không phải cho tôi, kỳ lạ. Khi tôi có thể gõ một từ bằng một tay, tôi thấy rằng tôi nhanh hơn nhiều.
Ben Mordecai

Câu trả lời:


2860

Vấn đề của bạn với Vim là bạn không mò mẫm vi .

Bạn đề cập đến việc cắt yyvà phàn nàn rằng bạn gần như không bao giờ muốn cắt toàn bộ dòng. Trong các lập trình viên thực tế, chỉnh sửa mã nguồn, rất thường muốn làm việc trên toàn bộ dòng, phạm vi của dòng và khối mã. Tuy nhiên, yychỉ có một trong nhiều cách để đưa văn bản vào bộ đệm sao chép ẩn danh (hoặc "đăng ký" như được gọi trong vi ).

"Zen" của vi là bạn đang nói một ngôn ngữ. Ban đầu ylà một động từ. Các tuyên bố yylà một từ đồng nghĩa cho y_. Các yđược tăng gấp đôi lên để làm cho nó dễ dàng hơn để gõ, vì nó là một hoạt động phổ biến như vậy.

Điều này cũng có thể được thể hiện dưới dạng dd P(xóa dòng hiện tại và dán một bản sao vào vị trí; để lại một bản sao trong sổ đăng ký ẩn danh làm tác dụng phụ). Các yd"động từ" lấy bất kỳ chuyển động như họ "đối tượng". Do đó, yW"yank từ đây (con trỏ) đến cuối từ hiện tại / tiếp theo (lớn)" và y'alà "yank từ đây đến dòng chứa dấu có tên ' a '."

Nếu bạn chỉ hiểu các chuyển động con trỏ lên, xuống, trái và phải cơ bản thì vi sẽ không hiệu quả hơn một bản sao "notepad" cho bạn. (Được rồi, bạn vẫn sẽ làm nổi bật cú pháp và khả năng xử lý các tệp lớn hơn mức trung bình ~ 45KB hoặc hơn; nhưng làm việc với tôi ở đây).

vi có 26 "điểm" và 26 "đăng ký." Một dấu được đặt thành bất kỳ vị trí con trỏ bằng mlệnh. Mỗi dấu được chỉ định bởi một chữ cái viết thường. Do đó, mađặt dấu ' a ' cho vị trí hiện tại và mzđặt dấu ' z '. Bạn có thể di chuyển đến dòng chứa một dấu bằng cách sử dụng lệnh '(trích dẫn đơn). Do đó, 'adi chuyển đến đầu dòng chứa dấu ' a '. Bạn có thể di chuyển đến vị trí chính xác của bất kỳ nhãn hiệu nào bằng lệnh `(backquote). Do đó, `zsẽ di chuyển trực tiếp đến vị trí chính xác của dấu ' z '.

Bởi vì đây là những "phong trào", chúng cũng có thể được sử dụng làm chủ đề cho các "tuyên bố" khác.

Vì vậy, một cách để cắt một lựa chọn văn bản tùy ý sẽ là bỏ một dấu (tôi thường sử dụng ' a ' làm dấu "đầu tiên" của mình, ' z ' làm dấu tiếp theo của tôi, ' b ' như một dấu khác và ' e ' là còn một điều nữa (tôi không nhớ là đã từng sử dụng tương tác hơn bốn nhãn hiệu trong 15 năm sử dụng vi ; người ta tạo ra các quy ước riêng về cách các nhãn hiệu và thanh ghi được sử dụng bởi các macro không làm phiền bối cảnh tương tác của một người). đến đầu kia của văn bản mong muốn của chúng tôi, chúng tôi có thể bắt đầu ở một trong hai đầu, điều đó không thành vấn đề. Sau đó, chúng tôi chỉ đơn giản có thể sử dụng d`ađể cắt hoặc y`asao chép. Do đó, toàn bộ quá trình có 5 lần nhấn phím (sáu nếu chúng tôi bắt đầu "chèn "chế độ và cần thiết đểEscra chế độ lệnh). Khi chúng tôi đã cắt hoặc sao chép rồi dán vào một bản sao là một lần nhấn phím : p.

Tôi nói rằng đây là một cách để cắt hoặc sao chép văn bản. Tuy nhiên, nó chỉ là một trong số nhiều. Thường thì chúng ta có thể mô tả ngắn gọn hơn phạm vi văn bản mà không cần di chuyển con trỏ xung quanh và đánh dấu. Ví dụ: nếu tôi ở trong một đoạn văn bản, tôi có thể sử dụng {}di chuyển đến đầu hoặc cuối đoạn tương ứng. Vì vậy, để di chuyển một đoạn văn bản tôi đã cắt nó bằng cách sử dụng { d}(3 tổ hợp phím). (Nếu tôi tình cờ đã ở dòng đầu tiên hoặc cuối cùng của đoạn thì tôi có thể chỉ cần sử dụng d}hoặc d{tương ứng.

Khái niệm "đoạn" mặc định cho một cái gì đó thường hợp lý theo trực giác. Do đó, nó thường hoạt động cho mã cũng như văn xuôi.

Chúng tôi thường biết một số mẫu (biểu thức chính quy) đánh dấu một đầu này hoặc đầu kia của văn bản mà chúng tôi quan tâm. Tìm kiếm tiến hoặc lùi là các chuyển động trong vi . Do đó, chúng cũng có thể được sử dụng làm "chủ thể" trong "tuyên bố" của chúng tôi. Vì vậy, tôi có thể sử dụng d/foođể cắt từ dòng hiện tại sang dòng tiếp theo chứa chuỗi "foo" và y?barsao chép từ dòng hiện tại sang dòng gần đây nhất (trước đó) có chứa "thanh". Nếu tôi không muốn toàn bộ dòng, tôi vẫn có thể sử dụng các chuyển động tìm kiếm (dưới dạng câu lệnh của riêng họ), bỏ dấu (s) của tôi và sử dụng các `xlệnh như được mô tả trước đây.

Ngoài "động từ" và "chủ ngữ" vi còn có "đối tượng" (theo nghĩa ngữ pháp của thuật ngữ này). Cho đến nay tôi chỉ mô tả việc sử dụng đăng ký ẩn danh. Tuy nhiên, tôi có thể sử dụng bất kỳ trong số 26 thanh ghi "có tên" bằng cách thêm tiền tố vào tham chiếu "đối tượng" với "(công cụ sửa đổi trích dẫn kép). Do đó, nếu tôi sử dụng, "addtôi sẽ cắt dòng hiện tại vào thanh ghi ' a ' và nếu tôi sử dụng "by/foothì tôi sẽ lấy một bản sao của văn bản từ đây sang dòng tiếp theo có chứa "foo" vào thanh ghi ' b '. Để dán từ một thanh ghi, tôi chỉ cần tiền tố dán với trình tự sửa đổi tương tự: "apdán một bản sao của ' a ' đăng ký '"bPdán một bản sao từ ' b ' đến trước dòng hiện tại.

Khái niệm "tiền tố" này cũng thêm các từ tương tự của "tính từ" ngữ pháp và "trạng từ" vào ngôn ngữ thao tác văn bản của chúng tôi. "Hầu hết các lệnh (động từ) và chuyển động (động từ hoặc đối tượng, tùy theo ngữ cảnh) cũng có thể lấy tiền tố số. 3Jcó nghĩa là "tham gia ba dòng tiếp theo" và d5}có nghĩa là "xóa khỏi dòng hiện tại cho đến hết đoạn thứ năm trở xuống từ đây."

Đây là tất cả các cấp trung cấp vi . Không ai trong số đó là Vim cụ thể và có nhiều thủ thuật nâng cao hơn nhiều trong vi nếu bạn sẵn sàng tìm hiểu chúng. Nếu bạn chỉ thành thạo các khái niệm trung gian này thì có lẽ bạn sẽ thấy rằng bạn hiếm khi cần phải viết bất kỳ macro nào vì ngôn ngữ thao tác văn bản đủ ngắn gọn và biểu cảm để thực hiện hầu hết mọi thứ một cách dễ dàng bằng ngôn ngữ "bản địa" của trình soạn thảo.


Một mẫu của các thủ thuật nâng cao hơn:

Có một số :lệnh, đáng chú ý nhất là :% s/foo/bar/gkỹ thuật thay thế toàn cầu. (Đó không phải là nâng cao nhưng các :lệnh khác có thể được). Toàn bộ :các lệnh đã được kế thừa trong lịch sử bởi các hóa thân trước đó của vied (trình chỉnh sửa dòng) và sau đó là các tiện ích (trình soạn thảo dòng mở rộng). Trong thực tế vi được đặt tên như vậy bởi vì đó là giao diện trực quan để .

:các lệnh thường hoạt động trên các dòng văn bản. edex đã được viết trong một kỷ nguyên khi màn hình thiết bị đầu cuối không phổ biến và nhiều thiết bị đầu cuối là thiết bị "teletype" (TTY). Vì vậy, thông thường là làm việc từ các bản sao in của văn bản, sử dụng các lệnh thông qua giao diện cực kỳ ngắn gọn (tốc độ kết nối phổ biến là 110 baud, hoặc, khoảng 11 ký tự mỗi giây - chậm hơn so với một người đánh máy nhanh; phiên tương tác nhiều người dùng, ngoài ra thường có một số động lực để bảo tồn giấy).

Vì vậy, cú pháp của hầu hết :các lệnh bao gồm một địa chỉ hoặc phạm vi địa chỉ (số dòng) theo sau là một lệnh. Đương nhiên, người ta có thể sử dụng số dòng theo nghĩa đen: :127,215 s/foo/barđể thay đổi lần xuất hiện đầu tiên của "foo" thành "thanh" trên mỗi dòng giữa 127 và 215. Người ta cũng có thể sử dụng một số chữ viết tắt như .hoặc $cho dòng hiện tại và dòng cuối cùng. Người ta cũng có thể sử dụng các tiền tố tương đối +-để tham chiếu đến các độ lệch sau hoặc trước dòng curent tương ứng. Do đó: :.,$jcó nghĩa là "từ dòng hiện tại đến dòng cuối cùng, nối tất cả chúng thành một dòng". :%đồng nghĩa với :1,$(tất cả các dòng).

Các lệnh :... g:... vchịu một số lời giải thích vì chúng rất mạnh mẽ. :... glà tiền tố cho "toàn cầu" áp dụng lệnh tiếp theo cho tất cả các dòng khớp với mẫu (biểu thức chính quy) trong khi :... váp dụng lệnh đó cho tất cả các dòng KHÔNG khớp với mẫu đã cho ("v" từ "conVerse"). Cũng như các lệnh ex khác, chúng có thể được thêm tiền tố bằng cách tham chiếu địa chỉ / phạm vi. Do đó, :.,+21g/foo/dcó nghĩa là "xóa bất kỳ dòng nào chứa chuỗi" foo "khỏi dòng hiện tại qua 21 dòng tiếp theo" trong khi đó :.,$v/bar/dcó nghĩa là "từ đây đến cuối tệp, xóa bất kỳ dòng nào KHÔNG chứa chuỗi" thanh ".

Thật thú vị khi lệnh grep Unix phổ biến thực sự được lấy cảm hứng từ lệnh ex này (và được đặt tên theo cách mà nó được ghi lại). Các cựu lệnh :g/re/p(grep) là cách họ ghi nhận cách "toàn cầu" "in" các dòng có chứa một "biểu thức chính quy" (tái). Khi edex được sử dụng, :plệnh là một trong những lệnh đầu tiên mà bất kỳ ai cũng học và thường là lệnh đầu tiên được sử dụng khi chỉnh sửa bất kỳ tệp nào. Đó là cách bạn in nội dung hiện tại (thường chỉ có một trang đầy đủ tại một thời điểm sử dụng :.,+25phoặc một số nội dung như vậy).

Lưu ý rằng :% g/.../dhoặc (đối tác reVerse / conVerse của nó: :% v/.../dlà các mẫu sử dụng phổ biến nhất. Tuy nhiên, có một số exlệnh khác đáng ghi nhớ:

Chúng ta có thể sử dụng mđể di chuyển các dòng xung quanh và jđể nối các dòng. Ví dụ: nếu bạn có một danh sách và bạn muốn tách tất cả các công cụ khớp (hoặc ngược lại KHÔNG khớp với một số mẫu) mà không xóa chúng, thì bạn có thể sử dụng một cái gì đó như: :% g/foo/m$... và tất cả các dòng "foo" sẽ được chuyển đến cuối tập tin (Lưu ý mẹo khác về việc sử dụng phần cuối của tệp làm khoảng trống đầu). Điều này sẽ bảo toàn thứ tự tương đối của tất cả các dòng "foo" trong khi đã trích xuất chúng từ phần còn lại của danh sách. (Điều này sẽ tương đương với việc thực hiện một cái gì đó như: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d(sao chép tệp vào đuôi của chính nó, lọc phần đuôi qua grepvà xóa tất cả nội dung khỏi phần đầu).

Để tham gia các dòng thường tôi có thể tìm một mẫu cho tất cả các dòng cần được nối với người tiền nhiệm của chúng (ví dụ: tất cả các dòng bắt đầu bằng "^" thay vì "^ *" trong một số danh sách dấu đầu dòng). Trong trường hợp đó tôi sẽ sử dụng: :% g/^ /-1j(đối với mỗi dòng phù hợp, hãy đi lên một dòng và tham gia chúng). (BTW: cho các danh sách đạn cố gắng để tìm kiếm các đường đạn và tham gia tiếp theo không làm việc cho một vài lý do ... nó có thể tham gia vào một đường đạn khác, và nó sẽ không tham gia bất kỳ dòng đạn để tất cả các sự tiếp nối của nó, nó sẽ chỉ hoạt động theo cặp trên các trận đấu).

Hầu như không cần đề cập đến bạn có thể sử dụng người bạn cũ s(thay thế) của chúng tôi với các lệnh gv(toàn cầu / converse-global). Thông thường bạn không cần phải làm như vậy. Tuy nhiên, hãy xem xét một số trường hợp bạn chỉ muốn thực hiện thay thế trên các dòng khớp với một số mẫu khác. Thường thì bạn có thể sử dụng một mẫu phức tạp với các ảnh chụp và sử dụng các tham chiếu trở lại để giữ các phần của các dòng mà bạn không muốn thay đổi. Tuy nhiên, thường sẽ dễ dàng hơn để tách trận đấu khỏi sự thay thế: :% g/foo/s/bar/zzz/g- cho mỗi dòng có chứa "foo" thay thế tất cả "thanh" bằng "zzz". (Cái gì đó như:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/gsẽ chỉ hoạt động đối với các trường hợp "bar" được PRECEDED bởi "foo" trên cùng một dòng; nó đã quá vô duyên rồi, và sẽ phải đọc thêm để nắm bắt tất cả các trường hợp "thanh" trước "foo")

Vấn đề là có nhiều hơn chỉ là p, sddòng trong exbộ lệnh.

Các :địa chỉ cũng có thể tham khảo nhãn hiệu. Do đó, bạn có thể sử dụng: :'a,'bg/foo/jđể nối bất kỳ dòng nào chứa chuỗi foo đến dòng tiếp theo của nó, nếu nó nằm giữa các dòng giữa các dấu ' a ' và ' b '. (Có, tất cả các exví dụ lệnh trước có thể được giới hạn ở các tập hợp con của dòng tệp bằng cách thêm tiền tố với các loại biểu thức địa chỉ này).

Điều đó khá mơ hồ (Tôi chỉ sử dụng một vài thứ như thế một vài lần trong 15 năm qua). Tuy nhiên, tôi sẽ tự do thừa nhận rằng tôi thường làm mọi việc lặp đi lặp lại và tương tác mà có lẽ có thể được thực hiện hiệu quả hơn nếu tôi dành thời gian để nghĩ ra câu thần chú chính xác.

Một lệnh vi hoặc ex rất hữu ích khác là :rđọc nội dung của tệp khác. Do đó: :r foochèn nội dung của tệp có tên "foo" vào dòng hiện tại.

Mạnh mẽ hơn là :r!mệnh lệnh. Điều này đọc kết quả của một lệnh. Nó giống như tạm dừng phiên vi , chạy lệnh, chuyển hướng đầu ra của nó sang tệp tạm thời, tiếp tục phiên vi của bạn và đọc nội dung từ temp. tập tin.

Mạnh hơn nữa là các lệnh !(bang) và :... !( ex bang). Chúng cũng thực hiện các lệnh bên ngoài và đọc kết quả vào văn bản hiện tại. Tuy nhiên, họ cũng lọc các lựa chọn văn bản của chúng tôi thông qua lệnh! Điều này chúng ta có thể sắp xếp tất cả các dòng trong tệp của mình bằng cách sử dụng 1G!Gsort( Glà lệnh vi "goto"; nó mặc định đi đến dòng cuối cùng của tệp, nhưng có thể được thêm tiền tố bởi một số dòng, chẳng hạn như 1, dòng đầu tiên). Điều này tương đương với biến thể :1,$!sort . Nhà văn thường sử dụng !với các tiện ích fmt hoặc gấp của Unix để cải cách hoặc lựa chọn văn bản "gói từ". Một macro rất phổ biến là{!}fmt(định dạng lại đoạn hiện tại). Các lập trình viên đôi khi sử dụng nó để chạy mã của họ, hoặc chỉ một phần của nó, thông qua thụt lề hoặc các công cụ định dạng lại mã khác.

Sử dụng các lệnh :r!!có nghĩa là bất kỳ tiện ích hoặc bộ lọc bên ngoài nào cũng có thể được coi là một phần mở rộng của trình soạn thảo của chúng tôi. Thỉnh thoảng tôi đã sử dụng chúng với các tập lệnh lấy dữ liệu từ cơ sở dữ liệu hoặc với các lệnh wget hoặc lynx đã kéo dữ liệu khỏi trang web hoặc các lệnh ssh lấy dữ liệu từ các hệ thống từ xa.

Một lệnh ex hữu ích khác là :so(viết tắt của :source). Điều này đọc nội dung của một tập tin như một chuỗi các lệnh. Khi bạn khởi động vi nó một cách bình thường, ngầm, thực hiện một tệp :sourcetrên ~/.exinitrc(và Vim thường làm điều này trên ~/.vimrc, đủ tự nhiên). Việc sử dụng này là bạn có thể thay đổi hồ sơ trình soạn thảo của mình một cách đơn giản bằng cách tìm nguồn cung ứng trong một tập hợp các macro, chữ viết tắt và cài đặt trình soạn thảo mới. Nếu bạn lén lút, bạn thậm chí có thể sử dụng điều này như một mẹo để lưu trữ các chuỗi lệnh chỉnh sửa để áp dụng cho các tệp theo yêu cầu.

Ví dụ: tôi có một tệp bảy dòng (36 ký tự) chạy tệp qua wc và chèn một nhận xét kiểu C ở đầu tệp chứa dữ liệu đếm từ đó. Tôi có thể áp dụng "macro" đó cho một tệp bằng cách sử dụng một lệnh như:vim +'so mymacro.ex' ./mytarget

( +Tùy chọn dòng lệnh cho viVim thường được sử dụng để bắt đầu phiên chỉnh sửa tại một số dòng nhất định. Tuy nhiên, có một thực tế ít người biết là có thể theo +bất kỳ lệnh / biểu thức ex hợp lệ nào , chẳng hạn như lệnh "nguồn" như Tôi đã thực hiện ở đây, với một ví dụ đơn giản, tôi có các tập lệnh gọi: vi +'/foo/d|wq!' ~/.ssh/known_hostsđể xóa một mục khỏi tệp lưu trữ SSH đã biết của tôi không tương tác trong khi tôi đang tạo lại một bộ máy chủ).

Thông thường việc viết "macro" như vậy dễ dàng hơn nhiều khi sử dụng Perl, AWK, sed (trên thực tế, giống như grep một tiện ích được lấy cảm hứng từ lệnh ed ).

Các @lệnh có lẽ là mơ hồ nhất vi lệnh. Thỉnh thoảng giảng dạy các khóa quản trị hệ thống nâng cao trong gần một thập kỷ, tôi đã gặp rất ít người đã từng sử dụng nó. @thực thi nội dung của một thanh ghi như thể đó là lệnh vi hoặc ex .
Ví dụ: Tôi thường sử dụng: :r!locate ...để tìm một số tệp trên hệ thống của mình và đọc tên của nó vào tài liệu của tôi. Từ đó tôi xóa mọi lượt truy cập không liên quan, chỉ để lại toàn bộ đường dẫn đến tệp mà tôi quan tâm. Thay vì tốn nhiều công sức Tabqua từng thành phần của đường dẫn (hoặc tệ hơn, nếu tôi tình cờ bị kẹt trên máy mà không hỗ trợ hoàn thành Tab trong bản sao của vi ) Tôi chỉ sử dụng:

  1. 0i:r(để biến dòng hiện tại thành một lệnh hợp lệ : r ),
  2. "cdd (để xóa dòng vào thanh ghi "c") và
  3. @c thực hiện lệnh đó.

Đó chỉ là 10 lần nhấn phím (và biểu thức thực sự "cdd @clà một macro ngón tay đối với tôi, vì vậy tôi có thể gõ nó gần như nhanh như bất kỳ từ sáu chữ cái thông thường nào).


Một suy nghĩ tỉnh táo

Tôi mới chỉ tìm hiểu về sức mạnh của vi và không có gì tôi mô tả ở đây thậm chí là một phần của "cải tiến" mà vim được đặt tên! Tất cả những gì tôi đã mô tả ở đây sẽ hoạt động trên mọi bản sao cũ của vi từ 20 hoặc 30 năm trước.

Có những người đã sử dụng sức mạnh của vi nhiều hơn đáng kể so với tôi.


440
Khỉ mã thần thánh, .. đó là một câu trả lời sâu sắc. Điều tuyệt vời là có lẽ bạn đã viết bằng vim trong khoảng 10 lần nhấn phím.
EightyOne Đoàn kết

48
@Wahnfieden - Grok chính xác là những gì tôi muốn nói: en.wikipedia.org/wiki/Grok (Rõ ràng là ngay cả trong OED --- lần gần nhất chúng ta có anglophones phải có từ vựng chính tắc). Để "mò mẫm" một biên tập viên là tìm cho mình cách sử dụng các lệnh của nó một cách trôi chảy ... như thể chúng là ngôn ngữ tự nhiên của bạn.
Jim Dennis

22
wow, một câu trả lời bằng văn bản rất tốt! Tôi không thể đồng ý nhiều hơn, mặc dù tôi sử dụng @lệnh rất nhiều (kết hợp với q: macro ghi)
knittl

63
Câu trả lời tuyệt vời mà hoàn toàn làm lại một câu hỏi thực sự khủng khiếp. Tôi sẽ nâng cao câu hỏi này, rằng thông thường tôi sẽ downvote, chỉ để câu trả lời này trở nên dễ tìm hơn. (Và tôi là một người Emacs! Nhưng bằng cách này, tôi sẽ có một nơi nào đó để chỉ ra những người mới muốn giải thích tốt về những gì người dùng quyền lực tìm thấy niềm vui về vi. Sau đó, tôi sẽ nói với họ về Emacs và họ có thể quyết định.)
Brandon Rhodes

8
Bạn có thể tạo một trang web và đặt hướng dẫn này ở đó không, vì vậy nó không bị chôn vùi ở đây trên stackoverflow. Tôi chưa đọc giới thiệu tốt hơn về vi rồi này.
Marko

504

Bạn đang nói về việc chọn và sao chép văn bản, tôi nghĩ rằng bạn nên xem qua Chế độ trực quan Vim .

Trong chế độ trực quan, bạn có thể chọn văn bản bằng các lệnh Vim, sau đó bạn có thể làm bất cứ điều gì bạn muốn với lựa chọn.

Hãy xem xét các tình huống phổ biến sau:

Bạn cần chọn dấu ngoặc đơn phù hợp tiếp theo.

Bạn có thể làm:

  • v% nếu con trỏ ở trên dấu ngoặc đơn bắt đầu / kết thúc
  • vib nếu con trỏ ở trong khối ngoặc đơn

Bạn muốn chọn văn bản giữa các trích dẫn:

  • vi " cho dấu ngoặc kép
  • vi ' cho dấu ngoặc đơn

Bạn muốn chọn một khối dấu ngoặc nhọn (rất phổ biến trên các ngôn ngữ kiểu C):

  • viB
  • vi{

Bạn muốn chọn toàn bộ tập tin:

  • ggVG

Lựa chọn khối trực quan là một tính năng thực sự hữu ích khác, nó cho phép bạn chọn một vùng văn bản hình chữ nhật, bạn chỉ cần nhấn Ctrl- Vđể bắt đầu, sau đó chọn khối văn bản bạn muốn và thực hiện bất kỳ loại thao tác nào như yank, xóa, dán, chỉnh sửa, vv Thật tuyệt khi chỉnh sửa văn bản theo định hướng cột .


2
Mọi biên tập viên đều có cái gì đó như thế này, nó không cụ thể cho vim.
Finnw

22
Có, nhưng đó là một khiếu nại cụ thể của người đăng. Chế độ trực quan là phương pháp tốt nhất để lựa chọn và thao tác văn bản trực tiếp của Vim. Và vì các phương thức truyền tải bộ đệm của vim là tuyệt vời, tôi thấy lựa chọn văn bản trong vim khá dễ chịu.
súng

9
Tôi nghĩ rằng cũng đáng để đề cập đến Ctrl-V để chọn một khối - tức là một hình chữ nhật tùy ý của văn bản. Khi bạn cần nó là một cứu cánh.
Hamish Downer

6
@viksit: Tôi đang sử dụng Camtasia, nhưng có rất nhiều lựa chọn thay thế: codinghorror.com/blog/2006/11/screencasting-for-windows.html
CMS

3
Ngoài ra, nếu bạn có một lựa chọn trực quan và muốn điều chỉnh nó, osẽ chuyển sang đầu kia. Vì vậy, bạn có thể di chuyển cả đầu và cuối của lựa chọn bao nhiêu tùy thích.
Nathan Long

207

Một số mẹo năng suất:

Chuyển động thông minh

  • *#tìm kiếm từ dưới con trỏ tiến / lùi.
  • w đến từ tiếp theo
  • W đến từ được phân tách bằng dấu cách
  • b/ eđến đầu / cuối của từ hiện tại. ( B/ chỉ Edành cho không gian riêng biệt)
  • gg/ Gnhảy đến đầu / cuối tập tin.
  • % chuyển đến kết hợp {..} hoặc (..), v.v.
  • {/ }nhảy sang đoạn tiếp theo.
  • '. nhảy trở lại dòng chỉnh sửa cuối cùng.
  • g; nhảy trở lại vị trí chỉnh sửa cuối cùng

Lệnh chỉnh sửa nhanh

  • I chèn vào lúc bắt đầu.
  • A nối để kết thúc
  • o/ Omở một dòng mới sau / trước hiện tại.
  • v/ V/ Ctrl+Vchế độ trực quan (để chọn văn bản!)
  • Shift+R thay thế văn bản
  • C thay đổi phần còn lại của dòng.

Kết hợp các lệnh

Hầu hết các lệnh chấp nhận một số lượng và hướng, ví dụ:

  • cW = thay đổi cho đến hết từ
  • 3cW = thay đổi 3 từ
  • BcW = để bắt đầu từ đầy đủ, thay đổi từ đầy đủ
  • ciW = thay đổi từ bên trong.
  • ci" = thay đổi bên trong giữa ".."
  • ci( = thay đổi văn bản giữa (..)
  • ci<= thay đổi văn bản giữa <..> (cần set matchpairs+=<:>trong vimrc)
  • 4dd = xóa 4 dòng
  • 3x = xóa 3 ký tự.
  • 3s = thay 3 ký tự.

Các lệnh lập trình hữu ích

  • rthay thế một ký tự (ví dụ rdthay thế char hiện tại bằng d).
  • ~ thay đổi trường hợp.
  • J nối hai dòng
  • Ctrl + A / Ctrl + X tăng / giảm số.
  • . lặp lại lệnh cuối cùng (một macro đơn giản)
  • == sửa lỗi thụt dòng
  • > khối thụt lề (trong chế độ trực quan)
  • < khối không liên kết (trong chế độ trực quan)

Ghi macro

  • Nhấn q[ key ]để bắt đầu ghi âm.
  • Sau đó nhấn qđể dừng ghi âm.
  • Macro có thể được chơi với @[ key ].

Bằng cách sử dụng các lệnh và chuyển động rất cụ thể, VIM có thể phát lại các hành động chính xác đó cho các dòng tiếp theo. (ví dụ: A để nối thêm, b/ eđể di chuyển con trỏ đến đầu hoặc cuối của từ tương ứng)

Ví dụ về cài đặt được xây dựng tốt

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

Các cài đặt có thể được lưu trữ trong ~/.vimrchoặc toàn hệ thống /etc/vimrc.localvà sau đó bằng cách đọc từ /etc/vimrctệp bằng cách sử dụng:

source /etc/vimrc.local

(bạn sẽ phải thay thế #ký tự nhận xét "để làm cho nó hoạt động trong VIM, tôi muốn đưa ra cú pháp tô sáng thích hợp ở đây).

Các lệnh tôi đã liệt kê ở đây khá cơ bản và các lệnh chính tôi sử dụng cho đến nay. Họ đã làm cho tôi khá năng suất hơn, mà không cần phải biết tất cả những thứ ưa thích.


4
Tốt hơn '.g;, mà nhảy trở lại thông qua changelist. Đi đến vị trí được chỉnh sửa cuối cùng, thay vì dòng được chỉnh sửa cuối cùng
naught101

98

Cơ chế Control+ Rrất hữu ích :-) Trong chế độ chèn hoặc chế độ lệnh (tức là trên :dòng khi gõ lệnh), tiếp tục với một thanh ghi được đánh số hoặc được đặt tên:

  • a- zcác thanh ghi có tên
  • " thanh ghi không tên, chứa văn bản của lần xóa hoặc yank cuối cùng
  • % tên tập tin hiện tại
  • # tên tệp thay thế
  • * nội dung clipboard (X11: lựa chọn chính)
  • + nội dung clipboard
  • / mẫu tìm kiếm cuối cùng
  • : dòng lệnh cuối cùng
  • . văn bản được chèn cuối cùng
  • - xóa nhỏ cuối cùng (ít hơn một dòng)
  • =5*5 chèn 25 vào văn bản (máy tính mini)

Xem :help i_CTRL-R:help c_CTRL-Rđể biết thêm chi tiết, và rình mò xung quanh để biết thêm về lòng tốt CTRL-R.


10
FYI, điều này đề cập đến Ctrl + R trong chế độ chèn . Ở chế độ bình thường, Ctrl + R được làm lại.
vdboor

2
+1 cho tên tệp hiện tại / thay thế. Control-Acũng hoạt động ở chế độ chèn cho văn bản được chèn lần cuối và Control-@cả hai chèn văn bản được chèn cuối cùng và ngay lập tức chuyển sang chế độ bình thường.
Aryeh Leib Taurog

91

Plugin Vim

Có rất nhiều câu trả lời hay ở đây, và một câu trả lời tuyệt vời về zen của vi. Một điều tôi không thấy đề cập đến là vim cực kỳ mở rộng thông qua các plugin. Có các kịch bản và plugin để làm cho nó làm tất cả các loại điều điên rồ mà tác giả ban đầu không bao giờ xem xét. Dưới đây là một vài ví dụ về các plugin vim cực kỳ tiện dụng:

rails.vim

Rails.vim là một plugin được viết bởi tpope. Đó là một công cụ đáng kinh ngạc cho những người làm đường ray phát triển. Nó thực hiện những điều nhạy cảm theo ngữ cảnh cho phép bạn dễ dàng chuyển từ một phương thức trong bộ điều khiển sang chế độ xem liên quan, qua một mô hình và xuống các bài kiểm tra đơn vị cho mô hình đó. Nó đã tiết kiệm hàng chục nếu không phải là hàng trăm giờ như một nhà phát triển đường ray.

gist.vim

Plugin này cho phép bạn chọn một vùng văn bản ở chế độ trực quan và nhập lệnh nhanh để đăng nó lên gist.github.com . Điều này cho phép truy cập pastebin dễ dàng, cực kỳ tiện lợi nếu bạn cộng tác với ai đó qua IRC hoặc IM.

không gian.vim

Plugin này cung cấp chức năng đặc biệt cho phím cách. Nó biến phím cách thành một cái gì đó tương tự như thời kỳ, nhưng thay vì lặp lại các hành động, nó lặp lại các chuyển động. Điều này có thể rất thuận tiện cho việc di chuyển nhanh chóng thông qua một tệp theo cách bạn xác định nhanh chóng.

Surround.vim

Plugin này cung cấp cho bạn khả năng làm việc với văn bản được phân định trong một số thời trang. Nó cung cấp cho bạn các đối tượng biểu thị những thứ bên trong parens, những thứ bên trong dấu ngoặc kép, v.v ... Nó có thể có ích để thao tác với văn bản được phân tách.

supertab.vim

Kịch bản này mang lại chức năng hoàn thành tab ưa thích cho vim. Các công cụ tự động hoàn thành đã có sẵn trong cốt lõi của vim, nhưng điều này đưa nó đến một tab nhanh hơn là nhiều phím tắt đa dạng khác nhau. Rất tiện dụng, và cực kỳ thú vị để sử dụng. Mặc dù không phải là vấn đề của VS, nhưng đây là một bước tuyệt vời và mang lại rất nhiều chức năng mà bạn muốn mong đợi từ một công cụ hoàn thành tab.

cú pháp.vim

Công cụ này mang các lệnh kiểm tra cú pháp bên ngoài vào vim. Tôi đã không sử dụng nó cá nhân, nhưng tôi đã nghe những điều tuyệt vời về nó và khái niệm này rất khó để đánh bại. Kiểm tra cú pháp mà không phải thực hiện thủ công là một trình tiết kiệm thời gian tuyệt vời và có thể giúp bạn bắt lỗi cú pháp khi bạn giới thiệu chúng thay vì khi cuối cùng bạn dừng lại để kiểm tra.

fugitive.vim

Truy cập trực tiếp vào git từ bên trong vim. Một lần nữa, tôi đã không sử dụng plugin này, nhưng tôi có thể thấy tiện ích này. Thật không may, tôi đang ở trong một nền văn hóa nơi svn được coi là "mới", vì vậy tôi sẽ không thấy git tại nơi làm việc trong một thời gian dài.

nerdtree.vim

Một trình duyệt cây cho vim. Tôi đã bắt đầu sử dụng gần đây và nó thực sự tiện dụng. Nó cho phép bạn đặt một treeview trong một phân chia dọc và mở các tệp dễ dàng. Điều này rất tốt cho một dự án có nhiều tệp nguồn bạn thường xuyên nhảy vào giữa.

Fuzzy DownloaderTextmate.vim

Đây là một plugin không rõ ràng, nhưng vẫn vô cùng hữu ích. Nó cung cấp khả năng mở tệp bằng cú pháp mô tả "mờ". Điều đó có nghĩa là trong một cây tệp thưa thớt, bạn chỉ cần nhập đủ các ký tự để phân tán các tệp bạn quan tâm từ phần còn lại của hành trình.

Phần kết luận

Có rất nhiều công cụ đáng kinh ngạc có sẵn cho vim. Tôi chắc chắn rằng tôi chỉ bị trầy xước bề mặt ở đây và rất đáng để tìm kiếm các công cụ áp dụng cho tên miền của bạn. Sự kết hợp của bộ công cụ mạnh mẽ của vi truyền thống, các cải tiến của vim trên nó và các plugin mở rộng vim hơn nữa, đó là một trong những cách mạnh mẽ nhất để chỉnh sửa văn bản từng được hình thành. Vim dễ dàng mạnh mẽ như emacs, nhật thực, phòng thu trực quan và bạn cùng văn bản.

Cảm ơn

Cảm ơn duwanis cho các cấu hình vim của anh ấy từ đó tôi đã học được nhiều và mượn hầu hết các plugin được liệt kê ở đây.


Điều hướng ma thuật đến lớp trong rails.vim là một trong những điều tổng quát hơn mà tôi mong muốn Vim có TextMate hoàn toàn đóng đinh trên tất cả các ngôn ngữ: nếu tôi đang làm việc trên Person.scala và tôi làm Cmd + T, thường là điều đầu tiên trong danh sách là PersonTest.scala.
Tom Morris

5
Tôi nghĩ rằng đã đến lúc Fuzzy DownloaderTextmate bắt đầu được thay thế bằng github.com/wincent/Command-T
Gavin Gilmour

2
+1 cho Cú pháp. Điều đó, kết hợp với JSLint, đã làm cho Javascript của tôi ít bị lỗi hơn. Xem superuser.com/questions/247012/ trên về cách thiết lập JSLint để hoạt động với Syntastic.
Nathan Long

1
@Benson Danh sách tuyệt vời! Tôi cũng sẽ sử dụng snipMate . Tự động hóa rất hữu ích của các công cụ mã hóa phổ biến. if <tab> tức thì nếu chặn, v.v.
AlG

2
Tôi nghĩ nerdcommenter cũng là một plugin tốt: ở đây . Giống như tên của nó, nó là để bình luận mã của bạn.
Stephan

53

. Lặp lại lệnh thay đổi văn bản cuối cùng

Tôi tiết kiệm rất nhiều thời gian với cái này.

Chế độ trực quan đã được đề cập trước đây, nhưng chế độ hình ảnh khối đã giúp tôi tiết kiệm rất nhiều thời gian khi chỉnh sửa các cột có kích thước cố định trong tệp văn bản. (truy cập bằng Ctrl-V).


3
Ngoài ra, nếu bạn sử dụng lệnh ngắn gọn (ví dụ A cho phần phụ lục) để chỉnh sửa văn bản, vim có thể lặp lại hành động chính xác đó cho dòng tiếp theo bạn nhấn .phím tại.
vdboor

48

gi

Chuyển đến vị trí được chỉnh sửa lần cuối (rất hữu ích nếu bạn thực hiện một số tìm kiếm và muốn quay lại chỉnh sửa)

^ P và ^ N

Hoàn thành văn bản trước (^ P) hoặc tiếp theo (^ N).

^ O và ^ tôi

Đi đến vị trí trước ( ^O- "O"cho cũ) hoặc đến vị trí tiếp theo ( ^I- "I"chỉ gần "O"). Khi bạn thực hiện tìm kiếm, chỉnh sửa tệp, v.v., bạn có thể điều hướng qua các "bước nhảy" này về phía trước và quay lại.


4
@Kungi `. sẽ đưa bạn đến lần chỉnh sửa cuối cùng `` sẽ đưa bạn trở lại vị trí bạn đã ở trước lần 'nhảy' cuối cùng - mà / có thể / cũng là vị trí của lần chỉnh sửa cuối cùng.
Cấp cho McLean

46

Gần đây tôi (đã) phát hiện ra trang web này: http://vimcasts.org/

Nó khá mới và thực sự tốt. Anh chàng đang điều hành trang web đã chuyển từ textmate sang vim và lưu trữ các diễn viên rất hay và súc tích về các chủ đề vim cụ thể. Kiểm tra nó ra!


3
Nếu bạn thích hướng dẫn về vim, hãy xem video vim của Derek Wyatt . Họ thật xuất sắc.
Jeromy Anglim

42

CTRL+A tăng số lượng bạn đang đứng.


19
... và giảm CTRL-X.
innaM

9
Đó là một phím tắt gọn gàng nhưng cho đến nay tôi KHÔNG BAO GIỜ tìm thấy bất kỳ việc sử dụng nào cho nó.
SolutionYogi

8
nếu bạn chạy vim trên màn hình và tự hỏi tại sao điều này không hoạt động - ctrl + A, A
matja

13
@SolutionYogi: Hãy xem xét rằng bạn muốn thêm số dòng vào đầu mỗi dòng. Giải pháp: ggI1 <dấu cách> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42

10
Vô cùng hữu ích với Vimperator, nơi nó tăng (hoặc giảm, Ctrl-X) số cuối cùng trong URL. Hữu ích để lướt nhanh qua các phòng trưng bày hình ảnh, v.v.
blueyed

38

Tất cả ở chế độ Bình thường:

f <char> để chuyển sang phiên bản tiếp theo của một ký tự cụ thể trên dòng hiện tại và ; lặp lại.

F <char> để di chuyển đến phiên bản trước của một ký tự cụ thể trên dòng hiện tại và ; lặp lại.

Nếu được sử dụng một cách thông minh, hai thứ trên có thể khiến bạn trở thành kẻ giết người nhanh chóng di chuyển trong một hàng.

* trên một từ để tìm kiếm ví dụ tiếp theo.

# trên một từ để tìm kiếm ví dụ trước.


6
Whoa, tôi không biết về ràng buộc * và # (tìm kiếm tiến / lùi cho từ dưới con trỏ). Điều đó thật tuyệt. F / F và t / T và; lệnh là nhảy nhanh đến các ký tự trên dòng hiện tại. f / F đặt con trỏ vào ký tự được chỉ định trong khi t / T đặt nó chỉ "lên" ký tự (ký tự ngay trước hoặc sau nó theo hướng đã chọn. Đơn giản chỉ cần lặp lại f / F / t / T gần đây nhất nhảy (cùng hướng).
Jim Dennis

10
:) Khẩu hiệu ở đầu trang mẹo tại vim.org: "Bạn có thể tưởng tượng có bao nhiêu lần nhấn phím có thể được lưu không, nếu tôi chỉ biết lệnh" * "kịp thời?" - Juergen Salk, 1/19/2001 "
Yewge

1
Như Jim đã đề cập, combo "t / T" thường tốt như vậy, nếu không tốt hơn, chẳng hạn, ct(sẽ xóa từ đó và đưa bạn vào chế độ chèn, nhưng vẫn giữ nguyên các dấu hiệu!
puk

34

Phiên

a. lưu phiên

: mks sessionname

b. buộc tiết kiệm phiên

: mks! tên phiên

c. phiên tải

gvim hoặc vim -S tên phiên


Cộng và trừ

a. Cộng và trừ

CTRL-A; Thêm [đếm] vào số hoặc ký tự chữ cái ở hoặc sau con trỏ. {không ở Vi

CTRL-X; Trừ [đếm] từ số hoặc ký tự chữ cái ở hoặc sau con trỏ. {không ở Vi}

b. Bỏ khóa cửa sổ

Trong cửa sổ, Ctrl-A đã được ánh xạ cho toàn bộ lựa chọn tệp mà bạn cần hủy ánh xạ trong tệp RC. đánh dấu mswin.vim CTRL-Một phần ánh xạ là nhận xét hoặc thêm tệp RC của bạn bằng unmap

c. Với Macro

Lệnh CTRL-A rất hữu ích trong macro. Ví dụ: Sử dụng các bước sau để tạo danh sách đánh số.

  1. Tạo mục nhập danh sách đầu tiên, đảm bảo nó bắt đầu bằng một số.
  2. qa - bắt đầu ghi vào bộ đệm 'a'
  3. Y - yank mục
  4. p - đặt một bản sao của mục bên dưới cái đầu tiên
  5. CTRL-A - tăng số
  6. q - dừng ghi âm
  7. @a - lặp lại yank, đặt và tăng thời gian

1
Bất kỳ ý tưởng những gì các phím tắt trong Windows?
Don Reba

32

Tuần trước tại nơi làm việc, dự án của chúng tôi đã thừa hưởng rất nhiều mã Python từ một dự án khác. Thật không may, mã không phù hợp với kiến ​​trúc hiện tại của chúng tôi - tất cả được thực hiện với các biến và hàm toàn cầu, không hoạt động trong môi trường đa luồng.

Chúng tôi có ~ 80 tệp cần được làm lại để hướng đối tượng - tất cả các hàm được chuyển vào các lớp, thay đổi tham số, nhập câu lệnh, v.v. Chúng tôi có một danh sách khoảng 20 loại sửa lỗi cần thực hiện cho mỗi tệp. Tôi sẽ ước tính rằng làm điều đó bằng tay một người có thể làm có thể 2-4 mỗi ngày.

Vì vậy, tôi đã làm điều đầu tiên bằng tay và sau đó viết một kịch bản vim để tự động hóa các thay đổi. Hầu hết đó là danh sách các lệnh vim, vd

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

Điều cuối cùng xứng đáng một chút giải thích:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

Đối với một vài biến đổi phức tạp hơn như tạo tất cả các câu lệnh nhập tôi đã nhúng một số python vào tập lệnh vim.

Sau vài giờ làm việc với nó, tôi đã có một kịch bản sẽ thực hiện ít nhất 95% chuyển đổi. Tôi chỉ cần mở một tập tin trong vim sau đó chạy :source fixit.vimvà tập tin được chuyển đổi trong nháy mắt.

Chúng tôi vẫn có công việc thay đổi 5% còn lại không đáng để tự động hóa và kiểm tra kết quả, nhưng bằng cách dành một ngày để viết kịch bản này, tôi ước tính chúng tôi đã tiết kiệm được nhiều tuần làm việc.

Tất nhiên, có thể tự động hóa điều này bằng ngôn ngữ kịch bản như Python hoặc Ruby, nhưng sẽ mất nhiều thời gian hơn để viết và sẽ kém linh hoạt hơn - ví dụ cuối cùng sẽ khó khăn vì một mình regex sẽ không thể xử lý ngoặc lồng nhau, ví dụ để chuyển đổi bar(foo(xxx))sang foo(xxx).bar(). Vim là hoàn hảo cho nhiệm vụ.


1
Cảm ơn rất nhiều vì đã chia sẻ điều đó thật tuyệt khi học hỏi từ các macro "hữu ích & không cổ điển".
Olivier Pons

%s/\(bar\)(\(.\+\))/\2.\1()/cũng sẽ làm điều đó (Escapes tương thích với :set magic.) Chỉ dành cho hồ sơ. :)
Ipsquiggle 23/03

1
Nếu bạn không thích lối thoát theo kiểu vim, hãy sử dụng \ v để bật Very Magic:%s/\v(bar)\((.+)\)/\2.\1()/
Ipsquiggle

@lpsquiggle: đề xuất của bạn sẽ không xử lý các biểu thức phức tạp với nhiều hơn một bộ dấu ngoặc. ví dụ như if bar(foo(xxx)) or wibble(xxx): trở thành if foo(xxx)) or wibble(xxx.bar(): hoàn toàn sai.
Dave Kirby

28

Sử dụng trình thám hiểm tệp dựng sẵn! Lệnh này :Explorevà nó cho phép bạn điều hướng qua mã nguồn của mình rất nhanh. Tôi có các ánh xạ này trong .vimrc:

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

Trình thám hiểm cho phép bạn thực hiện sửa đổi tập tin, quá. Tôi sẽ đăng một số phím yêu thích của tôi, nhấn <F1>sẽ cung cấp cho bạn danh sách đầy đủ:

  • - : Hữu ích nhất: Thay đổi thư mục trên ( cd ..)
  • mf : Đánh dấu một tập tin
  • D : Xóa các tệp được đánh dấu hoặc tệp con trỏ đang bật, nếu không có gì được đánh dấu.
  • R : Đổi tên tập tin con trỏ đang bật.
  • d : Tạo một thư mục mới trong thư mục hiện tại
  • % : Tạo một tệp mới trong thư mục hiện tại

1
Tôi luôn nghĩ rằng các phương thức mặc định để duyệt tìm hầu hết mọi thứ. Nó chỉ chậm để duyệt, nếu bạn biết bạn muốn đi đâu. LustyExplorer từ phần kịch bản của vim.org là một cải tiến rất cần thiết.
Svend

Bản đồ thứ hai của bạn có thể đơn giản hơn: bản đồ <im lặng> <S-F8>: Sexplore <CR>
Taurus Olson

8
Tôi khuyên dùng NERDtree thay vì explorer tích hợp. Nó đã thay đổi cách tôi sử dụng vim cho các dự án và giúp tôi làm việc hiệu quả hơn nhiều. Chỉ cần google cho nó.
kprobst

Tôi chưa bao giờ cảm thấy cần phải khám phá những cây nguồn, tôi chỉ sử dụng :find, :tagvà các tổ hợp phím có liên quan khác nhau để nhảy xung quanh. (Có lẽ điều này là do các cây nguồn mà tôi làm việc rất lớn và được tổ chức khác với những gì tôi đã làm? :))
dash-tom-bang

25

Tôi là thành viên của Hiệp hội Mật mã Hoa Kỳ. Tạp chí hai tháng một lần bao gồm hơn 100 loại mật mã khác nhau. Khoảng 15 trong số này là "tiền điện tử" - nhiều loại vấn đề số học khác nhau với các chữ cái được thay thế cho các chữ số. Hai hoặc ba trong số này là sudokus, ngoại trừ với các chữ cái thay vì số. Khi lưới được hoàn thành, chín chữ cái riêng biệt sẽ đánh vần một từ hoặc từ, trên một số dòng, đường chéo, xoắn ốc, vv, ở đâu đó trong lưới.

Thay vì làm việc với bút chì, hoặc gõ các vấn đề bằng tay, tôi tải xuống các vấn đề từ khu vực thành viên trên trang web của họ.

Khi làm việc với các sudokus này, tôi sử dụng vi, đơn giản vì tôi đang sử dụng các cơ sở mà vi có ít biên tập viên khác có. Chủ yếu là trong việc chuyển đổi lưới chữ thành lưới được đánh số, bởi vì tôi thấy việc giải quyết dễ dàng hơn, và sau đó lưới được đánh số hoàn thành trở lại lưới chữ để tìm từ hoặc từ giải pháp.

Vấn đề được định dạng là chín nhóm chín chữ cái, với - s đại diện cho các khoảng trống, được viết bằng hai dòng. Bước đầu tiên là định dạng chúng thành chín dòng chín ký tự mỗi dòng. Không có gì đặc biệt về điều này, chỉ cần chèn tám ngắt dòng ở những nơi thích hợp.

Kết quả sẽ như thế này:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

Vì vậy, bước đầu tiên trong việc chuyển đổi này thành số là tạo một danh sách các chữ cái riêng biệt. Đầu tiên, tôi tạo một bản sao của khối. Tôi định vị con trỏ ở đầu khối, sau đó gõ :y}}p. :đưa tôi vào chế độ lệnh, đưa yra lệnh di chuyển tiếp theo. Vì }là một di chuyển đến cuối đoạn tiếp theo, hãy kéo dài y}đoạn văn. }sau đó di chuyển con trỏ đến cuối đoạn văn và pdán những gì chúng ta đã kéo dài ngay sau con trỏ. Vì thếy}}p tạo một bản sao của đoạn tiếp theo và kết thúc bằng con trỏ giữa hai bản sao.

Tiếp theo, tôi biến một trong những bản sao đó thành một danh sách các chữ cái riêng biệt. Lệnh đó phức tạp hơn một chút:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:một lần nữa đặt tôi trong chế độ lệnh. !chỉ ra rằng nội dung của yank tiếp theo nên được dẫn qua một dòng lệnh. }kéo theo đoạn tiếp theo và dòng lệnh sau đó sử dụng trlệnh để loại bỏ mọi thứ trừ các chữ cái in hoa, sedlệnh in từng chữ cái trên một dòng và sortlệnh để sắp xếp các dòng đó, loại bỏ các bản sao và sau đó trloại bỏ các dòng mới, để lại chín chữ cái riêng biệt trong một dòng, thay thế chín dòng đã tạo thành đoạn ban đầu. Trong trường hợp này, các chữ cái là:ACELNOPST .

Bước tiếp theo là tạo một bản sao khác của lưới. Và sau đó sử dụng các chữ cái tôi vừa xác định để thay thế từng chữ cái đó bằng một chữ số từ 1 đến 9. Điều đó thật đơn giản : :!}tr ACELNOPST 0-9. Kết quả là:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

Điều này sau đó có thể được giải quyết theo cách thông thường, hoặc nhập vào bất kỳ người giải sudoku nào bạn có thể thích. Các giải pháp hoàn thành sau đó có thể được chuyển đổi trở lại thành các chữ cái với:!}tr 1-9 ACELNOPST .

Có sức mạnh trong vi được kết hợp bởi rất ít người khác. Vấn đề lớn nhất là chỉ có rất ít sách hướng dẫn vi, trang web, tệp trợ giúp, v.v., làm nhiều hơn là hầu như không chạm vào bề mặt của những gì có thể.


và một điều khó chịu là một số distro như ubfox có các bí danh từ "vi" đến "vim" để mọi người thực sự không thấy vi. Ví dụ tuyệt vời, phải thử ... +1
hhh

1
Không vim kiểm tra tên mà nó đã được bắt đầu để nó có thể xuất hiện ở 'chế độ' đúng không?
dash-tom-bang

3
Tôi gặp khó khăn bởi lỗi lặp đi lặp lại này: bạn nói rằng bạn cần :vào chế độ lệnh, nhưng sau đó bạn luôn chỉ định các lệnh chế độ bình thường (như y}}p) không thể hoạt động từ chế độ lệnh?!
sehe

Tôi chấp nhận thử thách ký tự độc đáo: :se tw=1 fo=(chuẩn bị) VG:s/./& /g(chèn khoảng trắng), gvgq(tách thành các dòng riêng biệt), V{:sort u(sắp xếp và loại bỏ trùng lặp)
sehe

23

Thao tác văn bản số lượng lớn!

Hoặc thông qua các macro:

  • Bắt đầu với ghi âm: qq
  • Làm công cụ
  • Dừng ghi âm: q
  • Lặp lại: @q(lần đầu tiên),@@ sau đó.
  • Lặp lại 20 lần: 20@@

Hoặc thông qua các biểu thức thông thường:

  • Thay thế công cụ: :%s/[fo]+/bar/g

(Nhưng được cảnh báo: nếu bạn làm sau, bạn sẽ gặp 2 vấn đề :).)


5
+1 cho tài liệu tham khảo Jamie Zawinski . (Không có điểm nào bị lấy lại do không liên kết với nó, thậm chí). :)
Jim Dennis

1
@Jim Tôi thậm chí không biết đó là một trích dẫn của Jamie Zawinski :). Tôi sẽ cố nhớ nó từ bây giờ.
jqno

Tôi thấy thủ thuật sau ngày càng hữu ích ... đối với trường hợp bạn muốn nối các dòng khớp (hoặc không khớp) một số mẫu với dòng trước: :% g/foo/-1jhoặc :'a,'z v/bar/-1jví dụ (trong đó trước đây là "tất cả các dòng và khớp với mẫu" trong khi cái sau là "các đường giữa dấu a và dấu z không khớp với mẫu"). Phần sau patter trong lệnh ex ghoặc vex có thể là bất kỳ commmands ex nào khác, -1j chỉ là một chuyển động dòng tương đối và lệnh nối.
Jim Dennis

tất nhiên, nếu bạn đặt tên cho macro của mình là '2', thì khi đến lúc sử dụng nó, bạn thậm chí không phải di chuyển ngón tay của mình từ phím '@' sang phím 'q'. Có thể tiết kiệm 50 đến 100 mili giây mỗi lần ngay tại đó. = P
JustJeff

@JustJeff Phụ thuộc hoàn toàn vào bố cục bàn phím của bạn, phím @ của tôi nằm ở phía bên kia của bàn phím từ phím 2 của tôi.
Simon Steele

23

Tôi mới phát hiện ra q:. Nó mở "cửa sổ lệnh" và hiển thị các lệnh ex-mode (chế độ lệnh) gần đây nhất của bạn. Bạn có thể di chuyển như bình thường trong cửa sổ và nhấn <CR>thực thi lệnh. Bạn có thể chỉnh sửa, vv quá. Vô giá khi bạn đang loay hoay với một số lệnh hoặc regex phức tạp và bạn không muốn gõ lại toàn bộ, hoặc nếu điều phức tạp bạn muốn làm là 3 lệnh trở lại. Nó gần giống như bashset -o vi , nhưng đối với chính vim (heh!).

Xem :help q:để biết thêm các bit thú vị để quay trở lại.


22

Tôi mới phát hiện ra omnicompletion của Vim vào một ngày khác, và trong khi tôi thừa nhận tôi hơi mơ hồ về những gì nó làm, tôi đã có kết quả tốt đáng ngạc nhiên khi chỉ nghiền Ctrl+ x Ctrl+ uhoặc Ctrl+ n/ Ctrl+ ptrong chế độ chèn. Nó không hoàn toàn là IntelliSense , nhưng tôi vẫn đang học nó.

Hãy thử nó! :help ins-completion


20

Đây không phải là các phím tắt, nhưng chúng có liên quan:

  1. Tạo capslock thêm ESC (hoặc Ctrl)
  2. dẫn đầu bản đồ thành "," (dấu phẩy), với lệnh này: let mapleader = ","

Họ tăng năng suất của tôi.


Này gợi ý hay về "\"! Tốt hơn nhiều để gõ "," hơn "\".
Olivier Pons

2
Để làm cho Caps Lock một Esc bổ sung trong Windows (? Những gì một caps lock key cho An "phím bất kỳ"), hãy thử này: web.archive.org/web/20100418005858/http://webpages.charter.net/...
R. Martinho Fernandes

Trên Mac, bạn cần PCPalHack - chi tiết tại superuser.com/questions/34223/ trên
Tom Morris

1
Trên Windows, tôi sử dụng AutoHotKey vớiCapslock::Escape
Jeromy Anglim

19

Một "phím tắt" vi hữu ích khác mà tôi thường sử dụng là 'xp'. Điều này sẽ trao đổi ký tự dưới con trỏ với ký tự tiếp theo.


3
Xpđi theo con đường khác
người kiểm tra

5
Trong khoảng thời gian Windows xp ra mắt, tôi thường nói đùa rằng đây là cách sử dụng tốt duy nhất cho nó.
kguest

18

<Ctrl> + W, V để chia màn hình theo chiều dọc
<Ctrl> + W, W để dịch chuyển giữa các cửa sổ

! python% [args] để chạy tập lệnh tôi đang chỉnh sửa trong cửa sổ này

ZF trong chế độ trực quan để gấp các đường tùy ý


2
<Ctrl> + W và j / k sẽ cho phép bạn điều hướng hoàn toàn (j lên, k xuống, như với vim bình thường). Điều này thật tuyệt khi bạn có hơn 3 lần chia tách.
Andrew Scagnelli

1
+1 cho zf ở chế độ trực quan, tôi thích gấp mã, nhưng không biết về điều đó.
coder_tim

2
Sau khi bash bàn phím của tôi, tôi đã suy luận rằng <C-w>nhoặc <C-w>slà cửa sổ ngang mới, cửa sổ <C-w>bdưới cùng bên phải, <C-w>choặc <C-w>qlà cửa sổ đóng, <C-w>xlà tăng và sau đó giảm chiều rộng cửa sổ (??), <C-w>plà cửa sổ cuối cùng, <C-w>backspacelà di chuyển sang trái (ish) cửa sổ
puk

:help ctrl-wFTW ... hãy tự giúp mình và ép bản thân thử những thứ này trong ít nhất 15 phút!
sjas

18

Chế độ trực quan

Như một số người khác đã nói, chế độ trực quan là câu trả lời cho vấn đề sao chép / cắt và dán của bạn. Vim cung cấp cho bạn 'v', 'V' và Cv. Chữ thường 'v' trong vim về cơ bản giống như phím shift trong notepad. Điều tốt đẹp là bạn không cần phải giữ nó xuống. Bạn có thể sử dụng bất kỳ kỹ thuật di chuyển nào để điều hướng hiệu quả đến điểm bắt đầu (hoặc kết thúc) của lựa chọn của bạn. Sau đó nhấn 'v' và sử dụng lại các kỹ thuật di chuyển hiệu quả để điều hướng đến đầu kia của lựa chọn của bạn. Sau đó, 'd' hoặc 'y' cho phép bạn cắt hoặc sao chép lựa chọn đó.

Chế độ trực quan của vim có lợi thế hơn mô tả cắt / sao chép / dán của Jim Dennis trong vi là bạn không cần phải xác định chính xác vị trí. Đôi khi, hiệu quả hơn là sử dụng một chuyển động nhanh để đến vùng lân cận chung của nơi bạn muốn đến và sau đó tinh chỉnh điều đó bằng các chuyển động khác hơn là nghĩ ra một lệnh di chuyển đơn phức tạp hơn giúp bạn đi chính xác nơi bạn muốn đến.

Nhược điểm của việc sử dụng chế độ trực quan rộng rãi theo cách này là nó có thể trở thành một cái nạng mà bạn sử dụng mọi lúc để ngăn bạn học các lệnh vi (m) mới có thể cho phép bạn thực hiện mọi việc hiệu quả hơn. Tuy nhiên, nếu bạn rất chủ động về việc học các khía cạnh mới của vi (m), thì điều này có lẽ sẽ không ảnh hưởng nhiều đến bạn.

Tôi cũng sẽ nhấn mạnh lại rằng các chế độ khối hình ảnh và khối trực quan cung cấp cho bạn các biến thể trong cùng một chủ đề có thể rất mạnh mẽ ... đặc biệt là chế độ khối hình ảnh.

Sử dụng hiệu quả bàn phím

Tôi cũng không đồng ý với khẳng định của bạn rằng bàn tay thay thế là cách nhanh nhất để sử dụng bàn phím. Nó có một yếu tố của sự thật trong đó. Nói rất chung chung, việc sử dụng lặp đi lặp lại cùng một điều là chậm. Ví dụ quan trọng nhất của nguyên tắc này là các tổ hợp phím liên tiếp được gõ bằng cùng một ngón tay rất chậm. Khẳng định của bạn có lẽ bắt nguồn từ xu hướng tự nhiên sử dụng s / finger / hand / biến đổi trên mẫu này. Ở một mức độ nào đó, điều đó đúng, nhưng ở mức cực kỳ cao của phổ hiệu quả thì không chính xác.

Chỉ cần hỏi bất kỳ nghệ sĩ piano. Hỏi họ xem có nhanh hơn khi chơi một vài nốt xen kẽ hai bàn tay hoặc sử dụng các ngón tay liên tiếp của một bàn tay theo trình tự. Cách nhanh nhất để gõ phím 4 không phải là thay thế bàn tay, mà là gõ chúng bằng 4 ngón tay của cùng một thứ tự theo thứ tự tăng dần hoặc giảm dần (gọi đây là "chạy"). Điều này nên được chứng minh một khi bạn đã xem xét khả năng này.

Vấn đề khó khăn hơn là tối ưu hóa cho điều này. Thật dễ dàng để tối ưu hóa cho khoảng cách tuyệt đối trên bàn phím. Vim làm điều đó. Việc tối ưu hóa ở cấp độ "chạy" khó hơn nhiều, nhưng vi (m) với tính năng chỉnh sửa phương thức của nó cho bạn cơ hội tốt hơn để có thể làm điều đó hơn bất kỳ phương pháp không theo phương thức nào (ahem, emacs) từng có thể.

Trên Emacs

Vì sợ những người quá khích hoàn toàn coi thường toàn bộ bài viết của tôi vì lý do bình luận mang tính cha mẹ cuối cùng đó, tôi cảm thấy mình phải mô tả gốc rễ của sự khác biệt giữa tôn giáo emacs và vim. Tôi chưa bao giờ lên tiếng trong các cuộc chiến biên tập và có lẽ tôi sẽ không làm điều đó một lần nữa, nhưng tôi chưa bao giờ nghe ai mô tả sự khác biệt theo cách này, vì vậy nó sẽ đi. Sự khác biệt là sự đánh đổi sau đây:

Vim mang đến cho bạn hiệu quả chỉnh sửa văn bản thô chưa từng có Emacs mang đến cho bạn khả năng vô song để tùy chỉnh và lập trình trình chỉnh sửa

Những người quá khích mù quáng sẽ cho rằng vim có ngôn ngữ kịch bản. Nhưng đó là một ngôn ngữ đặc biệt khó hiểu được thiết kế để phục vụ biên tập viên. Emacs có Lisp! Đủ nói. Nếu bạn không đánh giá cao tầm quan trọng của hai câu cuối hoặc có mong muốn tìm hiểu đủ về lập trình chức năng và Lisp để phát triển sự đánh giá cao đó, thì bạn nên sử dụng vim.

Những người quá khích của emacs sẽ cho rằng emacs có chế độ viper, và vì vậy nó là một superset của vim. Nhưng chế độ viper không chuẩn. Tôi hiểu rằng chế độ viper không được sử dụng bởi phần lớn người dùng emacs. Vì nó không phải là mặc định, hầu hết người dùng emacs có thể không phát triển sự đánh giá đúng về lợi ích của mô hình phương thức.

Theo tôi những khác biệt này là trực giao. Tôi tin rằng lợi ích của vim và emacs như tôi đã nêu chúng đều hợp lệ. Điều này có nghĩa là trình soạn thảo cuối cùng chưa tồn tại. Có lẽ đúng là emacs sẽ là nền tảng dễ nhất để dựa trên trình soạn thảo cuối cùng. Nhưng chỉnh sửa phương thức không cố thủ trong tư duy emacs. Cộng đồng emacs có thể di chuyển theo cách đó trong tương lai, nhưng điều đó dường như không có khả năng.

Vì vậy, nếu bạn muốn hiệu quả chỉnh sửa thô, hãy sử dụng vim. Nếu bạn muốn môi trường tối ưu cho kịch bản và lập trình, trình soạn thảo của bạn sử dụng emacs. Nếu bạn muốn một số cả hai nhấn mạnh vào khả năng lập trình, hãy sử dụng emacs với chế độ viper (hoặc lập trình chế độ của riêng bạn). Nếu bạn muốn điều tốt nhất của cả hai thế giới, bây giờ bạn đã hết may mắn.


17

Dành 30 phút để làm hướng dẫn vim (chạy vimtutor thay vì vim trong thiết bị đầu cuối). Bạn sẽ học các chuyển động cơ bản và một số tổ hợp phím, điều này sẽ giúp bạn ít nhất là hiệu quả với vim như với trình soạn thảo văn bản bạn đã sử dụng trước đây. Sau đó, tốt, đọc lại câu trả lời của Jim Dennis :)


1
Đây là điều đầu tiên tôi nghĩ đến khi đọc OP. Rõ ràng là áp phích chưa bao giờ chạy này; Tôi đã lướt qua nó khi lần đầu tiên học vim hai năm trước và nó đã khắc sâu vào tâm trí của tôi về sự vượt trội của Vim so với bất kỳ trình soạn thảo nào khác mà tôi đã sử dụng (bao gồm cả, đối với tôi, Emacs vì các combo chính gây khó chịu khi sử dụng trên máy Mac) .
dash-tom-bang

16

Cách bạn sử dụng Vim giúp bạn làm việc hiệu quả hơn so với một biên tập viên đương đại là gì?

Có thể thực hiện các chỉnh sửa phức tạp, lặp đi lặp lại với rất ít tổ hợp phím (thường sử dụng macro ). Hãy xem VimGolf để chứng kiến ​​sức mạnh của Vim!

Sau hơn mười năm sử dụng gần như hàng ngày, thật khó để tưởng tượng sử dụng bất kỳ trình soạn thảo nào khác.


16

Sử dụng \cbất cứ nơi nào trong một tìm kiếm để bỏ qua trường hợp (ghi đè cài đặt ignorecase hoặc smartcase của bạn). Ví dụ /\cfoohoặc /foo\csẽ phù hợp foo, Foo, fOO, FOOvv

Sử dụng \Cbất cứ nơi nào trong một tìm kiếm để buộc phù hợp với trường hợp. Ví dụ /\Cfoohoặc /foo\Csẽ chỉ phù hợp với foo.


16

Tôi ngạc nhiên khi thấy không ai nhắc đến tphong trào. Tôi thường xuyên sử dụng nó với các danh sách tham số ở dạng dt,hoặcyt,


2
hoặc dfx, dFx, dtx, ytx, v.v ... trong đó x là một char, +1
hhh

Đúng! Và đừng quên ct (đổi thành).
markle976

16

Không có ai đề cập đến ctags. Tải xuống "ctags exuberant" và đưa nó lên trước phiên bản cài đặt sẵn crappy mà bạn đã có trong đường dẫn tìm kiếm của mình. Cd đến gốc của bất cứ điều gì bạn đang làm việc; ví dụ phân phối nhân Android. Nhập "ctags -R." để xây dựng một chỉ mục của các tệp nguồn ở bất cứ đâu bên dưới thư mục đó trong một tệp có tên là "tags". Điều này chứa tất cả các thẻ, định danh ngôn ngữ cũng như vị trí trong thư mục, trong một tệp, vì vậy công việc ngôn ngữ chéo rất dễ dàng.

Sau đó mở vim trong thư mục đó và đọc: trợ giúp ctags cho một số lệnh. Một số ít tôi sử dụng thường xuyên:

  • Đặt con trỏ vào lệnh gọi phương thức và nhập CTRL-] để đi đến định nghĩa phương thức.

  • Gõ: tên ta để đi đến định nghĩa của tên.


14

Tự động thụt lề:

gg(đi đến phần bắt đầu của tài liệu)
=(thời gian thụt lề!)
shift-g(đi đến phần cuối của tài liệu)

Bạn sẽ cần 'plugin filetype thụt vào' trong .vimrctệp của mình và có thể là các cài đặt 'shift thong' và 'Expandtab' thích hợp.


4
Hoặc chỉ sử dụng tiện ích ": set ai" (tự động thụt lề), đã có trong vi từ đầu.
xcramp

14

Bạn đã hỏi về các phím tắt hiệu quả, nhưng tôi nghĩ rằng câu hỏi thực sự của bạn là: vim có đáng không? Câu trả lời cho câu hỏi stackoverflow này là -> "Có"

Bạn phải nhận thấy hai điều. Vim mạnh mẽ, và vim khó học. Phần lớn sức mạnh của nó nằm ở khả năng mở rộng và sự kết hợp vô tận của các lệnh. Đừng cảm thấy quá tải. Đi chậm thôi. Một lệnh, một plugin tại một thời điểm. Đừng làm quá.

Tất cả khoản đầu tư bạn bỏ vào vim sẽ trả lại gấp ngàn lần. Bạn sẽ ở trong một trình soạn thảo văn bản trong nhiều, nhiều giờ trước khi bạn chết. Vim sẽ là bạn đồng hành của bạn.


13

Nhiều bộ đệm và đặc biệt là nhảy nhanh giữa chúng để so sánh hai tệp với :bp:bn(được ánh xạ chính xác thành một Shift+ phoặc Shift+ n)

vimdiff chế độ (chia thành hai bộ đệm dọc, với màu sắc để hiển thị sự khác biệt)

Sao chép khu vực với Ctrl+v

Và cuối cùng, hoàn thành tab định danh (tìm kiếm "mosh_tab_or_complete"). Đó là một thay đổi cuộc sống.


12

Đồng ý với poster hàng đầu - the : r! lệnh rất hữu ích.

Tôi thường sử dụng nó để "dán" mọi thứ:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

Bằng cách này, tôi không phải nghịch ngợm :set paste.


3
Có lẽ tốt hơn để đặt clipboardtùy chọn thành unnamed( set clipboard=unnamedtrong .vimrc) của bạn để sử dụng bảng tạm hệ thống theo mặc định. Hoặc nếu bạn vẫn muốn bảng tạm hệ thống tách biệt với thanh ghi không tên, hãy sử dụng thanh ghi clipboard được đặt tên thích hợp : "*p.
R. Martinho Fernandes

2
Yêu nó! Sau khi bực tức bằng cách dán các ví dụ mã từ web và tôi mới bắt đầu cảm thấy thành thạo vim. Đó là mệnh lệnh tôi mơ ước ngay tại chỗ. Đây là khi vim hoàn toàn lôi cuốn tôi.
kevpie

Nếu bạn đang phát triển trên máy Mac, sao chép Command + C và Command + V bằng cách sử dụng bảng tạm hệ thống, không cần ánh xạ lại.
Ben Mordecai

Chỉ với GVImạn Từ bảng điều khiển, việc dán mà :set pastekhông hoạt động tốt nếu chế độ tự động được bật.
David Wolever
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.