Những góc tối của Vim mẹ bạn không bao giờ nói với bạn là gì? [đóng cửa]


799

Có rất nhiều câu hỏi mà mọi người nói về các thủ thuật phổ biến, đáng chú ý là " mẹo và thủ thuật Vim + ctags ".

Tuy nhiên, tôi không đề cập đến các phím tắt thường được sử dụng mà ai đó mới sử dụng Vim sẽ thấy thú vị. Tôi đang nói về một người dùng Unix dày dạn (có thể là nhà phát triển, quản trị viên, cả hai, v.v.), người nghĩ rằng họ biết điều gì đó 99% chúng ta chưa bao giờ nghe hoặc mơ về. Một cái gì đó không chỉ làm cho công việc của họ dễ dàng hơn, mà còn là COOL và hackish . Rốt cuộc, Vim cư trú trong hệ điều hành giàu góc tối nhất trên thế giới, do đó, nó nên có những điều phức tạp mà chỉ một số ít đặc quyền biết và muốn chia sẻ với chúng tôi.


10
: Cửa sổ phân chia giới tính và mở trình thám hiểm tệp tích hợp (chia ngang)
user3218088

2
Câu hỏi này có vẻ khá mang tính xây dựng - bằng cách xem xét số lượng upvote ..., đã bỏ phiếu để mở lại - có thể một số câu trả lời thậm chí mát mẻ hơn - có thể được nêu lên nếu hữu ích - do đó mang lại nhiều giá trị hơn cho SOF. Đặt câu trả lời bằng phiếu bầu Tôi đã học được rất nhiều thứ hay ho chỉ trong 5 phút ... thứ thực sự có giá trị ở đây, tại sao lại đóng thứ này có giá trị? Làm thế nào là điều này không mang tính xây dựng?
jhegedus

7
Vô lý rằng câu hỏi này được đóng lại. Nói về chủ nghĩa pháp lý.
Lepidopterist

2
Tôi nghĩ rằng câu hỏi này rất mang tính xây dựng nhưng, phù hợp hơn tại Quora.
Diogo Melo

2
Tại sao có 2 phiếu (tính đến thời điểm hiện tại) để xóa câu hỏi này? Nó có thể làm gì tốt?
Akavall

Câu trả lời:


782

Có thể không phải là một điều mà 99% người dùng Vim không biết, nhưng đó là thứ tôi sử dụng hàng ngày và bất kỳ người sử dụng Linux + Vim nào cũng phải biết.

Lệnh cơ bản, nhưng cực kỳ hữu ích.

:w !sudo tee %

Tôi thường quên sudo trước khi chỉnh sửa một tập tin mà tôi không có quyền ghi. Khi tôi đến để lưu tệp đó và gặp lỗi cấp phép, tôi chỉ phát lệnh vim đó để lưu tệp mà không cần lưu tệp vào tệp tạm thời và sau đó sao chép lại.

Bạn rõ ràng phải ở trên một hệ thống có cài đặt sudo và có quyền sudo.


116
Có thể cho rằng, điều đó thậm chí còn tốt hơn so với việc chạy vim với quyền root! Nâng cao!
Arafangion

27
Đối với một người mới, chính xác thì tee làm gì? Ai đó có thể phân tích ra lệnh này cho tôi không?
AndyL

41
cmap w !! w! sudo tee%
jm666

58
Bạn không bao giờ nên chạy sudo vim. Thay vào đó bạn nên xuất EDITORdưới dạng vim và chạy sudoedit.
Gerardo Marset

8
@maximus: vim thay thế% bằng tên của bộ đệm / tệp hiện tại.
Migu

617

Một cái gì đó tôi mới phát hiện ra gần đây mà tôi nghĩ là rất tuyệt:

:earlier 15m

Hoàn nguyên tài liệu trở lại như trước đây 15 phút. Có thể lấy các đối số khác nhau cho lượng thời gian bạn muốn quay lại và phụ thuộc vào các khoảng trống. Có thể đảo ngược với lệnh ngược lại:later


6
@ skinp: Nếu bạn hoàn tác và sau đó thực hiện các thay đổi khác từ trạng thái hoàn tác, bạn sẽ mất lịch sử làm lại. Điều này cho phép bạn quay lại trạng thái không còn trong ngăn xếp hoàn tác.
ephemient

39
Cũng rất hữu ích là g + và g- để đi lùi và tiến về phía trước trong thời gian. Điều này mạnh mẽ hơn nhiều so với ngăn xếp hoàn tác / làm lại vì bạn không mất lịch sử khi bạn làm điều gì đó sau khi hoàn tác.
Etienne PIERRE

9
Bạn không mất lịch sử làm lại nếu bạn thực hiện thay đổi sau khi hoàn tác. Nó chỉ không dễ dàng truy cập. Có các plugin để giúp bạn hình dung điều này, như Gundo.vim
Ehtesh Choudhury

559
Wow, vậy bây giờ tôi có thể làm :later 8hvà tôi đã hoàn thành cho ngày hôm nay? : P
Igor Popov

7
Lệnh của bạn giả sử một người sẽ dành ít nhất 15 phút trong vim !
e2-e4

411

:! [command] thực thi một lệnh bên ngoài trong khi bạn đang ở Vim.

Nhưng thêm một dấu chấm sau dấu hai chấm :.! [command]và nó sẽ chuyển đầu ra của lệnh vào cửa sổ hiện tại của bạn. Đó là: . !

Ví dụ:

:.! ls

Tôi sử dụng điều này rất nhiều cho những việc như thêm ngày hiện tại vào tài liệu tôi đang gõ:

:.! date

74
Điều này khá giống với: r! Sự khác biệt duy nhất theo như tôi có thể nói là: r! mở ra một dòng mới,:.! ghi đè lên dòng hiện tại.
saffsd

6
Một cách khác :.!datelà viết "ngày" trên một dòng và sau đó chạy !$sh(thay vào đó có lệnh theo sau là một dòng trống và chạy!jsh ). Điều này sẽ dẫn đường dây đến vỏ "sh" và thay thế bằng đầu ra từ lệnh.
hlovdal

43
:.!thực sự là một trường hợp đặc biệt :{range}!, trong đó lọc một phạm vi các dòng (dòng hiện tại khi phạm vi .) thông qua một lệnh và thay thế các dòng đó bằng đầu ra. Tôi thấy :%!hữu ích cho việc lọc toàn bộ bộ đệm.
Nefrubyr

2
@sundar: Tại sao phải truyền một dòng tới sed, khi bạn có thể sử dụng các lệnh ed/ exlệnh tích hợp tương tự ? Hãy thử chạy :.s/old/new/g;-)
jabirali

4
Và cũng lưu ý rằng '!' giống như 'y', 'd', 'c', v.v. tức là bạn có thể làm: !!, số !!,! chuyển động (ví dụ: Gshell_command <cr> thay thế từ dòng hiện tại đến cuối tệp ('G') bằng đầu ra của shell_command).
aqn

312

Không chính xác tối nghĩa, nhưng có một số lệnh "xóa trong" cực kỳ hữu ích, như ..

  • diw để xóa từ hiện tại
  • di( để xóa trong phạm vi hiện tại
  • di" để xóa văn bản giữa các trích dẫn

Những người khác có thể được tìm thấy trên :help text-objects


8
dab "xóa dấu ngoặc arounb", daB cho xung quanh dấu ngoặc nhọn, t cho thẻ loại xml, kết hợp với các lệnh thông thường như mong đợi cib / yaB / dit / vat, v.v.
sjh

15
@Masi: yi (va (p chỉ xóa dấu ngoặc
Don Reba

42
Đây có thể là lý do lớn nhất để tôi ở lại với Vim. Điều đó và các lệnh "thay đổi" tương đương của nó: ciw, ci (, ci ", cũng như dt <space> và ct <space>
thomasrutter

4
@thomasrutter: Tại sao không dW / cW thay vì dt <dấu cách>?

9
@Masi: Với plugin bao quanh: ds (.

237

de Xóa mọi thứ cho đến hết từ bằng cách nhấn. tại trái tim của bạn mong muốn.

ci (xyz [Esc] - Đây là một điều kỳ lạ. Ở đây, 'i' không có nghĩa là chế độ chèn. Thay vào đó, nó có nghĩa là bên trong dấu ngoặc đơn. Vì vậy, chuỗi này cắt văn bản bên trong dấu ngoặc đơn bạn đang đứng và thay thế nó bằng "xyz". Nó cũng hoạt động bên trong dấu ngoặc vuông và hình - chỉ cần làm ci [hoặc ci {tương ứng. Đương nhiên, bạn có thể làm di (nếu bạn chỉ muốn xóa tất cả văn bản mà không cần nhập bất cứ điều gì. Bạn cũng có thể làm athay vìi nếu bạn cũng muốn xóa dấu ngoặc đơn và không chỉ văn bản bên trong chúng.

ci " - cắt văn bản trong dấu ngoặc kép hiện tại

ciw - cắt từ hiện tại. Điều này hoạt động giống như trước đây ngoại trừ (được thay thế bằng w.

C - cắt phần còn lại của dòng và chuyển sang chế độ chèn.

ZZ - lưu và đóng tệp hiện tại (CÁCH nhanh hơn Ctrl-F4 để đóng tab hiện tại!)

ddp - di chuyển dòng hiện tại xuống một hàng

xp - di chuyển nhân vật hiện tại một vị trí sang phải

U - chữ hoa, vì vậy viwUtăng từ

~ - trường hợp chuyển đổi, vì vậy viw~sẽ đảo ngược toàn bộ từ

Ctrl + u / Ctrl + d cuộn nửa trang màn hình lên hoặc xuống. Điều này có vẻ hữu ích hơn so với phân trang toàn màn hình thông thường vì nó giúp dễ dàng xem hai màn hình liên quan như thế nào. Đối với những người vẫn muốn cuộn toàn bộ màn hình tại một thời điểm, có Ctrl + f cho Chuyển tiếp và Ctrl + b cho Quay lại. Ctrl + Y và Ctrl + E cuộn xuống hoặc lên từng dòng một.

Lệnh điên nhưng rất hữu ích là zz - nó cuộn màn hình để làm cho dòng này xuất hiện ở giữa. Điều này là tuyệt vời để đặt đoạn mã bạn đang làm việc ở trung tâm của sự chú ý của bạn. Các lệnh anh chị em - zt và zb - làm cho dòng này ở trên cùng hoặc dưới cùng trên màn hình không hoàn toàn hữu ích.

% tìm và nhảy đến dấu ngoặc đơn phù hợp.

khử - xóa từ con trỏ đến cuối từ (bạn cũng có thể làm dEđể xóa cho đến khoảng trắng tiếp theo)

bde - xóa từ hiện tại, từ dấu phân cách từ trái sang phải

df [dấu cách] - xóa cho đến và bao gồm không gian tiếp theo

dt. - xóa cho đến dấu chấm tiếp theo

dd - xóa toàn bộ dòng này

ye (hoặc yE) - yanks văn bản từ đây đến cuối từ

ce - cắt qua cuối từ

bye - sao chép từ hiện tại (khiến tôi tự hỏi "hi" làm gì!)

yy - sao chép dòng hiện tại

cc - cắt dòng hiện tại, bạn cũng có thể làm Sthay thế. Ngoài ra còn có nắp thấp hơn sđể cắt ký tự hiện tại và chuyển sang chế độ chèn.

viwy hoặc viwc . Yank hoặc thay đổi từ hiện tại. Nhấn wnhiều lần để tiếp tục chọn từng từ tiếp theo, sử dụng bđể di chuyển ngược

vi { - chọn tất cả văn bản trong ngoặc hình. va {- chọn tất cả văn bản bao gồm {} s

vi (p - làm nổi bật mọi thứ bên trong () và thay thế bằng văn bản đã dán

b và e di chuyển con trỏ từng chữ, tương tự như cách Ctrl + Mũi tên thường làm . Định nghĩa của từ là một chút khác nhau, vì một số từ chối liên tiếp được coi là một từ. Nếu bạn bắt đầu ở giữa một từ, nhấn b sẽ luôn đưa bạn đến đầu của từ hiện tại và mỗi b liên tiếp sẽ nhảy đến đầu của từ tiếp theo. Tương tự, và dễ nhớ, eđưa con trỏ đến cuối dòng điện và mỗi từ tiếp theo.

tương tự như b/ e, viết hoa BEdi chuyển con trỏ từng chữ bằng cách chỉ sử dụng khoảng trắng làm dấu phân cách.

capital D (hít một hơi thật sâu) Xóa phần còn lại của dòng bên phải con trỏ, giống như Shift + End / Del trong các trình soạn thảo thông thường (chú ý 2 lần nhấn phím - Shift + D - thay vì 3)


15
zt khá hữu ích nếu bạn sử dụng nó khi bắt đầu một định nghĩa hàm hoặc lớp.
Nick Lewis

9
vityvitccó thể được rút ngắn yitcittương ứng.
Nathan Fellman

33
Tất cả những điều bạn gọi là "cắt" là "thay đổi". ví dụ: C là thay đổi cho đến cuối dòng. Tương đương với "cắt" của Vim là "xóa", được thực hiện với d / D. Sự khác biệt chính giữa thay đổi và xóa là việc xóa khiến bạn ở chế độ bình thường nhưng thay đổi sẽ đưa bạn vào một loại chế độ chèn (mặc dù bạn vẫn ở trong lệnh thay đổi rất tiện lợi vì có thể lặp lại toàn bộ thay đổi .).
Laurence Gonsalves

11
Tôi nghĩ rằng đây là một danh sách những điều mà không nhiều người biết. yy là rất phổ biến, tôi sẽ có suy nghĩ.
Almo

19
byekhông hoạt động khi bạn ở trong ký tự đầu tiên của từ này. yiwluôn luôn như vậy.
Andrea Francia

204

Một điều mà tôi hiếm khi tìm thấy trong hầu hết các hướng dẫn về Vim, nhưng nó rất hữu ích (ít nhất là với tôi), là

g; and g,

để di chuyển (tiến, lùi) thông qua sự thay đổi.

Hãy để tôi chỉ cho tôi cách sử dụng nó. Đôi khi tôi cần sao chép và dán một đoạn mã hoặc chuỗi, nói mã màu hex trong tệp CSS, vì vậy tôi tìm kiếm, nhảy (không quan tâm đến vị trí khớp), sao chép và sau đó nhảy trở lại (g;) Tôi đã chỉnh sửa mã để cuối cùng dán nó. Không cần tạo dấu. Đơn giản hơn.

Chỉ cần 2cents của tôi.


29
tương tự, '.sẽ đi đến dòng được chỉnh sửa cuối cùng, và `.sẽ đi đến vị trí được chỉnh sửa cuối cùng
aehlke

8
Ctrl-O và Ctrl-I (tab) sẽ hoạt động tương tự, nhưng không giống nhau. Họ di chuyển lùi và tiến trong "danh sách nhảy", mà bạn có thể xem bằng cách thực hiện: nhảy hoặc: ju Để biết thêm thông tin, hãy làm: trợ giúp jumplist
Kimball Robinson

17
Bạn có thể liệt kê danh sách thay đổi bằng cách thực hiện: thay đổi
Kimball Robinson

Hot dang đó là hữu ích. Tôi sử dụng <C-o>/ <C-i>cho việc này mọi lúc - hoặc đánh dấu vị trí của tôi.
Wayne Werner

187
:%!xxd

Biến vim thành một trình soạn thảo hex.

:%!xxd -r

Hoàn nguyên.

Cảnh báo: Nếu bạn không chỉnh sửa bằng nhị phân (-b), bạn có thể làm hỏng tệp. - Josh Lee trong các bình luận.


9
Và làm thế nào để bạn hoàn nguyên nó trở lại?
Christian

40
:! xxd -r // Để trở lại từ HEX
Naga Kiran

21
Tôi thực sự nghĩ rằng nó :%!xxd -rđể hoàn nguyên nó trở lại
Andreas Grech

@JoshLee: Nếu một người cẩn thận không truy cập các dòng mới, có an toàn không sử dụng tùy chọn -b không? Tôi hỏi vì đôi khi tôi muốn thực hiện thay đổi hex, nhưng tôi không muốn đóng và mở lại tệp để làm như vậy.
dotancohen

4
@dotancohen: Nếu bạn không muốn đóng / mở lại tệp bạn có thể làm: đặt nhị phân
Bambu


119

Đôi khi, một cài đặt trong .vimrc của bạn sẽ bị ghi đè bởi plugin hoặc autocommand. Để gỡ lỗi, một mẹo hữu ích là sử dụng lệnh: verbose kết hợp với: set. Ví dụ: để tìm ra nơi mà cindent đã đặt / hủy đặt:

:verbose set cindent?

Điều này sẽ tạo ra một cái gì đó như:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Điều này cũng hoạt động với bản đồ và nổi bật. (Cảm ơn joeytwiddle đã chỉ ra điều này.) Ví dụ:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim

8
Mẹo tuyệt vời - chính xác những gì tôi đang tìm kiếm ngày hôm nay.
Artem Russakovskii

Người đàn ông tip tuyệt vời! Làm thế nào để bạn biết những điều táo bạo này?
Rafid

1
:verbosecũng có thể được sử dụng trước nmap lhoặc highlight Normalđể tìm ra vị trí của lsơ đồ bàn phím hoặc phần Normaltô sáng cuối cùng. Rất hữu ích để gỡ lỗi!
joeytwiddle

@joeytwiddle Cảm ơn! Tôi đã thêm thông tin đó vào câu trả lời.
Laurence Gonsalves

Khi bạn bắt đầu tạo ánh xạ tùy chỉnh, điều này sẽ tiết kiệm được mông của bạn rất nhiều lần, có lẽ là một trong những cách hữu ích nhất ở đây (IMO)!
SidOfc


98

Không chắc điều này có được tính là góc tối hay không, nhưng tôi chỉ mới học nó ...

:g/match/y A

sẽ yank (sao chép) tất cả các dòng có chứa "khớp" vào "a/ @aregister. (Viết hoa như Alàm cho vim chắp thêm các thay đổi thay vì nội dung đăng ký trước đó.) Tôi đã sử dụng nó rất nhiều gần đây khi tạo biểu định kiểu Internet Explorer.


đếm, đếm như tôi chưa từng thấy cái này :)

Đẹp một. Chưa bao giờ nghe về nó ... Có thể hữu ích: P
skinp

5
Bạn có thể sử dụng: g! để tìm các dòng không khớp với mẫu cũ: g! / set / dd bình thường (xóa tất cả các dòng không chứa tập hợp)
tsukimi

3
Đôi khi, tốt hơn là làm những gì tsukimi nói và chỉ lọc ra những dòng không khớp với mẫu của bạn. Một phiên bản rút gọn của lệnh đó mặc dù: :v/PATTERN/dGiải thích: :vlà viết tắt cho :g!:glệnh áp dụng bất kỳ lệnh ex nào cho các dòng. :y[ank]hoạt động và như vậy :normal, nhưng ở đây điều tự nhiên nhất để làm là chỉ :d[elete].
Đại bàng

Bạn cũng có thể làm :g/match/normal "Ayy- normaltừ khóa cho phép bạn bảo nó chạy các lệnh chế độ bình thường (mà bạn có thể quen thuộc hơn).
Kimball Robinson

93

Bạn muốn nhìn vào: lịch sử lệnh của bạn?

q:

Sau đó duyệt, chỉnh sửa và cuối cùng để thực hiện lệnh.

Bạn đã bao giờ thực hiện các thay đổi tương tự cho hai tệp và chuyển đổi qua lại giữa chúng chưa? (Nói, tập tin nguồn và tiêu đề?)

:set hidden
:map <TAB> :e#<CR>

Sau đó, tab qua lại giữa các tập tin.


131
Tôi q:vô tình gặp tai nạn ...
Josh Lee

11
Ngoài ra, từ trình chỉnh sửa cũ (:), bạn có thể thực hiện CTRL-f để bật lên cửa sổ lịch sử lệnh.
Jason Xuống

6
@jleedev tôi cũng vậy. Tôi gần như ghét lệnh này, chỉ vì tôi vô tình sử dụng nó quá nhiều.
bradlis7

9
q / và q? có thể được sử dụng để làm một điều tương tự cho các mẫu tìm kiếm của bạn.
bpw1621

5
Nhấn <Cf> sau: hoặc / (hoặc bất kỳ lúc nào bạn ở chế độ lệnh) sẽ hiển thị cùng một menu lịch sử. Vì vậy, bạn có thể ánh xạ lại q: nếu bạn vô tình nhấn nó và vẫn truy cập chế độ tuyệt vời này.
idbrii

82

Vim sẽ mở một URL, ví dụ

vim http://stackoverflow.com/

Thật tuyệt khi bạn cần kéo lên nguồn của một trang để tham khảo.


2
Đối với tôi nó không mở nguồn; thay vào đó, nó rõ ràng đã sử dụng elinks để kết xuất trang được kết xuất vào một bộ đệm và sau đó mở nó.
Ivan Vučica

có lỗi khi thực hiện lệnh này
Dzung Nguyen

5
Hoạt động tốt hơn với một dấu gạch chéo ở cuối. Trò hay!
Thomas

@Vdt: Sẽ hữu ích nếu bạn đăng lỗi của mình. Nếu đây là lỗi : " lỗi (netrw) không có lệnh wget hay lệnh tìm nạp khả dụng" thì rõ ràng bạn cần phải cung cấp một trong những công cụ đó từ biến môi trường PATH của mình.
Isaac Nequittepas

Tôi thấy điều này đặc biệt hữu ích khi mọi người gửi liên kết đến dịch vụ dán và quên chọn tô sáng cú pháp, tôi thường chỉ phải mở liên kết trong vim sau khi thêm "& raw".
Dettorer

68

Macro có thể gọi các macro khác và cũng có thể gọi chính nó.

ví dụ:

qq0dwj@qq@q

... sẽ xóa từ đầu tiên từ mỗi dòng cho đến khi kết thúc tập tin.

Đây là một ví dụ khá đơn giản nhưng nó thể hiện một tính năng rất mạnh mẽ của vim


2
Tôi không biết macro có thể lặp lại. Mát mẻ. Lưu ý: qx bắt đầu ghi vào thanh ghi x (anh ta sử dụng qq cho thanh ghi q). 0 di chuyển đến đầu dòng. dw xóa một từ. j di chuyển xuống một dòng. @q sẽ chạy lại macro (xác định vòng lặp). Nhưng bạn đã quên kết thúc ghi âm bằng một "q" cuối cùng, sau đó thực sự chạy macro bằng cách gõ @q.
Kimball Robinson

2
Tôi nghĩ đó là cố ý, như một vĩ mô lồng nhau và đệ quy.
Yktula

7
qqqqqifuu<Esc>h@qq@q
Gerardo Marset

6
Một cách khác để thực hiện điều này là ghi lại một macro khi đăng ký một phép biến đổi thành một dòng duy nhất, sau đó tô sáng một loạt các dòng có V và gõ :normal! @ađể áp dụng macro cho mỗi dòng trong lựa chọn của bạn.
Nathan Long

Tôi tìm thấy bài đăng này googling macro đệ quy VIM. Tôi không thể tìm ra cách nào để ngăn chặn macro ngoài việc giết quá trình VIM.
dotancohen

55

Giả sử bạn có hỗ trợ Perl và / hoặc Ruby được biên dịch :rubydo:perldosẽ chạy một lớp lót Ruby hoặc Perl trên mỗi dòng trong một phạm vi (mặc định cho toàn bộ bộ đệm), $_gắn với văn bản của dòng hiện tại (trừ dòng mới). Thao tác$_ sẽ thay đổi văn bản của dòng đó.

Bạn có thể sử dụng điều này để thực hiện một số điều dễ thực hiện bằng ngôn ngữ kịch bản nhưng không quá rõ ràng khi sử dụng nội dung Vim. Ví dụ để đảo ngược thứ tự của các từ trong một dòng:

:perldo $_ = join ' ', reverse split

Để chèn một chuỗi ngẫu nhiên gồm 8 ký tự (AZ) ở cuối mỗi dòng:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

Bạn bị giới hạn hành động trên một dòng tại một thời điểm và bạn không thể thêm dòng mới.


Điều gì xảy ra nếu tôi chỉ muốn perldo chạy trên một dòng được chỉ định? hoặc một vài dòng được chọn?
Sujoy

5
Bạn có thể cung cấp cho nó một phạm vi như bất kỳ lệnh nào khác. Ví dụ: 1,5perldo sẽ chỉ hoạt động trên các dòng 1-5.
Brian Carper

Bạn có thể làm $ _ + = '\ nNEWLINE !!!' để có được một dòng mới sau khi hiện tại?
Greg

Đáng buồn thay, nó chỉ thêm một nhân vật điều khiển sôi nổi vào cuối dòng. Sau đó, bạn có thể sử dụng tìm kiếm / thay thế Vim để thay đổi tất cả các ký tự điều khiển thành dòng mới thực sự.
Brian Carper

3
Tương tự, pydopy3dolàm việc cho python nếu bạn có hỗ trợ cần thiết được biên dịch.
Derecho

54

^ O và ^ tôi

Đi đến vị trí cũ hơn / mới hơn. Khi bạn đang di chuyển qua tệp (bằng cách tìm kiếm, di chuyển các lệnh, v.v.), hãy bắt đầu các "bước nhảy" này, vì vậy bạn có thể lặp lại các bước nhảy này (^ O - O cũ) và chuyển tiếp (^ Tôi - ngay bên cạnh tôi trên bàn phím ). Tôi thấy nó rất hữu ích khi viết mã và thực hiện rất nhiều tìm kiếm.

gi

Đi đến vị trí nơi chế độ Chèn được dừng lần cuối. Tôi thấy mình thường xuyên chỉnh sửa và sau đó tìm kiếm một cái gì đó. Để trở về nơi chỉnh sửa, nhấn gi.

bạn gái

đặt con trỏ vào tên tệp (ví dụ: bao gồm tệp tiêu đề), nhấn gf và tệp được mở

gF

tương tự như gf nhưng nhận ra định dạng "[tên tệp]: [số dòng]". Nhấn gF sẽ mở [tên tệp] và đặt con trỏ thành [số dòng].

^ P và ^ N

Tự động hoàn thành văn bản trong khi chỉnh sửa (^ P - trận đấu trước và ^ N trận đấu tiếp theo)

^ X ^ L

Trong khi chỉnh sửa hoàn thành cùng một dòng (hữu ích cho lập trình). Bạn viết mã và sau đó bạn nhớ lại rằng bạn có cùng mã ở đâu đó trong tệp. Chỉ cần nhấn ^ X ^ L và dòng đầy đủ đã hoàn thành

^ X ^ F

Tên tập tin đầy đủ. Bạn viết "/ etc / pass" Hmm. Bạn quên tên tập tin. Chỉ cần nhấn ^ X ^ F và tên tệp đã hoàn tất

^ Z hoặc: sh

Di chuyển tạm thời vào vỏ. Nếu bạn cần một cú đánh nhanh:

  • nhấn ^ Z (để đặt vi vào nền) để trở về vỏ ban đầu và nhấn fg để quay lại vim trở lại
  • nhấn: sh để đi đến shell phụ và nhấn ^ D / exit để quay lại vi trở lại

Với ^X^Fpeeve thú cưng của tôi là tên tập tin bao gồm =các dấu hiệu, làm cho nó làm những thứ mục nát trong nhiều trường hợp (tập tin ini, makefiles, vv). Tôi sử dụng se isfname-==để chấm dứt sự phiền toái đó
sehe

3
+1 tính năng tự động hoàn thành tích hợp chỉ đang ngồi đó chờ được khám phá.
joeytwiddle

48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor

2
Tôi không thấy cái này tốt cho cái gì (ngoài việc trông giống như một câu trả lời đùa). Bất cứ ai khác có thể khai sáng cho tôi?
Ryan Edwards

2
mở vim và sau đó làm ": cho i trong phạm vi (1,255) | .put = '10 .0.0. '. i | endfor"
codygman

2
@RyanEdwards điền / etc / hosts có thể
Ruslan

26
Đây là một câu trả lời tuyệt vời. Không phải bit về việc tạo địa chỉ IP, mà là bit ngụ ý rằng VIM có thể sử dụng cho các vòng lặp trong các lệnh .
dotancohen

4
Không có chế độ cũ:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap

47

Đây là một mẹo hay để mở lại tệp hiện tại bằng một mã hóa khác:

:e ++enc=cp1250 %:p

Hữu ích khi bạn phải làm việc với các bảng mã kế thừa. Các bảng mã được hỗ trợ được liệt kê trong bảng dưới đây encoding-values(xem help encoding-values). Điều tương tự cũng hoạt động ++ff, để bạn có thể mở lại tệp với dòng Windows / Unix kết thúc nếu bạn gặp lỗi lần đầu tiên (xem help ff).


Không bao giờ phải sử dụng loại vật này, nhưng chắc chắn chúng tôi sẽ thêm vào kho thủ đoạn của tôi ...

mẹo tuyệt vời, cảm ơn. Đối với các điểm thưởng, thêm một danh sách các mã hóa hợp lệ phổ biến.
Adriano Varoli Quảng trường

2
Tôi đã sử dụng cái này ngày hôm nay, nhưng tôi nghĩ rằng tôi không cần chỉ định "%: p"; chỉ cần mở tệp và: e ++ enc = cp1250 là đủ. Tôi
Ivan Vučica

sẽ: đặt mã hóa = cp1250 có tác dụng tương tự?
laz

1
`: e + b% 'cũng hữu ích tương tự để mở lại ở chế độ nhị phân (không có dòng mới)
trực quan

47

Nhập == sẽ sửa lỗi thụt dòng của dòng hiện tại dựa trên dòng trên.

Trên thực tế, bạn có thể thực hiện một dấu = theo sau bởi bất kỳ lệnh di chuyển nào. = {phong trào}

Ví dụ: bạn có thể sử dụng chuyển động% di chuyển giữa các dấu ngoặc phù hợp. Định vị con trỏ trên {trong đoạn mã sau:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

Và nhấn =% để nhận ngay điều này:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

Thay phiên, bạn có thể làm = a { trong khối mã, thay vì định vị chính mình trên {ký tự.


Hừm, tôi không biết điều này về vết lõm.
Ehtesh Choudhury

Không cần, thông thường, là chính xác trên niềng răng. Nghĩ thường xuyên tôi chỉ =}hoặc vaBaB=vì nó ít phụ thuộc hơn. Ngoài ra, v}}:!astyle -bjphù hợp với phong cách mã của tôi tốt hơn, nhưng tôi có thể đưa nó trở lại phong cách của bạn một cách đơn giản%!astyle -aj
sehe

7
gg=Glà khá gọn gàng khi dán trong một cái gì đó.
kyrias


@kyrias Ồ, tôi đã làm như thế ggVG=.
Braden hay nhất

42
imap jj <esc>

7
Làm thế nào bạn sẽ gõ jj sau đó? : P
hasen

6
Bạn có thường xuyên gõ jj không? Trong tiếng Anh ít nhất?
ojblass

50
Tôi đã ánh xạ lại capslock để thoát, vì đó là một khóa vô dụng. Bản đồ của tôi là hệ điều hành rộng, vì vậy nó có thêm lợi ích là không bao giờ phải lo lắng về việc vô tình nhấn nó. Hạn chế duy nhất là NÓ CỨNG CỨNG VÀO MỌI NGƯỜI. :)
Alex

7
@Alex: chắc chắn, capslock là cái chết. "Đợi đã, wtf? oh, đó là ZZ? .... tào lao."
trực giác

5
@ojblass: Không chắc có bao nhiêu người đã từng đúng mã MATLAB trong Vim, nhưng iijjthường được sử dụng cho các biến truy cập, vì ijđược dành riêng cho số phức.
brianmearns

37

Chúng ta hãy xem một số trình soạn thảo IDE nhỏ làm chuyển vị cột.

:%s/\(.*\)^I\(.*\)/\2^I\1/

Giải trình

\(\)là làm thế nào để ghi nhớ công cụ trong regex-đất. Và \1, \2vv là làm thế nào để lấy lại những thứ đã nhớ.

>>> \(.*\)^I\(.*\)

Hãy nhớ mọi thứ theo sau ^I(tab) theo sau là tất cả mọi thứ.

>>> \2^I\1

Thay thế các nội dung trên bằng "nội dung thứ 2 bạn nhớ" theo sau là "nội dung thứ 1 bạn nhớ" - về cơ bản là thực hiện chuyển đổi.


4
Chuyển đổi một cặp cột được phân tách bằng tab (dấu phân cách tùy ý, tất cả đều là biểu thức chính quy) với nhau.
hỗn loạn

39
Đây chỉ là một regex; nhiều IDE có regex tìm kiếm và thay thế.
rlbond

7
@rlbond - Điều này cho thấy công cụ regex trong IDE tốt như thế nào. Regex của Vim khá mạnh mẽ; những người khác .. đôi khi không quá nhiều.
romandas

3
* Sẽ tham lam, vì vậy regex này giả sử bạn chỉ có hai cột. Nếu bạn muốn nó không tham lam, hãy sử dụng {-} thay vì * (xem: trợ giúp không tham lam để biết thêm thông tin về số nhân {})
Kimball Robinson

4
Đây thực sự là một regex khá đơn giản, nó chỉ thoát khỏi dấu ngoặc đơn nhóm khiến nó trông phức tạp.
mk12

30

Không hẳn là một bí mật đen tối, nhưng tôi muốn đưa ánh xạ sau vào tệp .vimrc của mình, vì vậy tôi có thể nhấn "-" (trừ) bất cứ lúc nào để mở trình thám hiểm tệp để hiển thị các tệp liền kề với tệp tôi vừa chỉnh sửa . Trong trình thám hiểm tệp, tôi có thể nhấn một "-" khác để di chuyển lên một thư mục, cung cấp trình duyệt liền mạch các cấu trúc thư mục phức tạp (giống như các cấu trúc được sử dụng bởi các khung công tác MVC hiện nay):

map - :Explore<cr>

Đây cũng có thể hữu ích cho ai đó. Tôi thích cuộn màn hình và tiến con trỏ cùng một lúc:

map <c-j> j<c-e>
map <c-k> k<c-y>

Điều hướng tab - Tôi yêu các tab và tôi cần di chuyển dễ dàng giữa chúng:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Chỉ trên Mac OS X: Điều hướng tab giống như Safari:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>

Bạn cũng có thể duyệt các tệp trong chính Vim, sử dụng: Khám phá
Roman Plášil

Xin chào Roman, đây chính xác là những gì ánh xạ này thực hiện, nhưng gán nó cho một "phím nóng". :)
KKovacs

27

Tôi thích sử dụng 'sudo bash' và sysadmin của tôi ghét điều này. Anh ta đã khóa 'sudo' để nó chỉ có thể được sử dụng với một số lệnh (ls, chmod, chown, vi, v.v.), nhưng dù sao tôi cũng có thể sử dụng vim để lấy shell root:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#

9
FWIW, sudoedit (hoặc sudo -e) chỉnh sửa các tệp đặc quyền nhưng chạy trình soạn thảo của bạn như người dùng bình thường.
RJHunter

12
vâng ... tôi cũng ghét bạn;) bạn chỉ cần một vỏ gốc RẤT RARELY, trừ khi bạn đã có thói quen chạy quá nhiều lệnh như root, điều đó có nghĩa là tất cả các quyền của bạn đều bị sai lệch.
Chúng tôi là tất cả Monica

5
Tại sao sysadmin của bạn thậm chí cung cấp cho bạn root? : D
d33tah 30/03/2016

26

Thông thường, tôi thích thay đổi các thư mục hiện tại trong khi chỉnh sửa - vì vậy tôi phải chỉ định các đường dẫn ít hơn.

cd %:h

Cái này làm gì Và nó có hoạt động với autchdir không?
Leonard

2
Tôi cho rằng nó sẽ ghi đè lên autochdir tạm thời (cho đến khi bạn chuyển lại bộ đệm). Về cơ bản, nó thay đổi thư mục vào thư mục gốc của tập tin hiện tại. Nó cho tôi điều khiển thủ công hơn một chút so với autochdir.
hung hăng

1
: set autochdir // cái này cũng phục vụ cùng chức năng và nó thay đổi thư mục hiện tại thành tệp trong bộ đệm
Naga Kiran

25

Tôi thường sử dụng nhiều cửa sổ khi tôi làm việc trong một dự án và đôi khi tôi cần thay đổi kích thước chúng. Đây là những gì tôi sử dụng:

map + <C-W>+
map - <C-W>-

Những ánh xạ này cho phép tăng và giảm kích thước của cửa sổ hiện tại. Nó khá đơn giản nhưng nhanh.


16
Ngoài ra còn có Ctrl-W =, làm cho các cửa sổ có chiều rộng bằng nhau.
Bill Lynch

2
Đừng quên bạn có thể thêm số để thực hiện một hành động nhiều lần trong Vim. Vì vậy, để mở rộng chiều cao cửa sổ hiện tại thêm 8 dòng: 8 <CW> +
joeytwiddle

23

Không phải là một tính năng tối nghĩa, nhưng rất hữu ích và tiết kiệm thời gian.

Nếu bạn muốn lưu một phiên của bộ đệm mở, tab, điểm đánh dấu và các cài đặt khác, bạn có thể đưa ra các điều sau:

mksession session.vim

Bạn có thể mở phiên của mình bằng cách sử dụng:

vim -S session.vim

5
Bạn cũng có thể :so session.vimbên trong vim.
TankorSmash

22
:r! <command>

dán đầu ra của một lệnh bên ngoài vào bộ đệm.

Làm một số phép toán và nhận kết quả trực tiếp trong văn bản:

:r! echo $((3 + 5 + 8))

Lấy danh sách các tệp để biên dịch khi viết Makefile:

:r! ls *.c

Đừng tìm kiếm thực tế mà bạn đọc trên wikipedia, hãy dán trực tiếp vào tài liệu bạn đang viết:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever

14
^ R = 3 + 5 + 8 ở chế độ chèn sẽ cho phép bạn chèn giá trị của biểu thức (3 + 5 + 8) trong văn bản với ít lần nhấn phím hơn.
Sudhanshu

Làm thế nào tôi có thể nhận được kết quả / đầu ra cho một bộ đệm khác với hiện tại?
dcn


21

Ánh xạ F5 để nhanh chóng ROT13 bộ đệm của bạn:

map <F5> ggg?G``

Bạn có thể sử dụng nó như một khóa ông chủ :).


14
Tôi không biết những gì bạn đang viết ... Nhưng chắc chắn, ông chủ của tôi sẽ là tò mò hơn khi nhìn thấy tôi viết ROT13 mớ bòng bong :)
sehe

hoặc để giả mạo bạn bè của bạn : nmap i ggg?G`` . Hoặc người độc ác : nmap i ggg?G``i!
romeovs

1
@romeovs Cái thứ hai là vòng lặp vô hạn, sử dụng nnoremap
Amit Gold

19

Tôi mới tìm thấy cái này hôm nay qua NSFAQ :

Nhận xét khối mã.

Vào chế độ Blockwise Visual bằng cách nhấn CTRL-V.

Đánh dấu khối bạn muốn bình luận.

Nhấn I (viết hoa I) và nhập chuỗi nhận xét của bạn ở đầu dòng. (// cho C ++)

Nhấn ESC và tất cả các dòng được chọn sẽ có // được thêm vào phía trước của dòng.


Tôi đã thêm # để nhận xét một khối mã bằng ruby. Làm thế nào để tôi hoàn tác nó.
Neeraj Singh

3
Bạn chỉ có thể nhấn ctrl + v lần nữa, đánh dấu // và nhấn x thành "uncomment"
nos

6
Tôi sử dụng NERDCommenter cho việc này.
ZyX

1
Mã nhận xét có lẽ là một trong những loại bình luận tồi tệ nhất mà bạn có thể đặt vào mã của mình. Có sử dụng tốt hơn cho chèn khối tuyệt vời.
Braden hay nhất

1
@Pie vì nhận xét ra mã là mã chết . Mã chết không phục vụ mục đích hữu ích và tạo ra sự lộn xộn. Bạn nghĩ rằng bạn đang bảo quản mã mà bạn có thể muốn mang lại sau, nhưng luôn có cách tốt hơn. Bạn có thể sử dụng lịch sử hoàn tác của mình, bạn có thể sao chép tệp hoặc bạn có thể sử dụng git, có chức năng này được tích hợp trong ( git checkout). Đối với việc sử dụng tốt hơn để chèn khối, không có bất kỳ thiết lập nào. Bạn chỉ cần sử dụng nó bất cứ khi nào bạn có nhiều dòng mà bạn muốn chèn cùng một chuỗi ký tự ở cùng một nơi.
Braden hay nhất

17

Tôi sử dụng vim cho bất kỳ chỉnh sửa văn bản nào tôi làm, vì vậy tôi thường xuyên sử dụng bản sao và dán. Vấn đề là vim theo mặc định thường sẽ làm biến dạng văn bản đã nhập thông qua dán. Cách để ngăn chặn điều này là sử dụng

:set paste

trước khi dán vào dữ liệu của bạn. Điều này sẽ giữ cho nó khỏi lộn xộn.

Lưu ý rằng bạn sẽ phải phát hành :set nopasteđể khôi phục thụt lề tự động. Các cách khác để dán văn bản được định dạng sẵn là các thanh ghi clipboard ( *+) và:r!cat (bạn sẽ phải kết thúc đoạn đã dán bằng ^ D).

Đôi khi cũng rất hữu ích khi bật một bảng màu tương phản cao. Điều này có thể được thực hiện với

:color blue

Tôi nhận thấy rằng nó không hoạt động trên tất cả các phiên bản vim tôi sử dụng nhưng hầu hết đều hoạt động.


10
"Biến dạng" đang xảy ra do bạn đã bật một số hình thức thụt lề tự động. Sử dụng set pastehoặc chỉ định một khóa cho pastetoggletùy chọn là một cách phổ biến để khắc phục điều này, nhưng hiệu quả tương tự có thể đạt được set mouse=akhi Vim biết rằng lũ văn bản mà nó nhìn thấy là một miếng dán được kích hoạt bởi chuột.
jamessan

1
Nếu bạn đã cài đặt gvim, bạn có thể thường xuyên (mặc dù tùy thuộc vào tùy chọn của bạn, bản phân phối của bạn biên dịch vim với) sử dụng bảng tạm X trực tiếp từ vim thông qua thanh ghi *. Ví dụ "*pđể dán từ Xlipboard. (Nó cũng hoạt động từ terminal vim, chỉ là bạn có thể cần gói gvim nếu chúng tách rời)
kyrias

2
@kyrias cho bản ghi, *PRIMARYđăng ký ("nhấp chuột giữa"). Bảng tạm+
Braden Best
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.