15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
08.10.2024

如何在Ubuntu上使用Vi/Vim编辑器:完整技术参考

ViVim(Vi Improved)是模态化、键盘驱动的文本编辑器,完全在终端内运行,使其成为Ubuntu和其他Linux发行版上服务器管理、远程配置编辑和脚本工作流中不可或缺的工具。Vim在Vi的基础上扩展了语法高亮、多级撤销、分屏窗口、插件支持和可脚本化配置层——同时消耗极少的系统资源。

如果您管理VPS托管环境或裸机服务器,熟练掌握Vim不是可选项——而是一项基础技能。SSH会话并不总是有GUI访问权限,而Vim几乎在您接触过的每个基于Unix的系统上都普遍可用。

为什么Vim仍然主导服务器环境

现代IDE功能强大,但当您在凌晨2点通过SSH连接到无头Ubuntu服务器调试损坏的Nginx配置时,它们毫无用处。Vim的模态设计意味着每次击键都是一个命令——没有鼠标依赖,没有渲染开销,也没有图形层引入的延迟。

系统管理员依赖Vim的主要原因:

  • 零外部依赖:可通过任何SSH连接工作,包括低带宽或高延迟链路
  • 一致的可用性:在Debian、Ubuntu、CentOS、Alpine以及几乎所有Linux发行版上预装或可轻松安装
  • 规模化速度:一旦建立肌肉记忆,在Vim中编辑数千行配置文件、日志文件或脚本比任何GUI编辑器都更快
  • 可脚本化:Vim内置脚本语言(Vimscript)和Lua支持(在Neovim中)允许完全自动化重复性编辑任务

在Ubuntu上安装Vim

Ubuntu附带一个最小化的`vim-tiny`包,缺少语法高亮、多文件支持和许多高级功能。要获得完整功能,请安装完整包:

“`bash

sudo apt update

sudo apt install vim -y

“`

要验证已安装的版本并确认完整功能支持:

“`bash

vim –version

“`

在功能标志中查找`+syntax`、`+clipboard`、`+python3`和`+multi_byte`。`-`前缀表示该功能已从二进制文件中编译排除。如果您需要这些功能但它们不存在,请改为安装`vim-gtk3`或`vim-nox`:

“`bash

sudo apt install vim-nox -y # Headless full-feature build

sudo apt install vim-gtk3 -y # GTK3 build with clipboard integration

“`

关键边缘情况:在最小化Ubuntu服务器镜像上——例如Docker容器或cloud-init引导的独立服务器中使用的镜像——甚至`vi`也可能不存在。在这种情况下,在尝试任何配置文件编辑之前,请明确安装`vim`。

打开、创建和恢复文件

“`bash

vim filename.txt # Open existing file or create new one

vim /etc/nginx/nginx.conf # Open a system configuration file (use sudo if needed)

sudo vim /etc/ssh/sshd_config # Edit privileged files

vim +42 filename.txt # Open file and jump directly to line 42

vim +/searchterm file.txt # Open file with cursor on first match of searchterm

“`

交换文件恢复:Vim在编辑期间自动创建一个隐藏的交换文件(`.filename.txt.swp`)。如果您的会话崩溃或SSH连接断开,重新打开同一文件,Vim将提示您恢复未保存的更改。始终先选择`(R)ecover`,保存恢复的内容,然后用`:e`后跟`:!rm ~/.filename.txt.swp`删除交换文件,或运行`vim -r filename.txt`。

这种恢复机制在编辑生产服务器上的关键配置文件时尤为宝贵——连接断开并不意味着工作丢失。

理解Vim的模态架构

Vim的模态设计是需要内化的最重要概念。与每次击键都插入字符的标准编辑器不同,Vim将导航、编辑和命令执行分为不同的模式。

模式激活方式主要用途
**普通模式**`Esc`(打开时默认)导航、删除、复制、粘贴、宏执行
**插入模式**`i`、`a`、`o`、`O`、`I`、`A`输入和插入文本
**可视模式**`v`(字符)、`V`(行)、`Ctrl+v`(块)选择文本范围
**可视块模式**`Ctrl+v`基于列的选择和编辑
**命令行模式**`:`文件操作、搜索/替换、设置、外部命令
**替换模式**`R`覆盖现有字符
**Ex模式**`Q`批量命令执行(交互式使用较少)

最常见的初学者错误是在普通模式下按键期望出现文本,然后当`dd`删除一行或`gg`跳转到文件顶部时感到恐慌。始终通过检查屏幕左下角来确认当前模式——插入模式显示`– INSERT –`,可视模式显示`– VISUAL –`,普通模式不显示任何内容。

普通模式下的导航命令

高效导航是区分仅仅能用Vim的用户和真正快速用户的关键。按优先级顺序学习这些命令:

基本光标移动

按键操作
`h`向左移动一个字符
`l`向右移动一个字符
`j`向下移动一行
`k`向上移动一行
`w`跳转到下一个单词的开头
`b`跳转到上一个单词的开头
`e`跳转到当前单词的末尾
`0`跳转到行首
`^`跳转到行中第一个非空白字符
`$`跳转到行尾

文件级导航

按键操作
`gg`跳转到文件第一行
`G`跳转到文件最后一行
`:42`跳转到第42行
`Ctrl+f`向前滚动一整页
`Ctrl+b`向后滚动一整页
`Ctrl+d`向下滚动半页
`Ctrl+u`向上滚动半页
`%`跳转到匹配的括号、圆括号或花括号
`*`跳转到光标下单词的下一个出现位置
`#`跳转到光标下单词的上一个出现位置

高级用户提示:在任何移动命令前加上数字可重复执行。`5j`向下移动5行。`3w`向前跳3个单词。`10dd`删除10行。这个数字乘数适用于几乎所有普通模式命令,是快速编辑的关键。

进入和退出插入模式

按键行为
`i`在光标前插入
`a`在光标后追加
`I`在行首插入
`A`在行尾追加
`o`在下方新建一行并进入插入模式
`O`在上方新建一行并进入插入模式
`s`删除光标下的字符并进入插入模式
`S`删除整行并进入插入模式
`Esc` 或 `Ctrl+[`返回普通模式

关键习惯:养成在完成文本插入后立即按`Esc`的反射。在打算导航时停留在插入模式是大多数意外编辑的根源。

保存、退出和文件管理

这些命令从命令行模式执行(先按`:`):

命令操作
`:w`保存(写入)当前文件
`:w filename.txt`保存为新文件名
`:q`退出(仅在没有未保存更改时)
`:q!`强制退出,丢弃所有未保存的更改
`:wq` 或 `:x`保存并退出
`ZZ`保存并退出(普通模式快捷键)
`ZQ`不保存退出(普通模式快捷键)
`:w !sudo tee %`保存未使用sudo权限打开的文件

`:w !sudo tee %`技巧是服务器管理员的必备知识。当您在没有sudo的情况下打开`/etc/fstab`等系统文件并进行更改时,无法用`:w`保存。此命令通过`sudo tee`管道传输缓冲区内容,以提升权限写入文件——无需关闭并重新打开Vim。

编辑操作:删除、复制、粘贴和撤销

Vim的编辑模型建立在操作符+动作的基础上。操作符(如`d`用于删除或`y`用于复制)与动作(如`w`用于单词或`$`用于行尾)组合,创建精确的编辑操作。

核心编辑命令

命令操作
`x`删除光标下的字符
`X`删除光标前的字符
`dd`删除(剪切)整个当前行
`D`从光标删除到行尾
`dw`从光标删除到单词末尾
`d$`从光标删除到行尾
`d0`从光标删除到行首
`yy` 或 `Y`复制整个当前行
`yw`从光标复制到单词末尾
`p`在光标后粘贴(或在当前行下方粘贴整行复制内容)
`P`在光标前粘贴(或在当前行上方粘贴)
`u`撤销上次更改
`Ctrl+r`重做上次撤销的更改
`.`重复上次更改(Vim中最强大的命令之一)
`~`切换光标下字符的大小写
`>>`将当前行缩进一级
`<<`将当前行减少缩进一级

`.`(点)命令可以说是初学者中最未被充分利用的Vim功能。它重复您的上一个复合操作——如果您用`dw`删除了一个单词,按`.`会删除下一个单词。如果您用`cw`更改了一个单词并输入了替换内容,`.`会将相同的替换应用于下一个出现位置。这消除了在大型文件中重复手动编辑的需要。

可视模式:精确文本选择

可视模式提供三种选择粒度:

  • `v` — 字符级可视选择
  • `V` — 行级可视选择(选择整行)
  • `Ctrl+v` — 块级可视选择(列编辑)

选择后,应用操作符:

按键对选择的操作
`d`删除选中文本
`y`复制选中文本
`c`更改(删除并进入插入模式)
`>`缩进选择
`<`减少缩进选择
`~`切换选择的大小写
`:`进入命令行模式并预填充范围

块可视模式(`Ctrl+v`)实际使用案例:您有一个配置文件,需要通过在15个连续行前添加`#`来注释掉它们。用`Ctrl+v`选择这些行的第一列,用`j`向下导航,按`I`(大写i),输入`#`,然后按`Esc`。Vim同时将插入应用于每个选中的行。这是一项在大多数其他编辑器中需要正则表达式或手动重复的任务。

搜索和替换

搜索

“`

/pattern Search forward for pattern (regex supported)

?pattern Search backward for pattern

n Jump to next match

N Jump to previous match

  • Search forward for word under cursor

Search backward for word under cursor

:noh Clear search highlighting

“`

搜索和替换语法

“`

:%s/old/new/g Replace all occurrences in entire file

:%s/old/new/gc Replace all with confirmation prompt for each

:%s/old/new/gi Case-insensitive replace across entire file

:10,20s/old/new/g Replace only within lines 10 through 20

:'<,'>s/old/new/g Replace within visually selected range

:%s/bwordb/new/g Replace whole word only (word boundary anchors)

“`

正则表达式支持:Vim使用其自己的正则表达式方言。`b`单词边界、`d`用于数字、`s`用于空白,以及`+`(一个或多个)均可用。对于扩展正则表达式语法,使用`v`前缀:`:%s/v(foo|bar)/baz/g`匹配”foo”或”bar”并替换为”baz”。

处理多个文件、缓冲区和分屏窗口

这是Vim在复杂编辑会话中最能体现其强大功能的地方。

缓冲区

缓冲区是文件的内存表示。Vim可以同时保持多个缓冲区打开。

“`

:e filename Open a file into a new buffer

:ls or :buffers List all open buffers

:b2 Switch to buffer number 2

:bnext or :bn Switch to next buffer

:bprev or :bp Switch to previous buffer

:bd Delete (close) current buffer

“`

分屏窗口

“`

:split filename Horizontal split, open file in upper pane

:vsplit filename Vertical split, open file in right pane

Ctrl+w h/j/k/l Navigate between split panes

Ctrl+w = Equalize split pane sizes

Ctrl+w q Close current pane

“`

标签页

“`

:tabnew filename Open file in a new tab

:tabnext or gt Switch to next tab

:tabprev or gT Switch to previous tab

:tabclose Close current tab

“`

实际场景:带cPanel的VPS上编辑Web服务器配置时,您可能需要在编辑虚拟主机文件时交叉参考主`nginx.conf`。用`:vsplit /etc/nginx/nginx.conf`在垂直分屏中打开两个文件,用`Ctrl+w l`和`Ctrl+w h`在窗格间导航——无需关闭一个文件来查阅另一个。

使用.vimrc配置Vim

主目录中的`.vimrc`文件是Vim的持久配置。每次Vim启动时,它都作为Vimscript执行。

“`bash

vim ~/.vimrc

“`

推荐的生产服务器配置

“`vim

" Display settings

set number " Show absolute line numbers

set relativenumber " Show relative line numbers (great for jump commands)

set cursorline " Highlight the current line

set scrolloff=8 " Keep 8 lines visible above/below cursor when scrolling

" Indentation

set autoindent " Copy indent from current line on new line

set smartindent " Context-aware indentation for code

set expandtab " Convert tabs to spaces

set tabstop=4 " Tab width = 4 spaces

set shiftwidth=4 " Indentation width for >> and <<

" Search behavior

set hlsearch " Highlight all search matches

set incsearch " Show matches as you type

set ignorecase " Case-insensitive search

set smartcase " Override ignorecase if search contains uppercase

" Usability

set mouse=a " Enable mouse in all modes

syntax on " Enable syntax highlighting

set encoding=utf-8 " Default encoding

set clipboard=unnamedplus " Use system clipboard for yank/paste

set undofile " Persist undo history across sessions

set undodir=~/.vim/undo " Directory for persistent undo files

" Visual

set showmatch " Briefly jump to matching bracket

set laststatus=2 " Always show status line

set wildmenu " Enhanced command-line completion

“`

重要提示:`set undofile`指令创建存储在磁盘上的持久撤销历史。这意味着您可以关闭文件,几天后重新打开,仍然可以撤销上次会话的更改。在启用此功能之前创建撤销目录:

“`bash

mkdir -p ~/.vim/undo

“`

这在对生产系统上的配置文件进行增量更改时特别有价值——例如,在运行SSL证书的服务器上调整PHP-FPM设置或调整多个域的SSL参数时。

宏:自动化重复编辑

宏是Vim最强大但最少使用的功能之一。宏记录一系列击键并重放它们。

“`

qa Start recording macro into register 'a'

[actions] Perform any sequence of Normal/Insert mode commands

q Stop recording

@a Replay macro stored in register 'a'

@@ Replay the last executed macro

10@a Replay macro 'a' ten times

“`

实际示例:您有一个包含200行的CSV文件,需要将每行的第二个字段用双引号括起来。在第一行录制宏,用`199@a`重放199次,转换在不到一秒内完成。无需编写脚本。

标记和跳转

标记允许您在文件中为位置添加书签并立即跳回。

“`

ma Set mark 'a' at current cursor position

'a Jump to the line of mark 'a'

`a Jump to the exact position of mark 'a'

'' Jump back to position before last jump

Ctrl+o Jump to previous position in jump list

Ctrl+i Jump to next position in jump list

:marks List all current marks

“`

Vim vs. Nano vs. Emacs:选择正确的终端编辑器

功能VimNanoEmacs
**学习曲线**陡峭(模态系统)极低非常陡峭
**启动时间**近乎即时近乎即时较慢
**内存使用**非常低非常低中等至高
**语法高亮**完整基本完整
**插件生态系统**丰富极少丰富
**宏支持**原生,强大原生
**分屏窗口**支持不支持支持
**远程编辑**原生通过SSH原生通过SSHTRAMP协议
**配置复杂度**中等(.vimrc)极低高(Elisp)
**最适合**高级用户、系统管理员快速编辑、初学者开发者、Lisp用户

对于服务器管理任务——编辑配置文件、编写Shell脚本、查看日志——Vim提供了功能、可用性和速度的最佳平衡。当您无法承受认知开销时,Nano可用于一次性编辑。Emacs对于生活在终端中的开发者来说是合理的选择,但其资源占用和启动时间使其在受限服务器环境中不够实用。

常见陷阱及如何避免

1. 在没有备份的情况下编辑生产文件

在编辑关键系统文件之前,始终创建备份:

“`bash

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

sudo vim /etc/nginx/nginx.conf

“`

2. 忘记使用sudo

如果您在没有sudo的情况下打开特权文件并进行更改,请使用`:w !sudo tee %`保存而不丢失编辑内容。

3. 混淆寄存器

当您用`dd`删除文本时,它进入默认寄存器`"`。如果您随后用`yy`复制某些内容,删除的文本将被覆盖。要在删除之前保留复制内容,请使用命名寄存器:`"ayy`复制到寄存器`a`,`"ap`从中粘贴。

4. 在共享系统上留下交换文件

`/tmp`或工作目录中的Vim交换文件可能会混淆其他用户或自动化进程。在`.vimrc`中配置专用交换目录:

“`vim

set directory=~/.vim/swap//

“`

末尾的双斜杠使Vim在交换文件名中编码完整文件路径,防止冲突。

5. 跨平台文件的行尾问题

如果您编辑源自Windows的文件,它可能有CRLF(`rn`)行尾。Vim将在每行末尾显示`^M`。用以下命令修复:

“`bash

:%s/r//g

“`

实用关键要点清单

在Vim会话之前和期间,将此作为快速参考决策矩阵:

  • 在编辑任何生产文件之前:用`cp file file.$(date +%Y%m%d%H%M%S).bak`创建带时间戳的备份
  • 模式意识:如果击键没有插入文本,按`Esc`并确认您的模式
  • 快速保存习惯:每次重要更改后按`Esc`然后`:w`——不要等到最后
  • 临时使用`:set number`如果您需要导航到特定行且`.vimrc`中没有设置
  • 对于全局搜索/替换:在盲目运行`:%s/old/new/g`之前,始终先用`:%s/old/new/gc`(带确认)测试
  • 打开时的交换文件提示:始终选择`(R)ecover`,保存内容,然后删除交换文件
  • 对于列编辑:使用`Ctrl+v`块可视模式而不是手动重复
  • 持久撤销:在您定期管理的任何服务器的`.vimrc`中配置`set undofile`
  • 剪贴板集成:如果`p`粘贴了意外内容,检查`set clipboard=unnamedplus`是否已设置以及`xclip`或`xsel`是否已安装
  • 有疑问时:`:help keyword`打开任何命令或选项的内置文档

无论您是在共享虚拟主机环境中管理配置文件,还是在独立服务器上维护复杂基础设施,Vim的效率会随时间复利增长——您内化的每个命令都会永久消除工作流中的摩擦。

常见问题

问:Ubuntu上Vi和Vim有什么区别?

现代Ubuntu系统上的`vi`通常是以兼容模式运行的`vim`的符号链接,或指向`vim-tiny`。真正的Vi是1976年的原始编辑器,没有语法高亮、没有多级撤销、没有插件支持。Vim在Vi的基础上增加了100多个功能,同时与Vi键绑定保持完全向后兼容。

问:如果我完全卡住了,如何退出Vim?

多次按`Esc`确保处于普通模式,然后输入`:q!`并按Enter。这将强制退出而不保存。如果这也失败了(罕见,但在递归命令状态下可能发生),先按`Ctrl+c`,然后按`:q!`。

问:Vim可以通过SSH编辑文件而无需将其复制到本地吗?

可以。使用`vim scp://user@hostname//path/to/file`通过SCP直接编辑远程文件。Vim透明地处理传输。或者,使用`rsync`拉取文件,在本地编辑,然后推回——这对大文件更快。

问:如何为Vim无法识别的特定文件类型启用语法高亮?

运行`:set filetype=nginx`(或`python`、`yaml`、`bash`等)为当前会话手动分配文件类型。要为特定文件扩展名永久设置,请在`.vimrc`中添加`autocmd BufRead,BufNewFile *.conf set filetype=nginx`。

问:Neovim是否比Vim更适合服务器使用?

对于纯服务器管理任务,标准Vim已足够且更普遍可用。Neovim提供基于Lua的配置、更好的异步插件支持和内置LSP客户端——这些优势主要对开发工作流有意义。在只安装必要软件的生产服务器上,Vim仍然是务实的选择。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用