vim开始使用vim


备注

Vim(或“Vi IMproved”)是基于控制台的多模式( 模态 )文本编辑器。它在所有Unix,Linux和Apple OS X系统上都被广泛使用和默认使用。 Vim拥有庞大的活跃社区和广泛的用户群。该编辑器支持所有流行的编程语言,并且可以使用许多插件来扩展其功能。

开发人员喜欢编辑器的速度,许多配置选项和强大的基于表达式的编辑。在“命令”模式下,编辑器由键盘命令控制,因此用户不会被GUI或鼠标指针分心。

Vim基于七十年代创建的早期Unix“vi”编辑器,自1991年以来一直在不断发展。通过宏和插件,编辑器提供了现代IDE的大部分功能。它还能够使用脚本语言(vimscript)和正则表达式处理大量文本。

主要议题:

Vim标准启动消息

版本

发布日期
8 2016年9月12日
7.4 2013年8月10日
7.3 2010-08-15
7.2 2008-08-09
7.1 2007-05-12
7 2006-05-07
6 2001-09-26
5 1998年2月19日
4 1996年5月29日
3.0 1994年8月12日
2.0 1993年12月14日
1.14 1991年11月2日

基本

根据需要多次运行交互式vim教程 ,以便熟悉基础知识。

Vim具有多种模式,例如正常模式插入模式命令行模式

普通模式用于编辑和导航文本。在这种模式下, hjkl 对应光标键 。正常模式下的大多数命令都可以带有“计数”前缀,例如3j 向下移动3行。

插入模式用于直接插入文本,在此模式下,vim类似于其他更简单的文本编辑器。要进入插入模式,请在正常模式下按i 。要离开它,按<ESC><ESC> 键)。

命令行模式用于运行更复杂的命令,如保存文件和退出vim。按: 开始命令行模式。要退出此模式,您也可以按<ESC> 。要保存对文件的更改,请使用:w (或:write )。要在不保存更改的情况下退出vim,请使用:q! (或者:quit! )。

这些是vim中一些更有用的命令:

命令描述
i (插入)在当前光标位置之前进入插入模式
I 在当前行的第一个可打印字符之前进入插入模式
a (append)在当前光标位置进入插入模式
A 在当前行的最后一个可打印字符进入插入模式
x 删除当前光标位置的字符
X 删除左侧的字符到当前光标位置
w 转到下一个词
b 转到上一个词
0 移到行的开头
$ 移到行尾
r replace - 进入一个字符的替换模式。您键入的下一个字符将替换光标下的字符。
R 无限期进入替换模式。您键入的每个字符都将替换光标下的字符并将光标前进一个。
s substitute - 删除当前光标位置的字符,然后进入插入模式
S 删除光标当前所在的当前行并进入插入模式
<Esc><Cc> 退出插入模式并返回正常模式
u 解开
<Cr> 重做
dddwdld$ 切割当前行,从光标到下一个字,或者字符,当前位置到当前行的结尾,注意: D 相当于d$
cccwcl 分别更改当前行,从光标到下一个单词或字符
yyywyly$ yank(“复制”)当前行,从光标到下一个字,或者字符,当前位置到当前行的结尾
pP 分别在当前位置之后或之前放置(“粘贴”)
oO 在当前版本之前或之前创建一个新的空行并进入插入模式
:w 将当前缓冲区写入磁盘
:q!ZQ 没有写作就退出了
:x:wqZZ 写并退出
:help 用帮助文件打开一个窗口
:help {subject} 显示特定主题的帮助
qz 开始记录动作以注册zq 结束记录, @z z 回放动作。 z 可以是任何字母: q 通常用于方便。阅读更多:

退出Vim

要退出Vim,首先按Esc确保您处于正常模式。

  • :q 输入 (如果您有未保存的更改,将阻止您退出 - 简称:退出)

放弃更改并退出Vim:

  • :q! 输入强制退出并放弃更改(简称:quit! ,不要混淆:!q ),
  • ZQ 是一个快捷方式,它的作用与:q!
  • :cq 输入 quit并返回错误(丢弃所有更改,以便编译器不会重新编译此文件)

保存更改并退出Vim:

  • :wq Enter (简写为:write:quit ),
  • :x 输入 (与:wq 相同,但如果文件未更改则不会写入),
  • ZZ 是一个快捷方式,它的作用相同:x (保存工作区并退出编辑器),
  • :[range]wq! 输入 (写下[范围]中的行)

以关闭多个缓冲区立刻(即使在多个窗口和/或制表符),追加信a 上述任何命令 (那些开始: )。例如,要编写并退出所有可以使用的窗口:

  • :wqa 输入
  • :xa Enter - 写入所有已更改的缓冲区并退出Vim。如果存在没有文件名的缓冲区,这些缓冲区只读或由于其他原因而无法写入,Vim将不会退出
  • :xa! 输入 - 写入所有已更改的缓冲区,甚至是只读的缓冲区,然后退出Vim。如果存在没有文件名的缓冲区或由于其他原因而无法写入的缓冲区,则Vim将不会退出
  • :qa Enter - 尝试退出,但如果有任何未保存的文件则停止;
  • :qa! 输入 - 不保存退出(丢弃任何未保存文件中的更改)

如果您在未指定文件的情况下打开了Vim并且想要在退出之前保存该文件,则会收到E32: No file name 消息。您可以使用以下命令保存文件并退出:

  • :wq filename 输入或;
  • :x filename 输入

说明:

键击实际上打开命令模式。该命令q 是一个缩写quitwwritexexit (也可以键入:quit:write:exit ,如果你想)。 : 方式开头的快捷方式: 例如ZZZQ 指的是普通模式键映射。您可以将它们视为快捷方式。

! 有时在命令结束时使用击键来强制执行,这样可以在以下情况下放弃更改:q! 。放置! 在命令的开头有不同的含义。例如,可以输错:!q 而不是:q! 和vim将以127错误终止。

记住这个的简单方法就是想到! 作为一种坚持执行某事的方式。就像你写的时候:“我想戒掉!”

安装

您机器上的Vim(如果有的话)很可能是一个“小”构建,缺乏剪贴板支持,语法高亮甚至是使用插件的功能等有用功能。

如果您需要的只是编辑配置文件的快捷方式,那么这不是问题,但如果您打算让Vim成为主编辑,您很快就会遇到很多问题。

因此,通常建议安装完整的版本。

在Linux / BSD上安装

在这些系统上,诀窍就是安装GUI版本,它带有用于启动GUI的gvim 命令和用于启动TUI的vim 命令。

Arch和Arch-based发行版

$ sudo pacman -R vim
$ sudo pacman -S gvim
 

Debian和基于Debian的发行版

$ sudo apt-get update
$ sudo apt-get install vim-gtk
 

基于Gentoo和Gentoo的发行版

$ sudo emerge --sync
$ sudo emerge app-editors/gvim
 

RedHat和基于RedHat的发行版

$ sudo yum check-update
$ sudo yum install vim-X11
 

Fedora的

$ sudo dnf check-update
$ sudo dnf install vim-X11
 

基于Slackware和Slackware的发行版

$ sudo slackpkg update
$ sudo slackpkg install-new vim-gvim
 

OpenBSD和基于OpenBSD的发行版

$ sudo pkg_add vim-x11
 

FreeBSD和基于FreeBSD的发行版

$ sudo pkg install editors/vim
 

在Mac OS X上安装

该策略类似于Mac OS X:我们安装GUI版本以获得GUI和TUI。最后,我们应该能够:

  • 双击Finder中的MacVim图标,
  • 点击Dock中的MacVim图标,
  • 在shell中发出$ mvim 来打开MacVim GUI,
  • 在shell中发出$ mvim -v 以打开MacVim TUI。

定期安装

像下载任何其他Mac OS X应用程序一样下载并安装官方快照

mvim 捆绑在一起的mvim 脚本放在$PATH 某个位置。

包管理员

MacPorts的:
$ sudo port selfupdate
$ sudo port install macvim
 
家酿:
$ brew install macvim
 

要使MacVim成为默认控制台Vim:

$ brew install macvim --with-override-system-vim
 

在Windows上安装

默认情况下,Windows系统上没有Vim。您可以从Tuxproject站点下载并安装Vim,以获得更多最新和完整的版本,或者您可以从官方Vim站点下载并安装Vim。

巧克力味

> choco install vim
 

从源代码构建Vim

如果上述方法不适合您的需求,仍然可以自己构建Vim, 需要您需要的选项。

本主题将在其自己的部分(目前正在草案中)进行讨论。

互动Vim教程(如vimtutor)

vimtutor 是一个交互式教程,涵盖了文本编辑的最基本方面。

在类UNIX系统上,您可以使用以下命令启动教程:

$ vimtutor
 

在Windows上,可以在Windows菜单中“所有程序”下的“Vim 7.x”目录中找到“Vim tutor”。

有关详细信息,请参阅:help vimtutor

其他交互式教程包括这些基于浏览器的教程:

  • Vim Adventures - 网络上提供的互动游戏版vimtutor。只有前几个级别是免费的。
  • Open Vim - 一个交互式终端,可以通过反馈教您基本命令。
  • Vim Genius - 另一个交互式终端,还包括中级和高级课程,包括宏和arglist。

保存在Vim中编辑的只读文件

有时,我们可能会打开一个文件,我们没有权限在Vim中写入而不使用sudo

使用此命令保存在Vim中编辑的只读文件。

:w !sudo tee > /dev/null %
 

你可以映射到:w!!.vimrc

cmap w!! w !sudo tee > /dev/null %
 

您将看到一个提示,如图所示。

按ENTER或键入命令继续。 [O] K,(L)oad文件:

O ,文件将被保存。它在vi / vim中保持打开状态以进行更多编辑或阅读,您可以通过输入:q! 正常退出:q! 因为该文件仍以只读方式打开。

命令说明

:w ............................ isn't modifying your file in this case, 
   ............................ but sends the current buffer contents to 
   ............................ a substituted shell command
   !sudo ...................... call the shell 'sudo' command
         tee .................. the output of the vi/vim write command is redirected 
                                using the 'tee' command
             > /dev/null ...... throws away the standard output, since we don't need 
                                to pass it to other commands
                         % .... expands to the path of the current file
 

资料来源:

暂停vim

从命令行使用vim ,您可以暂停vim 并返回到提示符,而不会实际退出vim 。因此,您稍后可以从同一提示中恢复您的vim 会话。

正常模式下 (如果没有,按esc到达那里),发出以下任一命令:

:st 进入

:sus 进入

:stop 进入

:suspend 进入

或者,在某些系统上,当处于“ 正常”或“ 可视”模式时,发出Ctrl + Z将具有相同的效果。

注意:如果设置了autowrite ,则将写出包含更改和文件名的缓冲区。加一个!进入之前避免,例如。 :st! 进入

稍后,当您想要返回到vim 会话时,如果您尚未暂停任何其他作业,则发出以下内容将恢复vim作为您的前台作业。

fg 进入

否则,您需要通过发出jobs 输入找到您的vim 会话的作业ID,然后前缀匹配的作业fg %[job ID] 输入例如。 fg %1 输入

发生碰撞时该怎么办

Vim将所有未保存的编辑保存在交换文件中 ,这是一个额外的文件,一旦通过保存提交更改就会被删除。交换文件的名称通常是前面带有a的正在编辑的文件的名称. 并带有.swp 后缀(你可以看到它:sw )。

因此,如果您的vim进程在您有机会保存编辑之前终止,则可以通过使用命令行选项-r 将交换文件中包含的更改应用于当前文件来恢复工作。例如,如果myFile 是您正在编辑的文件,请使用:

$ vi -r myFile
 

恢复未提交的更改。

如果存在交换文件,vim应该提示您仍然需要恢复选项

$ vi myFile
E325: ATTENTION
Found a swap file by the name ".myFile.swp"
...
Swap file ".myFile.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
 

如果选择(R)ecover,则会应用swp 文件中的更改,但不会删除交换文件,因此如果您对恢复感到满意,请不要忘记删除交换文件。