如何退出 Vim?

5242

我被卡住了,无法逃脱。它显示:

type :quit<Enter> to quit VIM

但当我输入时,它只是出现在对象正文中。


207
你只是想退出VIM吗?如果是这样,请按"Esc"键,然后输入':q'。 - Pop
74
不要忘记冒号!你需要输入 :quit 然后按下 [ENTER] 键。 - Farahmand
156
学习 vim 的基础知识非常容易,而且它已经内置在你的系统中。在终端中输入“vimtutor”。25分钟后,你将比使用通常的文本编辑器更快! - Mark Robson
14
在这里查看更多命令:http://www.fprintf.net/vimCheatSheet.html。 - Toni
138
为了防止将来使用 git commit 命令时进入 vim 编辑器,可以执行以下命令进行设置: git config --global core.editor="nano"。该命令会将默认编辑器设置为 nano。 - Tom Kelly
显示剩余8条评论
13个回答

6259

按下Esc键进入“正常模式”,然后您可以输入:进入“命令行模式”。一个冒号(:)会出现在屏幕底部,您可以输入以下其中之一的命令。要执行命令,请按Enter键。

  • :q 退出(缩写为:quit
  • :q! 退出而不保存(缩写为:quit!
  • :wq 写入并退出
  • :wq! 写入并退出,如果文件没有写入权限,则尝试强制写入
  • :x 写入并退出;与:wq类似,但仅在修改后才写入(缩写为:exit
  • :qa 退出全部(缩写为:quitall
  • :cq 退出,不保存,并带有非零退出代码以指示失败(缩写为:cquit

您也可以直接从“正常模式”退出Vim,方法是键入ZZ保存并退出(与:x相同),或者键入ZQ仅退出(与:q!相同)。 (请注意,大小写很重要。 ZZzz的含义不同。)

Vim有广泛的帮助功能-您可以使用:help命令访问,其中可以找到所有问题的答案和初学者教程。


24
除非您重新映射了Esc键或在您的.vimrc文件中进行了奇怪的映射,否则它应该正常工作。如果使用Linux系统,请执行xev命令,确保按下Esc键时能够获取到Escape键类型。 - dirvine
32
如果你无法使用 Esc 键(比如我,因为我的 shell 在 TotalTerminal 中),请记住你可以使用 Ctrl+C 替代。更多信息请参考 http://vim.wikia.com/wiki/Avoid_the_escape_key。 - dotnetCarpenter
33
:x等同于ZZ,但是:x:wq不同。:x只有在文件发生更改时才会写入文件,而:wq始终会写入文件(即使使用inotify)。 - Hauleth
58
说实话,我使用vim的帮助系统比使用vim本身更困难,大多依赖于快速参考卡片和在线文档。 - bgvaughan
27
如果您没有文件的权限,但具有sudo权限,则可以使用 :w ! sudo tee% 命令进行保存。 - tvlooy
显示剩余13条评论

452

图片胜过一千条Unix命令和选项:

这里输入图片描述

我每学期向我的学生们展示这个图,他们似乎之后就能掌握vi了。

Vi是一个具有三种主要状态的有限状态机

它开始于命令模式,在该模式下,您使用非常短的按键序列盲目执行编辑器功能。 您知道您在做什么; 这不适合菜鸟。

当您想要实际编辑文本时,应使用某些按键进入插入模式; 常见的按键包括:

  • i:在光标前插入
  • I:移到行首并插入
  • a:在光标后面追加
  • A:移到行尾并追加
  • o:在当前行下方打开新行
  • O:在当前行上方打开新行
  • R:进入替换模式(类似于插入模式)

现在来回答问题:如何退出。

您可以从EX模式中退出vi:

  • q-如果您没有进行任何修改,或在此之前保存了它们
  • q!-忽略任何修改并退出
  • wq-保存并退出
  • x-这与wq类似

wx接受文件名参数。 如果vi已经知道要使用的文件名(例如它是使用vi file启动的),则无需再次在此处提供文件名。

最后,最重要的是:如何进入EX模式?

EX模式是为了处理长命令而设计的,你可以在屏幕底部看到你所输入的命令。从命令模式,按冒号:键,一个冒号会出现在底部,然后输入相应的命令。

从插入模式,你需要按ESC(Escape键)回到命令模式,然后输入冒号来进入EX模式。

如果你不确定,按ESC键就可以回到命令模式。

一种可靠的方法是使用ESC-:-x-Enter组合键,这样可以保存并退出文件。


19
谢谢,这张图片非常有帮助。然而,对我来说,按下"w"键并没有从Ex模式切换到命令模式,但是按下"Esc"键可以。我做错了什么? - Nick Volynkin
4
如果您键入 w-Enter,将保存您的文件并返回到命令模式。我编写这个命令是为了让您全面了解保存和退出命令。 - Gergely
6
哦,你的意思是 :w。那么这就很合理了。顺便问一下,有没有一个命令可以从磁盘重新加载文件(也就是撤销更改但不关闭文件)?如果有的话,它可以放在图表中与 w 命令相邻。 - Nick Volynkin
37
你所标注的“命令”模式实际上是“普通”模式。你所标注的“Ex”模式实际上是“命令”模式。但“Ex”模式确实是另一种完全不同的模式! - jpaugh
3
@Gergely 好的,我终于找到了 Vim 文档::help vim-modes - jpaugh
显示剩余12条评论

206

在输入命令前,按下Esc键。输入后,按下Return键确认。

Esc会结束当前命令并将Vim切换到正常模式。此时,如果你按下:,冒号会出现在屏幕的底部。这表明你正在输入命令而不是编辑文件。

大多数命令都有缩写形式,并可加上方括号表示可选参数:c[ommand]

带有星号(*)的命令是仅适用于Vim的(在Vi中未实现)。

安全退出(如果有未保存的更改则失败):

  • :q[uit] 退出当前窗口。如果这是最后一个窗口,则退出Vim。如果当前缓冲区已进行更改,此操作将失败。
  • :qa[ll]* 退出所有窗口和Vim,除非存在一些已更改的缓冲区。

提示退出(如果有未保存的更改则提示)

  • :conf[irm] q[uit]* 退出,但当存在已更改的缓冲区时,会给出提示。
  • :conf[irm] xa[ll]* 写入所有更改的缓冲区并退出Vim。当某些缓冲区无法写入时会弹出提示。

保存更改并退出:

  • :wq 写入当前文件(即使它没有被更改)并退出。当文件为只读或缓冲区没有名称时,写入失败。:wqa[ll]*适用于所有窗口。
  • :wq!相同,但可以写入只读文件。:wqa[ll]!*适用于所有窗口。
  • :x[it]ZZ(有关详细信息)。仅在更改时写入文件并退出,:xa[ll]*适用于所有窗口。
  • 放弃更改并退出:

    • :q[uit]! ZQ*不写入退出,即使可见缓冲区有更改。 当存在更改的隐藏缓冲区时不退出。
    • :qa[ll]!*, :quita[ll][!]*退出Vim,所有缓冲区(包括隐藏的)的更改都将丢失。

    Return键确认命令。

    此答案未涵盖所有Vim的写入和退出命令及参数。实际上,它们在Vim文档中有所涉及。

    Vim具有广泛的内置帮助,输入Esc:helpReturn即可打开它。

    此答案受到其他答案的启发,最初由@dirvine编写,由其他SO用户进行了编辑。我还包括了来自Vim参考、SO评论和其他一些来源的更多信息。 Vi和Vim的差异也得到了反映。


    105
    如果你想在Vim中退出而不保存,并且使Vim返回非零退出代码,你可以使用:cq
    我经常使用它,因为我不想要按下!键。我经常将不需要保存在文件中的东西传输到Vim。我们在工作中还有一个奇怪的SVN包装器,必须以非零值退出才能中止提交。

    33
    我也会用这个来取消 git 提交、编辑 visudo 或 crontab 等操作。 - Josh Lee
    3
    使用 :q! 中止 Git 提交是可行的,因为 Git 检查的是提交信息是否为空,而不是退出代码是否为非零。 - moopet
    5
    我知道它能用,只是 :cq 不需要按 Shift 键。 :-) - Sue Spence

    98

    这是一个终极的命令,适用于最糟糕的情况。如果你想要退出 Vim,在不知道自己做了什么的情况下,并且你不在乎打开的文件会发生什么,那么请使用以下命令:

    Ctrl-cEnterCtrl-\Ctrl-nEnter:qa!Enter

    大部分时候,这个命令可以帮助你成功退出。

    你可能天真地认为只需要按几次 Esc 然后输入 :qa! 就可以退出了。但事实并非如此。

    以下各种情况说明了按 Esc 并不足够:

    • iCtrl-ovg(首先进入插入模式,然后进入可视模式,接着进入操作挂起模式)

    • QappendEnter

    • iCtrl-ogQCtrl-r=Ctrl-k(感谢 porges 提供的该案例)

    • iCtrl-ogQCtrl-r=inputdialog('foo','bar')Enter

    • :set insertmode(这是一种情况,当按下 Ctrl-\Ctrl-n 时,会返回正常模式)


    13
    这是一种非常通用的方法,可确保编辑器处于正常模式,然后安全退出。在正常使用情况下,您只需要使用:q:wq - Dan Passaro
    9
    不够通俗易懂!如果我(一个初学者)输入 i<Ctrl-O>gQ<Ctrl-R>=<Ctrl-K> 呢? - porges
    2
    @porges 感谢你提供的测试用例!还有一些其他的测试用例证明了原始方法的糟糕。我现在已经编辑了答案,使其更加通用。 - Heikki Naski
    @HeikkiNaski 至少对我来说,我需要在按下 Ctrl-C 后再按 Enter(以退出表达式寄存器)。 - porges
    在执行了这些步骤之后,我仍然卡住了。 - 6infinity8

    53

    如果您需要在使用-y选项的情况下以简易模式退出Vim,只需按下Ctrl + L即可进入正常的Vim模式,然后任何正常的退出选项都将起作用。


    9
    另一个选择是,您可以使用 Ctrl+O 暂时退出插入模式,然后输入 :q。这个组合技巧在普通的 Vim 中也很有用,可以执行单个命令并返回到插入模式。 - Andrey Starodubtsev

    43

    Vim有三种操作模式:输入模式、命令模式和Ex模式。

    输入模式 - 输入的所有内容都会在屏幕上显示。

    命令模式或逃脱模式 - 在该模式下输入的所有内容都被解释为命令。

    Ex模式 - 这是另一个编辑器,ex。它是一款逐行编辑器,可以基于一系列行进行操作。在这种模式下,屏幕底部会出现一个:符号,表示进入了ex编辑器。

    要退出Vim,您可以在ex模式或命令模式下退出,但不能在输入模式下退出。

    从Ex模式退出

    1. 确保您处于命令模式下。只需按下Esc键即可。

    2. 按下:键,进入ex模式。

    3. 在ex模式下,使用以下任意组合来退出:

      :q - 退出 :q! - 不保存退出 :wq - 保存并退出 :wq! - 强制写入并退出(如果文件权限为只读) :x - 写入并退出 :qa - 全部退出。在打开多个文件时非常有用,例如:vim abc.txt xyz.txt

    从命令模式退出

    1. 按下Esc键。如果您已经处于命令模式下,则可能已经这样做了。

    2. 按下大写的ZZ(Shift+Z+Z)- 保存并退出

    3. 按下大写的ZQ(Shift+Z+Q)- 不保存退出。


    5
    你所称的“ex 模式”实际上被称为“命令行模式”,它允许你输入 ex 命令,但是与“ex 模式”有一些重要区别。请参考链接了解详情:http://vimdoc.sourceforge.net/htmldoc/intro.html#Ex-mode。 - jpaugh
    1
    嗯,不对。你忘记了可视模式。 - Pryftan
    保存并退出插入模式:Alt Z Z 也就是说,按下:alt-shift-z 然后 shift-z 有趣的事实:从插入模式中,您可以通过按住 Alt 键和命令字符来退出到命令模式并执行命令。 - David Lotts
    我认为你所说的“ex模式”是正常或“命令”模式。要进入ex模式,您必须按Q键。在该模式下,您可以连续输入一个命令而无需每次按:。要退出ex模式,您可以键入:vi:visual - void

    37

    按下ESC(或在我的电脑上按下cmd+C),然后必须按下:才能打开命令提示符。接着,你可以输入quit来退出。

    你可能会发现机器不允许你退出,因为你的信息尚未保存。如果你仍想退出,请在quit之后直接输入!(即:quit!)。


    31

    我通过在Windows上安装Git客户端来获得Vim。:q对我来说无法退出Vim。:exit可以成功退出...


    1
    同样地,在Macintosh上使用vim进行git操作是有效的。 - Joel
    1
    @Joel刚在我的Mac上检查了一下,这两个命令都是合法的(vim -version 7.3)。 - Nick Volynkin
    2
    在Windows上的Git Bash中,有时在VimESC键无法正常工作。此时可以使用CTRL + [代替。 - Val
    1
    @Val 看起来很熟悉。如果我没记错的话,那是因为这两个东西做的事情是一样的。也就是说,^[ESC 是一样的。有趣的是,Windows 让它变得更加复杂了。这很有趣,也很有趣味性。 - Pryftan

    17

    q命令加上数字可以关闭该位置的拆分。

    :q<split position>:<split position>q将关闭该位置的拆分。

    假设您的Vim窗口布局如下:

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

    如果你运行q1命令,它将关闭第一个分屏。q2将关闭第二个分屏,反之亦然。
    退出命令中的分屏位置顺序无关紧要。:2q:q2都将关闭第二个分屏。
    如果您传递给命令的分屏位置大于当前分屏数,则会简单地关闭最后一个分屏。
    例如,在上面的窗口设置中运行q100命令,其中只有三个分屏,则会关闭最后一个分屏(Split 3)。 问题已在这里提出。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接