ฉันจะออกจากโปรแกรมแก้ไข Vim ได้อย่างไร?


3765

ฉันติดอยู่และหนีไม่พ้น มันบอกว่า:

"type :quit<Enter> to quit VIM"

แต่เมื่อฉันพิมพ์มันก็จะปรากฏขึ้นในร่างกายของวัตถุ


131
คุณแค่พยายามออกจาก VIM หรือไม่? หากเป็นกรณีนี้ให้กด "escape" จากนั้นพิมพ์ ': q'
ป๊อป

47
อย่าลืมลำไส้ใหญ่ ! คุณควรพิมพ์:quitแล้วกด[ENTER]ปุ่ม
Farahmand

88
มันง่ายมากที่จะเรียนรู้พื้นฐานของเสียงเรียกเข้าและมันถูกสร้างไว้ในระบบของคุณ ในเทอร์มินัลประเภท "vimtutor" 25 นาทีต่อมาคุณจะเร็วกว่าโปรแกรมแก้ไขข้อความทั่วไป!
Mark Robson

4
ตรวจสอบคำสั่งเพิ่มเติมที่นี่
โทนี

78
เพื่อป้องกันgit commitการส่งคุณไปเป็นกลุ่มในอนาคต: git config --global core.editor="nano"
Tom Kelly

คำตอบ:


4902

กดEscปุ่มเพื่อเข้าสู่ "โหมดปกติ" จากนั้นคุณสามารถพิมพ์:เพื่อเข้าสู่ "โหมดบรรทัดคำสั่ง" เครื่องหมายโคลอน ( :) จะปรากฏที่ด้านล่างของหน้าจอและคุณสามารถพิมพ์คำสั่งอย่างใดอย่างหนึ่งต่อไปนี้ เพื่อรันคำสั่งให้กดEnterปุ่ม

  • :q เพื่อออก (ย่อมาจาก:quit)
  • :q!เพื่อเลิกโดยไม่บันทึก (ย่อมาจาก:quit!)
  • :wq เพื่อเขียนและออก
  • :wq! การเขียนและออกจากไฟล์แม้ว่าไฟล์จะมีสิทธิ์อ่านเท่านั้น (หากไฟล์ไม่มีสิทธิ์เขียน: บังคับให้เขียน)
  • :x เพื่อเขียนและออก (คล้ายกับ:wqแต่เขียนถ้ามีการเปลี่ยนแปลงเท่านั้น)
  • :exitเพื่อเขียนและออก (เหมือน:x)
  • :qaเพื่อออกจากทั้งหมด (ย่อมาจาก:quitall)
  • :cq การเลิกโดยไม่บันทึกและทำให้ Vim ส่งคืนข้อผิดพลาดที่ไม่ใช่ศูนย์

คุณสามารถออกจาก Vim ได้โดยตรงจาก "โหมดปกติ" โดยพิมพ์ZZเพื่อบันทึกและออก (เหมือน:x) หรือZQเพียงแค่ออก (เหมือน:q!) (โปรดสังเกตว่ากรณีนี้มีความสำคัญที่นี่ZZและzzไม่ได้หมายถึงสิ่งเดียวกัน)

เสียงเรียกเข้ามีความช่วยเหลือมากมาย - ซึ่งคุณสามารถเข้าถึงได้ด้วย:helpคำสั่ง - ซึ่งคุณสามารถค้นหาคำตอบสำหรับคำถามทั้งหมดของคุณและแบบฝึกหัดสำหรับผู้เริ่มต้น


15
นอกจากว่าคุณจะแมป esc ใหม่หรือมีการทำแผนที่แปลก ๆ ใน. vimrc ของคุณก็ควรทำเช่นนั้น หากใช้ linux ให้พิมพ์ xev และตรวจสอบให้แน่ใจว่า escape เป็นแป้นพิมพ์ที่คุณได้รับเมื่อคุณกดปุ่ม Escape
dirvine

17
จำไว้ว่าคุณสามารถใช้ ctrl + c หากคุณไม่สามารถใช้ Esc (เช่นฉันได้เพราะเชลล์ของฉันอยู่ใน TotalTerminal) vim.wikia.com/wiki/Avoid_the_escape_key
dotnetCarpenter

25
:x== ZZแต่:x! :wq= :xเขียนไฟล์ iff ไฟล์มีการเปลี่ยนแปลง:wqเขียนไฟล์เสมอ (ไม่ว่าคือเมื่อใช้inotify)
Hauleth

36
พูดตามตรงฉันมีเวลายากขึ้นในการใช้ระบบความช่วยเหลือของ vim มากกว่าการใช้ vim เองและส่วนใหญ่พึ่งพาบัตรอ้างอิงรวดเร็วและเอกสารออนไลน์
bgvaughan

18
หากคุณไม่มีสิทธิ์ในไฟล์ แต่มีสิทธิ์ sudo:w ! sudo tee %
tvlooy

189

รูปภาพมีมูลค่านับพันคำสั่งและตัวเลือก Unix:

ป้อนคำอธิบายภาพที่นี่

ฉันวาดสิ่งนี้ให้กับนักเรียนทุกภาคการศึกษาและพวกเขาดูเหมือนจะเข้าใจ vi หลังจากนั้น

vi เป็นเครื่องสถานะ จำกัดมีเพียงสามสถานะ

เมื่อเริ่มต้น vi จะเข้าสู่โหมดคำสั่งที่คุณสามารถพิมพ์สั้นคำสั่งตัวอักษรไม่กี่สุ่มสี่สุ่มห้า คุณรู้ว่าคุณกำลังทำอะไร นี่ไม่ใช่สำหรับมือสมัครเล่น

เมื่อคุณต้องการแก้ไขข้อความจริงคุณควรไปที่โหมด INSERT ด้วยคำสั่งหนึ่งตัวอักษร:

  • i: ไปที่ INSERT แทนเคอร์เซอร์
  • ฉัน: ไปที่โหมดแทรกที่จุดเริ่มต้นของบรรทัด
  • a: ผนวกหลังเคอร์เซอร์
  • ตอบ: ต่อท้ายบรรทัด
  • o: เปิดบรรทัดใหม่ด้านล่างบรรทัดปัจจุบัน
  • O: เปิดขึ้นบรรทัดใหม่ในตำแหน่งของบรรทัดปัจจุบัน

ตอนนี้ตอบคำถาม: ออก

คุณสามารถออกจาก vi จากโหมด EX:

  • ถาม: หากคุณยังไม่ได้ทำการแก้ไขใด ๆ หรือบันทึกไว้ล่วงหน้า
  • q !: ละเว้นการแก้ไขและออก
  • wq: บันทึกและออก
  • x: นี่เท่ากับ wq

wและxยอมรับพารามิเตอร์ชื่อไฟล์ หากคุณเริ่ม vi ด้วยชื่อไฟล์คุณไม่จำเป็นต้องให้ชื่อนี้อีก

ในที่สุดสิ่งที่สำคัญที่สุด: คุณจะเข้าถึงโหมด EX ได้อย่างไร

โหมด EX ใช้สำหรับคำสั่งแบบยาวที่คุณสามารถเห็นการพิมพ์ที่บรรทัดล่างสุดของหน้าจอ จากโหมด COMMAND คุณกดโคลอน:และเครื่องหมายโคลอนจะปรากฏที่บรรทัดล่างซึ่งคุณสามารถพิมพ์คำสั่งด้านบนได้

จากโหมด INSERT คุณจะต้องกด ESC เช่นปุ่ม Escape ไปที่โหมด COMMAND จากนั้น: เพื่อไปที่โหมด EX

หากคุณไม่แน่ใจให้กด ESC และจะนำคุณเข้าสู่โหมดคำสั่ง

ดังนั้นวิธีการที่มีประสิทธิภาพคือ ESC -: - x-Enter ซึ่งจะบันทึกไฟล์และการออก


5
ขอบคุณรูปภาพมีประโยชน์มาก อย่างไรก็ตามสำหรับฉันwไม่ได้เปลี่ยนจากโหมด Ex เป็น Command แต่Escทำได้ ผมทำอะไรผิดหรือเปล่า?
Nick Volynkin

2
หากคุณเขียน w-Enter ที่บันทึกไฟล์ของคุณและกลับไปที่โหมดคำสั่ง ฉันเขียนมันเพื่อให้เห็นภาพเต็มของคำสั่งบันทึก & ออก
Gergely

3
:wโอ้ดังนั้นคุณหมายถึง จากนั้นก็ทำให้รู้สึกที่สมบูรณ์แบบ โดยวิธีการมีคำสั่งโหลดจากดิสก์ (นั่นคือเพื่อยกเลิกการเปลี่ยนแปลง แต่ไม่ปิดไฟล์)? ถ้าเป็นเช่นนั้นมันอาจจะอยู่ถัดจากwในแผนภาพ
Nick Volynkin

2
@Gergely ฉันเพิ่งพบความสับสน! จากเอกสารโหมดปกติจะเรียกว่าโหมดคำสั่ง ! ดังนั้นโหมดคำสั่ง! = โหมดบรรทัดคำสั่ง ว้าว!
jpaugh

2
@NickVolynkin คำสั่งที่จะโหลดจากดิสก์:e(หรือมีโอกาสมากขึ้น:e!เพราะมันจะเตือนคุณเกี่ยวกับการเปลี่ยนแปลงที่ไม่ได้บันทึกโดยไม่ได้!)
JDS

177

ก่อนที่คุณจะใส่คำสั่งกดEscคีย์ หลังจากที่คุณป้อนให้กดReturnเพื่อยืนยัน

Escเสร็จสิ้นคำสั่งปัจจุบันและสวิทช์เป็นกลุ่มที่จะโหมดปกติ ตอนนี้ถ้าคุณกด:ที่:จะปรากฏที่ด้านล่างของหน้าจอ สิ่งนี้เป็นการยืนยันว่าคุณกำลังพิมพ์คำสั่งและไม่แก้ไขไฟล์

c[ommand]คำสั่งส่วนใหญ่จะมีตัวย่อที่มีส่วนหนึ่งที่เป็นตัวเลือกในวงเล็บ:

คำสั่งที่มีเครื่องหมาย '*' เป็นเสียงเรียกเข้าเท่านั้น (ไม่ได้ใช้ใน Vi)

Safe-quit (ล้มเหลวหากมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก):

  • :q[uit] ออกจากปัจจุบันหน้าต่าง ออกเป็นกลุ่มถ้านี่เป็นหน้าต่างสุดท้าย นี้ล้มเหลวเมื่อมีการเปลี่ยนแปลงได้ทำในปัจจุบันบัฟเฟอร์
  • :qa[ll]* ออกจากหน้าต่างและกลุ่มทั้งหมดยกเว้นว่ามีบัฟเฟอร์บางส่วนที่มีการเปลี่ยนแปลง

พร้อมต์ออก (พร้อมท์หากมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก)

  • :conf[irm] q[uit]* ออกจาก แต่ให้พรอมต์เมื่อมีบัฟเฟอร์บางส่วนที่มีการเปลี่ยนแปลง
  • :conf[irm] xa[ll]* เขียนบัฟเฟอร์ที่เปลี่ยนแปลงทั้งหมดแล้วออกจากกลุ่ม แสดงพรอมต์เมื่อไม่สามารถเขียนบัฟเฟอร์บางตัวได้

เขียน (บันทึก) การเปลี่ยนแปลงและออกจาก:

  • :wqเขียนไฟล์ปัจจุบัน (แม้ว่าจะไม่ได้เปลี่ยนแปลง) และออกจาก การเขียนล้มเหลวเมื่อไฟล์เป็นแบบอ่านอย่างเดียวหรือบัฟเฟอร์ไม่มีชื่อ :wqa[ll]* สำหรับ windows ทั้งหมด
  • :wq!เหมือนกัน แต่เขียนไฟล์แบบอ่านอย่างเดียว :wqa[ll]!* สำหรับ windows ทั้งหมด
  • :x[it], ZZ(มีรายละเอียด ) เขียนไฟล์เฉพาะในกรณีที่มีการเปลี่ยนแปลงและออกจาก:xa[ll]* สำหรับหน้าต่างทั้งหมด

ยกเลิกการเปลี่ยนแปลงและออกจาก:

  • :q[uit]! ZQ* เลิกโดยไม่ต้องเขียนนอกจากนี้เมื่อบัฟเฟอร์ที่มองเห็นมีการเปลี่ยนแปลง ไม่ออกเมื่อมีการเปลี่ยนแปลงบัฟเฟอร์ที่ซ่อนอยู่
  • :qa[ll]!*, :quita[ll][!]* Quit Vim การเปลี่ยนแปลงทั้งหมดในบัฟเฟอร์ (รวมถึงซ่อนอยู่) จะหายไป

กดReturnเพื่อยืนยันคำสั่ง

คำตอบนี้ไม่ได้อ้างอิงคำสั่งและอาร์กิวเมนต์ของ Vim write and exit ทั้งหมด อันที่จริงพวกเขาจะถูกอ้างถึงในเอกสารที่เป็นกลุ่ม

เป็นกลุ่มมีความช่วยเหลือในตัวมากมายพิมพ์Esc:helpReturnเพื่อเปิด

คำตอบนี้ได้รับแรงบันดาลใจจากคำตอบอีกข้อหนึ่งซึ่งสร้างสรรค์โดย @dirvine และแก้ไขโดยผู้ใช้ SO รายอื่น ฉันได้รวมข้อมูลเพิ่มเติมจากการอ้างอิง Vim ความคิดเห็น SO และแหล่งข้อมูลอื่น ๆ ความแตกต่างของ Vi และ Vim ก็มีผลเช่นเดียวกัน


81

หากคุณต้องการที่จะเลิกโดยไม่บันทึกในที่เป็นกลุ่มและ:cqมีกลุ่มกลับไม่ใช่ศูนย์รหัสทางออกคุณสามารถใช้

ฉันใช้สิ่งนี้ตลอดเวลาเพราะฉันไม่สามารถใส่ใจกับการเปลี่ยนแปลงแบบ Pinky !ได้ ฉันมักจะทำสิ่งต่าง ๆ เป็นกลุ่มซึ่งไม่จำเป็นต้องบันทึกในไฟล์ นอกจากนี้เรายังมีเครื่องห่อ SVN แปลก ๆ ในที่ทำงานซึ่งต้องออกด้วยค่าที่ไม่เป็นศูนย์เพื่อยกเลิกการเช็คอิน


19
ฉันยังใช้สิ่งนี้เพื่อยกเลิกการคอมไพล์คอมไพล์หรือ visudo หรือ crontab, …
Josh Lee

การยกเลิกคอมไพล์ด้วยการ:q!ทำงานได้ดีเนื่องจากการตรวจสอบคอมไพล์สำหรับข้อความที่ไม่ว่างเปล่าและไม่ใช่โค้ดออกที่ไม่ใช่ศูนย์
moopet

ฉันรู้ว่ามันใช้งานได้มันแค่นั้น: cq ไม่ต้องการปุ่ม Shift :-)
Sue Spence

47

นี่เป็นสถานการณ์สมมติที่เลวร้ายที่สุดของการออกเป็นกลุ่มหากคุณต้องการออกไปไม่รู้ว่าคุณทำอะไรไปแล้วและคุณไม่สนใจว่าจะเกิดอะไรขึ้นกับไฟล์ที่คุณเปิด

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

การทำเช่นนี้จะช่วยให้คุณได้เวลาส่วนใหญ่

บางกรณีที่น่าสนใจที่คุณต้องการสิ่งนี้:

  • iCtrl-ovg (คุณเข้าสู่โหมดแทรกจากนั้นโหมดภาพและโหมดดำเนินการค้างอยู่)

  • QappendEnter

  • iCtrl-ogQCtrl-r=Ctrl-k (ขอบคุณ porges สำหรับกรณีนี้)

  • :set insertmode(เป็นกรณีเมื่อCtrl-\Ctrl-nคุณกลับสู่โหมดปกติ)


แก้ไข: คำตอบนี้ได้รับการแก้ไขเนื่องจากกรณีข้างต้น มันเคยเป็น:

EscEscEsc:qa!Enter

อย่างไรก็ตามนั่นไม่ได้ผลถ้าคุณเข้าสู่โหมด Ex ในกรณีนี้คุณต้องทำ:

viEnter:qa!Enter

ดังนั้นคำสั่งที่สมบูรณ์สำหรับ "ฉันไม่ต้องการที่จะรู้ว่าสิ่งที่ฉันได้ทำและฉันไม่ต้องการที่จะบันทึกอะไรเลยฉันแค่ต้องการออกตอนนี้!" อยากจะเป็น

viEnterEscEscEsc:qa!เข้าสู่


6
@Cavalcade นี่เป็นวิธีการทั่วไปอย่างมากในการตรวจสอบให้แน่ใจว่าเครื่องมือแก้ไขอยู่ในโหมดปกติจากนั้นจึงออกอย่างปลอดภัย ในการใช้งานปกติทั้งหมดที่คุณต้องการ:qหรือ:wq
แดน Passaro

6
ไม่ธรรมดาพอ! เกิดอะไรขึ้นถ้าฉัน (มือใหม่) พิมพ์i<Ctrl-O>gQ<Ctrl-R>=<Ctrl-K>?
porges

@porges ขอบคุณสำหรับกรณีทดสอบ! นอกจากนี้ยังมีบางกรณีทดสอบอื่น ๆ ซึ่งพิสูจน์ว่าวิธีการเดิมเป็นเคราะห์ร้าย ฉันแก้ไขคำตอบให้กว้างขึ้นในขณะนี้
Heikki Naski

@HeikkiNaski อย่างน้อยสำหรับฉันฉันต้องการ Enter หลังจาก Ctrl-C เช่นกัน (เพื่อหนีการลงทะเบียนนิพจน์)
porges

40

ในกรณีที่คุณต้องออกจาก Vim โหมดง่าย ๆ (ในขณะที่ใช้งาน-yตัวเลือก) คุณสามารถเข้าสู่โหมด Vim ปกติโดยกดปุ่มCtrl+ Lจากนั้นตัวเลือกการออกปกติใด ๆ จะทำงาน


7
แต่ตัวเลือกอื่น: คุณสามารถใช้Ctrl+Oไปยังโหมด INSERT :qลาชั่วคราวแล้วใส่ เคล็ดลับที่มีการรวมกันนี้มีประโยชน์ในเสียงเรียกเข้าปกติเช่นกันในการดำเนินการคำสั่งเดียวและกลับไปที่โหมด INSERT
Andrey Starodubtsev

28

Vim มีโหมดการทำงานสามโหมด: โหมดอินพุตโหมดคำสั่ง & โหมด Ex

โหมดอินพุต - ทุกสิ่งที่คุณพิมพ์การกดแป้นทั้งหมดจะถูกสะท้อนบนหน้าจอ

โหมดคำสั่งหรือโหมด Escape - ทุกสิ่งที่คุณพิมพ์ในโหมดนี้จะถูกตีความเป็นคำสั่ง

โหมด Ex - นี่คือโปรแกรมแก้ไขอื่นเช่น มันเป็นตัวแก้ไขบรรทัด มันทำงานต่อบรรทัดหรือขึ้นอยู่กับช่วงของเส้น ในโหมดนี้จะมีข้อความ:ปรากฏขึ้นที่ด้านล่างของหน้าจอ นี่คือบรรณาธิการอดีต

ในการออกจากกลุ่มคุณสามารถออกได้ในขณะที่คุณอยู่ในโหมด ex หรือในโหมดคำสั่ง คุณไม่สามารถออกจาก Vim เมื่อคุณอยู่ในโหมดอินพุต

ออกจากโหมด ex

  1. คุณต้องแน่ใจว่าคุณอยู่ในโหมดคำสั่ง ในการทำเช่นนั้นเพียงกดEscปุ่ม

  2. ไปที่โหมด ex โดยกด:ปุ่ม

  3. ใช้ชุดค่าผสมต่อไปนี้ในโหมด ex เพื่อออก:

    :q- เลิก :q!- เลิกโดยไม่บันทึก :wq- บันทึก & เลิกหรือเขียน & เลิก :wq!- เช่นเดียวกับ wq แต่บังคับให้เขียนในกรณีที่สิทธิ์ของไฟล์อ่านได้อย่างเดียว :x- เขียนและเลิก :qa- เลิกทั้งหมด มีประโยชน์เมื่อเปิดหลายไฟล์เช่น:vim abc.txt xyz.txt

ออกจากโหมดคำสั่ง

  1. กดปุ่ม Escape คุณอาจทำสิ่งนี้แล้วถ้าคุณอยู่ในโหมดคำสั่ง

  2. กดปุ่ม ZZ ( shift zz) - บันทึก & ออก

  3. กดปุ่ม ZQ ( shift zq) - ออกโดยไม่บันทึก


3
สิ่งที่คุณกำลังเรียกโหมด "อดีต" ที่เป็นจริงที่เรียกว่าโหมดบรรทัดคำสั่ง จะช่วยให้คุณป้อนคำสั่งอดีต แต่มีบางอย่างที่แตกต่างที่สำคัญ
jpaugh

1
อืมมม คุณกำลังลืมโหมดภาพ
Pryftan

26

หลังจากกดปุ่มESC(หรือcmd+ Cบนคอมพิวเตอร์ของฉัน) คุณต้องกด:เพื่อให้พรอมต์คำสั่งปรากฏขึ้น quitจากนั้นคุณอาจจะใส่

คุณอาจพบว่าเครื่องจะไม่อนุญาตให้คุณออกเนื่องจากข้อมูลของคุณไม่ได้รับการบันทึก หากคุณต้องการออกจากนั้นให้ป้อน!โดยตรงหลังจากออก (เช่น:quit!)


19

ฉันได้เป็นกลุ่มโดยการติดตั้งไคลเอนต์ Git บน Windows :qจะไม่ออกเป็นกลุ่มสำหรับฉัน :exitทำ แต่ ...


1
ในทำนองเดียวกันสำหรับกลุ่มที่ทำ git บน macintosh สิ่งนี้ใช้ได้
Joel

1
@Joel เพิ่งตรวจสอบสิ่งนี้บน mac ของฉันทั้งสองคำสั่งนั้นถูกต้อง ( vim -version7.3)
นิค Volynkin

2
สำหรับGit Bashบน windows ในVimบางครั้งESCไม่ทำงาน ใช้CTRL+ [แทน
Val

@Val ที่ดูคุ้น ๆ Iirc นั่นเป็นเพราะทั้งสองทำสิ่งเดียวกัน ในขณะที่เป็นเช่นเดียวกับ^[ ESCน่าสนใจที่ Windows ทำให้ซับซ้อนขึ้น และน่าขบขัน
Pryftan

10

คำถามถูกถามที่นี่ที่นี่

qคำสั่งที่มีจำนวนปิดแยกให้อยู่ในตำแหน่งนั้น

:q<split position> หรือ :<split position>qจะปิดการแยกในตำแหน่งนั้น

สมมติว่าเลย์เอาต์หน้าต่าง Vim ของคุณเป็นดังนี้:

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

ถ้าคุณเรียกใช้q1คำสั่งมันจะปิดการแยกแรกq2จะปิดการแยกที่สองและในทางกลับกัน

ลำดับของการแยกตำแหน่งในคำสั่ง quit ไม่สำคัญ :2qหรือ:q2จะปิดการแยกที่สอง

หากตำแหน่งแยกที่คุณส่งไปยังคำสั่งมากกว่าจำนวนของการแบ่งปัจจุบันมันจะปิดการแยกล่าสุด

ตัวอย่างเช่นหากคุณเรียกใช้การq100ตั้งค่าหน้าต่างด้านบนที่มีการแยกเพียงสามครั้งการแยกนั้นจะปิดการแยกสุดท้าย (แยก 3)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.