Làm cách nào để thoát trình soạn thảo Vim?


3765

Tôi bị mắc kẹt và không thể trốn thoát. Nó nói rằng:

"type :quit<Enter> to quit VIM"

Nhưng khi tôi gõ nó chỉ đơn giản là xuất hiện trong cơ thể đối tượng.


131
Bạn chỉ đang cố gắng để thoát khỏi VIM? Nếu đây là trường hợp, nhấn "thoát" và sau đó nhập ': q'
Pop

47
Đừng quên dấu hai chấm ! Bạn nên gõ :quitvà sau đó nhấn [ENTER]phím.
Farahmand

88
Thật dễ dàng để tìm hiểu những điều cơ bản của vim và nó được tích hợp ngay trong hệ thống của bạn. Trong thiết bị đầu cuối loại "vimtutor". 25 phút sau bạn sẽ đi nhanh hơn trình soạn thảo văn bản thông thường của bạn!
Đánh dấu Robson

4
Kiểm tra ở đây nhiều lệnh hơn.
Toni

78
Để ngăn git commitviệc gửi bạn đến vim trong tương lai: git config --global core.editor="nano"
Tom Kelly

Câu trả lời:


4903

Nhấn Escphím để vào "Chế độ bình thường". Sau đó, bạn có thể nhập :để vào "Chế độ dòng lệnh". Dấu hai chấm ( :) sẽ xuất hiện ở dưới cùng của màn hình và bạn có thể nhập một trong các lệnh sau. Để thực hiện một lệnh, nhấn Enterphím.

  • :q bỏ (viết tắt :quit)
  • :q!bỏ mà không lưu (viết tắt :quit!)
  • :wq viết và bỏ
  • :wq! để viết và thoát ngay cả khi tệp chỉ có quyền đọc (nếu tệp không có quyền ghi: buộc ghi)
  • :x để viết và thoát (tương tự :wq, nhưng chỉ viết nếu có thay đổi)
  • :exitđể viết và thoát (giống như :x)
  • :qabỏ tất cả (viết tắt của :quitall)
  • :cq thoát mà không lưu và làm cho Vim trả về lỗi khác không (nghĩa là thoát có lỗi)

Bạn cũng có thể thoát Vim trực tiếp từ "Chế độ bình thường" bằng cách nhập ZZđể lưu và thoát (giống như :x) hoặc ZQchỉ thoát (giống như :q!). (Lưu ý rằng trường hợp này rất quan trọng ở đây. ZZzzkhông có nghĩa tương tự.)

Vim có trợ giúp rộng rãi - rằng bạn có thể truy cập bằng :helplệnh - nơi bạn có thể tìm thấy câu trả lời cho tất cả các câu hỏi của mình và hướng dẫn cho người mới bắt đầu.


15
Trừ khi bạn đã ánh xạ lại esc hoặc có một ánh xạ kỳ lạ trong .vimrc của bạn thì nó chắc chắn nên. Nếu trên linux gõ xev và đảm bảo thoát là keytype bạn nhận được khi bạn thoát thoát.
dirvine

17
Hãy nhớ rằng bạn có thể sử dụng ctrl + c nếu bạn không thể sử dụng Esc (như tôi vì trình bao của tôi nằm trong TotalTerminal). vim.wikia.com/wiki/Avoid_the_escape_key
dotnetCarpenter 27/1/2015

25
:x== ZZnhưng :x! = :wq. :xghi tập tin iff đã thay đổi, :wqghi tập tin luôn (vấn đề tức là khi sử dụng inotify).
Hauleth

36
Thành thật mà nói, tôi gặp khó khăn hơn khi sử dụng hệ thống trợ giúp của vim so với sử dụng chính vim và chủ yếu dựa vào thẻ ref nhanh và tài liệu trực tuyến.
bgvaughan

18
nếu bạn không có quyền trên tệp nhưng có quyền sudo:w ! sudo tee %
tvlooy

190

Hình ảnh đáng giá cả ngàn lệnh và tùy chọn Unix:

Nhập mô tả hình ảnh ở đây

Tôi vẽ điều này cho các sinh viên của mình mỗi học kỳ và họ dường như nắm bắt được vi sau đó.

vi là một máy trạng thái hữu hạn chỉ có ba trạng thái.

Khi bắt đầu, vi chuyển sang chế độ LỰA CHỌN, trong đó bạn có thể gõ các lệnh ngắn, vài ký tự, một cách mù quáng . Bạn biết những gì bạn đang làm; Điều này không dành cho người nghiệp dư.

Khi bạn thực sự muốn chỉnh sửa văn bản, bạn nên chuyển sang chế độ INSERT với một số lệnh một ký tự:

  • i: đi đến CHERTN ở vị trí của con trỏ
  • I: chuyển đến chế độ INSERT ở đầu dòng
  • a: nối sau con trỏ
  • A: nối vào cuối dòng
  • o: mở một dòng mới bên dưới dòng hiện tại
  • O: mở một dòng mới ở vị trí của dòng hiện tại

Bây giờ, trả lời câu hỏi: thoát.

Bạn có thể thoát vi từ chế độ EX:

  • q: nếu bạn chưa thực hiện bất kỳ sửa đổi nào, hoặc lưu chúng trước
  • q!: bỏ qua mọi sửa đổi và thoát
  • wq: lưu và thoát
  • x: điều này tương đương với wq

wxchấp nhận một tham số tên tệp. Nếu bạn bắt đầu vi với một tên tệp, bạn không cần phải cung cấp lại ở đây.

Cuối cùng, điều quan trọng nhất: làm thế nào bạn có thể đạt đến chế độ EX?

Chế độ EX dành cho các lệnh dài mà bạn có thể thấy gõ ở dòng dưới cùng của màn hình. Từ chế độ LỰA CHỌN, bạn đẩy dấu hai chấm :và dấu hai chấm sẽ xuất hiện ở dòng dưới cùng, nơi bạn có thể nhập các lệnh trên.

Từ chế độ INSERT, bạn cần nhấn ESC, tức là nút Escape, chuyển sang chế độ LỰA CHỌN và sau đó: để chuyển sang chế độ EX.

Nếu bạn không chắc chắn, hãy nhấn ESC và điều đó sẽ đưa bạn đến chế độ lệnh.

Vì vậy, phương thức mạnh mẽ là ESC -: - x-Enter giúp lưu tệp và thoát của bạn.


5
Cảm ơn bạn, hình ảnh rất hữu ích. Tuy nhiên, đối với tôi wkhông thay đổi từ chế độ Ex sang Command, nhưng Esckhông. Tôi đang làm gì sai?
Nick Volynkin

2
Nếu bạn viết w-Enter sẽ lưu tệp của bạn và quay lại chế độ LỆNH. Tôi đã viết nó để có một bức tranh đầy đủ về các lệnh lưu và thoát.
Gergely

3
oh, vì vậy bạn có ý nghĩa :w. Sau đó, nó làm cho ý nghĩa hoàn hảo. Nhân tiện, có lệnh tải lại từ đĩa không (nghĩa là hoàn nguyên các thay đổi nhưng không đóng tệp)? Nếu vậy, nó có thể nằm bên cạnh wtrong sơ đồ.
Nick Volynkin

2
@Gergely tôi chỉ tìm ra sự nhầm lẫn! Từ các tài liệu, chế độ bình thường cũng được gọi là chế độ lệnh ! Vì vậy, chế độ lệnh! = Chế độ dòng lệnh. Ồ
jpaugh

2
@NickVolynkin lệnh tải lại từ đĩa là :e(hoặc nhiều khả năng :e!vì nó sẽ cảnh báo bạn về những thay đổi chưa được lưu mà không có !)
JDS

177

Trước khi bạn nhập lệnh, nhấn Escphím . Sau khi bạn nhập nó, nhấn Returnđể xác nhận.

Esckết thúc lệnh hiện tại và chuyển Vim sang chế độ bình thường . Bây giờ nếu bạn nhấn :, :sẽ xuất hiện ở dưới cùng của màn hình. Điều này xác nhận rằng bạn thực sự đang gõ một lệnh và không chỉnh sửa tệp.

Hầu hết các lệnh có chữ viết tắt, với phần tùy chọn được đặt trong ngoặc : c[ommand].

Các lệnh được đánh dấu '*' là chỉ Vim (không được thực hiện trong Vi).

Thoát khỏi an toàn (không thành công nếu có các thay đổi chưa được lưu):

  • :q[uit] Thoát khỏi cửa sổ hiện tại . Thoát khỏi Vim nếu đây là cửa sổ cuối cùng. Điều này thất bại khi những thay đổi đã được thực hiện trong bộ đệm hiện tại .
  • :qa[ll]* Thoát khỏi tất cả các cửa sổ và Vim, trừ khi có một số bộ đệm đã được thay đổi.

Nhắc-thoát (nhắc nhở nếu có thay đổi chưa được lưu)

  • :conf[irm] q[uit]* Thoát, nhưng đưa ra lời nhắc khi có một số bộ đệm đã được thay đổi.
  • :conf[irm] xa[ll]* Viết tất cả các bộ đệm đã thay đổi và thoát Vim. Đưa ra lời nhắc khi một số bộ đệm không thể được viết.

Viết (lưu) thay đổi và thoát:

  • :wqViết tập tin hiện tại (ngay cả khi nó không thay đổi) và thoát. Viết thất bại khi tệp chỉ đọc hoặc bộ đệm không có tên. :wqa[ll]* cho tất cả các cửa sổ.
  • :wq!Tương tự, nhưng ghi các tệp chỉ đọc. :wqa[ll]!* cho tất cả các cửa sổ.
  • :x[it], ZZ(có chi tiết ). Chỉ viết tệp nếu nó đã được thay đổi và thoát, :xa[ll]* cho tất cả các cửa sổ.

Hủy thay đổi và thoát:

  • :q[uit]! ZQ* Thoát mà không viết, cũng có khi bộ đệm có thể nhìn thấy có thay đổi. Không thoát khi có bộ đệm ẩn thay đổi.
  • :qa[ll]!*, :quita[ll][!]* Thoát Vim, tất cả các thay đổi đối với bộ đệm (bao gồm cả ẩn) đều bị mất.

Nhấn Returnđể xác nhận lệnh.

Câu trả lời này không tham chiếu tất cả Vim viết và thoát các lệnh và đối số. Thật vậy, chúng được tham chiếu trong tài liệu Vim .

Vim có trợ giúp tích hợp rộng rãi, gõ Esc:helpReturnđể mở nó.

Câu trả lời này được lấy cảm hứng từ một câu hỏi khác , ban đầu được tác giả bởi @dirvine và được chỉnh sửa bởi những người dùng SO khác. Tôi đã bao gồm thêm thông tin từ tài liệu tham khảo Vim, bình luận SO và một số nguồn khác. Sự khác biệt cho Vi và Vim cũng được phản ánh.


81

Nếu bạn muốn thoát mà không lưu trong Vim yêu cầu Vim trả về mã thoát khác không, bạn có thể sử dụng :cq.

Tôi sử dụng điều này mọi lúc vì tôi không thể bận tâm đến việc chuyển sang màu hồng !. Tôi thường chuyển mọi thứ cho Vim mà không cần phải lưu trong một tệp. Chúng tôi cũng có một trình bao bọc SVN lẻ tại nơi làm việc phải được thoát với giá trị khác không để hủy đăng ký.


19
Tôi cũng sử dụng điều này để hủy bỏ một cam kết git, hoặc visudo, hoặc crontab, Mạnh
Josh Lee

Hủy bỏ một cam kết git với :q!hoạt động tốt, vì git đang kiểm tra một tin nhắn không trống và không phải là mã thoát không.
moopet

Tôi biết nó hoạt động, chỉ là: cq không yêu cầu phím shift. :-)
Sue Spence

47

Đây là trường hợp xấu nhất khi thoát Vim nếu bạn chỉ muốn ra ngoài, không biết bạn đã làm gì và bạn không quan tâm điều gì sẽ xảy ra với các tệp bạn đã mở.

Ctrl-cEnterEnterviEnterCtrl-\Ctrl-n:qa!Enter

Điều này sẽ giúp bạn ra ngoài hầu hết thời gian.

Một số trường hợp thú vị mà bạn cần một cái gì đó như thế này:

  • iCtrl-ovg (bạn vào chế độ chèn, sau đó là chế độ trực quan và sau đó là chế độ chờ xử lý)

  • QappendEnter

  • iCtrl-ogQCtrl-r=Ctrl-k (cảm ơn porges cho trường hợp này)

  • :set insertmode(đây là trường hợp khi đưa Ctrl-\Ctrl-nbạn trở lại chế độ bình thường)


Chỉnh sửa: Câu trả lời này đã được sửa chữa do các trường hợp trên. Nó từng là:

EscEscEsc:qa!Enter

Tuy nhiên, điều đó không hoạt động nếu bạn đã vào chế độ Ex. Trong trường hợp đó, bạn sẽ cần phải làm:

viEnter:qa!Enter

Vì vậy, một lệnh hoàn chỉnh cho "Tôi không muốn biết những gì tôi đã làm và tôi không muốn lưu bất cứ điều gì, tôi chỉ muốn ra ngay bây giờ!" sẽ là

viEnterEscEscEsc:qa!Đi vào


6
@cavalcade Đây là một phương pháp cực kỳ chung để đảm bảo trình chỉnh sửa ở chế độ bình thường sau đó thoát an toàn. Trong sử dụng bình thường, tất cả những gì bạn cần là :qhoặc:wq
Dan Passaro

6
Không đủ chung chung! Nếu tôi (người mới bắt đầu) gõ i<Ctrl-O>gQ<Ctrl-R>=<Ctrl-K>thì sao?
porges

@porges cảm ơn cho trường hợp thử nghiệm! Ngoài ra còn có một số trường hợp thử nghiệm khác chứng minh rằng phương pháp ban đầu là tồi tệ. Tôi chỉnh sửa câu trả lời để chung chung hơn bây giờ.
Heikki Naski

@HeikkiNaski ít nhất đối với tôi Tôi cũng cần Enter sau Ctrl-C (để thoát khỏi thanh ghi biểu thức)
porges

40

Trong trường hợp bạn cần thoát Vim ở chế độ dễ (trong khi sử dụng -ytùy chọn), bạn có thể vào chế độ Vim bình thường bằng cách nhấn Ctrl+ Lvà sau đó bất kỳ tùy chọn thoát bình thường nào cũng sẽ hoạt động.


7
Một tùy chọn khác: bạn có thể sử dụng Ctrl+Ođể tạm thời rời khỏi chế độ INSERT rồi nhập :q. Thủ thuật với sự kết hợp này cũng hữu ích trong vim thông thường để thực hiện lệnh đơn và quay trở lại chế độ INSERT.
Andrey Starodubtsev

28

Vim có ba chế độ hoạt động: Chế độ đầu vào, Chế độ lệnh & Chế độ Ex.

Chế độ nhập - mọi thứ bạn nhập, tất cả các tổ hợp phím đều được lặp lại trên màn hình.

Chế độ lệnh hoặc chế độ Thoát - mọi thứ bạn nhập trong chế độ này được hiểu là một lệnh.

Chế độ Ex - đây là một trình soạn thảo khác, ví dụ. Nó là một trình soạn thảo dòng. Nó hoạt động trên mỗi dòng hoặc dựa trên một loạt các dòng. Trong chế độ này, :xuất hiện ở dưới cùng của màn hình. Đây là biên tập viên cũ.

Để thoát Vim, bạn có thể thoát trong khi bạn ở chế độ ex hoặc ở chế độ lệnh. Bạn không thể thoát Vim khi bạn ở chế độ đầu vào.

Thoát khỏi chế độ cũ

  1. Bạn cần chắc chắn rằng bạn đang ở chế độ Lệnh. Để làm điều đó, chỉ cần nhấn Escphím.

  2. Chuyển đến chế độ ex bằng cách bấm :phím

  3. Sử dụng bất kỳ kết hợp nào sau đây trong chế độ cũ để thoát:

    :q- thoát :q!- thoát mà không lưu :wq- lưu và thoát hoặc viết và thoát :wq!- giống như wq, nhưng buộc phải ghi trong trường hợp quyền truy cập tệp chỉ đọc :x- ghi và thoát :qa- thoát tất cả. hữu ích khi nhiều tệp được mở như:vim abc.txt xyz.txt

Thoát khỏi chế độ lệnh

  1. Nhấn phím thoát. Bạn có thể đã làm điều này rồi nếu bạn đang ở chế độ lệnh.

  2. Nhấn vốn ZZ ( shift zz) - lưu và thoát

  3. Nhấn vốn ZQ ( shift zq) - thoát mà không lưu.


3
Cái bạn đang gọi là "chế độ ex" thực sự được gọi là chế độ dòng lệnh . Nó cho phép bạn nhập các lệnh ex, nhưng với một số khác biệt quan trọng .
jpaugh

1
Hừm không. Bạn đang quên chế độ trực quan.
Pryftan

26

Sau khi nhấn ESC(hoặc cmd+ Ctrên máy tính của tôi), bạn phải nhấn :để dấu nhắc lệnh xuất hiện. Sau đó, bạn có thể nhập quit.

Bạn có thể thấy rằng máy sẽ không cho phép bạn thoát vì thông tin của bạn chưa được lưu. Nếu bạn muốn thoát bằng mọi cách, hãy nhập !trực tiếp sau khi thoát (nghĩa là :quit!).


19

Tôi đã nhận được Vim bằng cách cài đặt ứng dụng khách Git trên Windows. :qsẽ không thoát Vim cho tôi. :exittuy nhiên ...


1
Tương tự như vậy đối với vim làm git trên macffy, nó hoạt động.
Joel

1
@Joel chỉ cần kiểm tra điều này trên máy mac của tôi, cả hai lệnh đều hợp pháp ( vim -version7.3).
Nick Volynkin

2
Đối với Git Bashtrên các cửa sổ, Vimđôi khi ESCkhông làm việc. sử dụng CTRL+ [thay thế.
Val

@Val Trông quen lạ lạ. Iirc đó là bởi vì hai người làm điều tương tự. Như trong ^[là giống như ESC. Thật thú vị khi Windows làm cho nó phức tạp hơn. Và thú vị.
Pryftan

10

Câu hỏi đã được hỏi ở đây .

Các qlệnh với một số đóng split được đưa ra trong vị trí đó.

:q<split position>hoặc :<split position>qsẽ đóng sự phân chia ở vị trí đó.

Giả sử bố cục cửa sổ Vim của bạn như sau:

-------------------------------------------------
|               |               |               |
-------------------------------------------------
|               |               |               |
|               |               |               |
|    Split 1    |    Split 2    |     Split 3   |
|               |               |               |
-------------------------------------------------

Nếu bạn chạy q1lệnh, nó sẽ đóng phân chia đầu tiên.q2sẽ đóng tách thứ hai và ngược lại.

Thứ tự của vị trí phân chia trong lệnh thoát không quan trọng. :2qhoặc :q2sẽ đóng tách thứ hai.

Nếu vị trí phân chia bạn chuyển đến lệnh lớn hơn số lần phân tách hiện tại, nó sẽ chỉ đơn giản là đóng phân tách cuối cùng.

Ví dụ: nếu bạn chạy q100cài đặt trên cửa sổ ở trên, nơi chỉ có ba phần tách, nó sẽ đóng phần tách cuối cùng (Tách 3).

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.