【Linux】vi/vim 使用技巧

文章目录

1. 简介

vi和vim的历史

vi(Visual editor)是1976年由Bill Joy在Unix操作系统上开发的文本编辑器。它是基于ex编辑器的一个可视化模式,最初设计的目标是提供一个功能强大且轻量的文本编辑工具。

vim(Vi IMproved)是vi的一个改进版,由Bram Moolenaar在1991年发布。vim不仅继承了vi的所有功能,还增加了许多新特性,使其更加强大和灵活。

vi和vim的区别

  • 功能扩展:vim相较于vi增加了许多功能,如语法高亮、代码折叠、插件支持、无限制撤销等。
  • 跨平台支持:vim支持多种操作系统,包括Linux、Windows、macOS等,而vi主要用于Unix系统。
  • 用户体验:vim的用户体验更友好,提供了更多的配置选项和帮助文档。
  • 插件系统:vim拥有强大的插件系统,用户可以根据需要安装各种插件来扩展其功能。

安装vim

在大多数Linux发行版中,vim可能已经预装。如果没有,可以通过以下命令安装:

Ubuntu/Debian
bash 复制代码
sudo apt update
sudo apt install vim
CentOS/RHEL
bash 复制代码
sudo yum install vim
Fedora
bash 复制代码
sudo dnf install vim
macOS

可以使用Homebrew来安装:

bash 复制代码
brew install vim
Windows

可以从Vim官网下载适用于Windows的安装包,或者使用Chocolatey进行安装:

bash 复制代码
choco install vim

安装完成后,可以通过在终端中输入vim来验证安装是否成功。如果看到Vim的启动界面,说明安装成功。

2. 基本操作

启动和退出

启动

在终端中输入vimvi加上文件名来启动编辑器。例如:

bash 复制代码
vim filename.txt

如果文件不存在,vim会创建一个新文件。

退出

在普通模式下,输入以下命令退出vim:

  • :q:退出(如果有未保存的更改,会提示错误)
  • :q!:强制退出,不保存更改
  • :wq:x:保存并退出
  • ZZ:保存并退出(相当于:wq

模式介绍

vim有三种主要模式:普通模式、插入模式和命令模式。

普通模式

普通模式是vim的默认模式。在这个模式下,你可以进行光标移动、删除文本、复制粘贴等操作。启动vim后默认进入普通模式。

常用的普通模式命令:

  • i:进入插入模式
  • ::进入命令模式
  • v:进入可视模式
  • Esc:返回普通模式
插入模式

插入模式用于插入文本。进入插入模式的方法有多种:

  • i:在光标前插入
  • a:在光标后插入
  • o:在当前行下方插入新行
  • I:在行首插入
  • A:在行尾插入

在插入模式下,按Esc键返回普通模式。

命令模式

命令模式用于执行文件操作和设置配置。在普通模式下按:进入命令模式。

常用命令模式命令:

  • :w:保存文件
  • :q:退出
  • :wq:保存并退出
  • :q!:强制退出,不保存更改
  • :e filename:打开文件
  • :set option:设置选项,例如:set number显示行号

光标移动

基本移动

在普通模式下,使用以下键进行基本光标移动:

  • h:左移
  • j:下移
  • k:上移
  • l:右移

其他基本移动命令:

  • 0:移动到行首
  • $:移动到行尾
  • w:移动到下一个单词的开头
  • b:移动到上一个单词的开头
  • gg:移动到文件开头
  • G:移动到文件结尾
高级移动

高级光标移动命令可以帮助你更高效地导航文件:

  • Ctrl + f:向下翻页
  • Ctrl + b:向上翻页
  • Ctrl + d:向下移动半页
  • Ctrl + u:向上移动半页
  • nG:移动到第n行,例如10G移动到第10行
  • :n:移动到第n行,例如:10移动到第10行
  • fx:向右查找字符x,光标停在x上
  • Fx:向左查找字符x,光标停在x上
  • tx:向右查找字符x,光标停在x前
  • Tx:向左查找字符x,光标停在x后
  • ;:重复上一次f、F、t或T命令
  • ,:反向重复上一次f、F、t或T命令

3. 文本编辑

插入文本

在vim中,要插入文本,首先需要进入插入模式。以下是几种进入插入模式的方法:

  • i:在光标前插入
  • I:在行首插入
  • a:在光标后插入
  • A:在行尾插入
  • o:在当前行下方新建一行并插入
  • O:在当前行上方新建一行并插入

在插入模式下,可以像普通文本编辑器一样输入文本。完成后,按Esc键返回普通模式。

删除文本

在普通模式下,可以使用以下命令删除文本:

  • x:删除光标所在的字符
  • X:删除光标前的字符
  • dw:删除从光标位置到下一个单词开头的字符
  • d$:删除从光标位置到行尾的字符
  • dd:删除整行
  • dG:删除从光标位置到文件末尾的所有内容

复制和粘贴

在普通模式下,可以使用以下命令进行复制和粘贴:

  • yy:复制当前行
  • yw:复制从光标位置到下一个单词开头的字符
  • y$:复制从光标位置到行尾的字符
  • yG:复制从光标位置到文件末尾的所有内容
  • p:在光标后粘贴
  • P:在光标前粘贴

撤销和重做

在普通模式下,可以使用以下命令进行撤销和重做:

  • u:撤销上一个操作
  • U:撤销当前行的所有更改
  • Ctrl + r:重做上一个撤销的操作

4. 搜索与替换

基本搜索

搜索文本

在普通模式下,可以使用/?来进行搜索:

  • /pattern:向前搜索pattern
  • ?pattern:向后搜索pattern

例如,要搜索单词example,可以输入/example并按Enter

搜索导航

在搜索结果之间导航:

  • n:跳转到下一个匹配
  • N:跳转到上一个匹配

高级搜索

使用正则表达式

vim的搜索功能支持正则表达式,可以进行更复杂的搜索。例如:

  • /\bword\b:搜索完整的单词word
  • /^\d\{3\}-\d\{2\}-\d\{4\}$/:搜索符合特定格式(如社会安全号码)的字符串
高亮搜索

要高亮显示所有匹配项,可以在vim配置文件(通常是~/.vimrc)中添加以下内容:

vim 复制代码
set hlsearch

或者在vim中输入:

vim 复制代码
:set hlsearch

要关闭高亮显示,可以输入:

vim 复制代码
:set nohlsearch
搜索时忽略大小写

要在搜索时忽略大小写,可以在vim配置文件中添加:

vim 复制代码
set ignorecase

或者在vim中输入:

vim 复制代码
:set ignorecase

要使搜索区分大小写,可以使用:

vim 复制代码
:set noignorecase

或者在搜索模式下使用\c(忽略大小写)和\C(区分大小写),例如:

vim 复制代码
/example\c

文本替换

替换当前行

要在当前行中替换文本,可以使用:

vim 复制代码
:s/old/new/

这会将当前行中的第一个old替换为new。要替换当前行中的所有匹配项,可以使用:

vim 复制代码
:s/old/new/g
替换整个文件

要在整个文件中替换文本,可以使用:

vim 复制代码
:%s/old/new/

这会将文件中的第一个old替换为new。要替换文件中的所有匹配项,可以使用:

vim 复制代码
:%s/old/new/g
替换时确认

如果希望在替换时进行确认,可以添加c标志:

vim 复制代码
:%s/old/new/gc

每次匹配时会提示确认,可以选择:

  • y:替换当前匹配
  • n:跳过当前匹配
  • a:替换所有匹配
  • q:退出替换
  • l:替换当前匹配并退出

5. 文件操作

打开和保存文件

打开文件

在vim中打开文件的方法:

  • 启动vim时指定文件名:

    bash 复制代码
    vim filename.txt
  • 在命令模式下打开新文件:

    vim 复制代码
    :e anotherfile.txt
保存文件

在命令模式下进行保存:

  • :w:保存当前文件
  • :w filename:另存为指定文件名

多文件编辑

打开多个文件

可以在启动vim时指定多个文件:

bash 复制代码
vim file1.txt file2.txt

在vim中切换文件:

  • :n:切换到下一个文件
  • :N:切换到上一个文件
  • :bnext:bn:切换到下一个缓冲区
  • :bprev:bp:切换到上一个缓冲区
  • :ls:列出所有打开的缓冲区
  • :b [number]:切换到指定编号的缓冲区
分屏操作

vim支持分屏以同时查看多个文件:

  • :split filename:sp filename:水平分屏打开文件
  • :vsplit filename:vsp filename:垂直分屏打开文件
  • Ctrl-w w:在分屏之间切换
  • Ctrl-w q:关闭当前分屏
  • Ctrl-w h/j/k/l:在分屏中移动光标

分屏调整:

  • Ctrl-w +:增加当前分屏的高度
  • Ctrl-w -:减少当前分屏的高度
  • Ctrl-w >:增加当前分屏的宽度
  • Ctrl-w <:减少当前分屏的宽度

6. 配置和个性化

vimrc文件配置

vim的配置文件是~/.vimrc,用于存储用户的个性化设置。

创建和编辑vimrc文件

创建或编辑~/.vimrc文件:

bash 复制代码
vim ~/.vimrc

常用配置选项

以下是一些常用的vim配置选项:

行号

显示行号:

vim 复制代码
set number
高亮当前行

高亮当前行:

vim 复制代码
set cursorline
自动缩进

启用自动缩进:

vim 复制代码
set autoindent
语法高亮

启用语法高亮:

vim 复制代码
syntax on
搜索高亮

启用搜索高亮:

vim 复制代码
set hlsearch
忽略搜索大小写

忽略搜索时的大小写:

vim 复制代码
set ignorecase
智能大小写搜索

启用智能大小写搜索(如果搜索模式中有大写字母,则区分大小写,否则不区分):

vim 复制代码
set smartcase

安装和管理插件

vim可以通过多种插件管理器来安装和管理插件,以下是一些流行的插件管理器:

Vundle

Vundle是一个流行的vim插件管理器。

安装Vundle

在命令行中执行以下命令:

bash 复制代码
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
配置Vundle

~/.vimrc中添加以下内容:

vim 复制代码
set nocompatible              " 关闭vi兼容模式
filetype off                  " 必须

" 设置runtime path
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" 这里开始列出插件
Plugin 'VundleVim/Vundle.vim'
" 例如,安装NERDTree插件
Plugin 'preservim/nerdtree'
" 这里结束列出插件
call vundle#end()            " 必须
filetype plugin indent on    " 必须
安装插件

在vim中执行以下命令:

vim 复制代码
:PluginInstall
vim-plug

vim-plug是另一个流行的vim插件管理器。

安装vim-plug

在命令行中执行以下命令:

bash 复制代码
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
配置vim-plug

~/.vimrc中添加以下内容:

vim 复制代码
call plug#begin('~/.vim/plugged')
" 这里开始列出插件
Plug 'junegunn/vim-easy-align'
" 例如,安装NERDTree插件
Plug 'preservim/nerdtree'
" 这里结束列出插件
call plug#end()
安装插件

在vim中执行以下命令:

vim 复制代码
:PlugInstall

7. 高级技巧

宏录制与播放

录制宏
  1. q 进入录制模式。
  2. 按任意字母键(如 a)指定寄存器。
  3. 执行一系列操作。
  4. q 结束录制。
播放宏
  • @a:播放寄存器 a 中的宏。
  • 2@a:播放寄存器 a 中的宏两次。

使用寄存器

基本使用
  • ":指定寄存器。
  • "ayy:将当前行复制到寄存器 a
  • "ap:粘贴寄存器 a 的内容。
查看寄存器内容
  • :reg:显示所有寄存器的内容。

标签和书签

使用标签
  • :tag tagname:跳转到指定标签。
  • Ctrl-]:跳转到光标下的标签。
  • Ctrl-t:返回到上一个标签位置。
使用书签
  • m{a-z}:在当前位置设置书签。
  • '{a-z}:跳转到指定书签。
  • '':返回到上一个位置。

脚本编写

编写vim脚本
  • 脚本文件通常以 .vim 结尾。
  • 使用 :source filename.vim 运行脚本。
基本示例
vim 复制代码
" Hello.vim
echo "Hello, Vim!"

可以通过在vim中执行 :source Hello.vim 来运行这个脚本。

这些高级技巧可以极大地提高你的编辑效率和灵活性。

8. 常见问题与解决方案

常见错误及解决方法

1. 文件无法保存

问题:尝试保存文件时出现"E212: Can't open file for writing"错误。

解决方法

  • 确保你有文件的写权限。如果没有,可以使用 sudo 提升权限:

    bash 复制代码
    sudo vim filename
  • 检查文件路径是否正确。

2. 插件安装失败

问题:使用插件管理器安装插件时出现错误。

解决方法

  • 确保插件管理器已正确安装和配置。
  • 检查网络连接,确保能够访问插件的源地址。
  • 使用 :PlugClean(vim-plug)或 :PluginClean(Vundle)清理无效插件,然后重新安装。
3. 语法高亮不起作用

问题:语法高亮没有启用或不起作用。

解决方法

  • 确保在 ~/.vimrc 中启用了语法高亮:

    vim 复制代码
    syntax on
  • 确保文件类型检测已启用:

    vim 复制代码
    filetype plugin indent on
  • 检查是否安装了正确的语法文件。

4. vim启动慢

问题:vim启动时间过长。

解决方法

  • 检查是否加载了过多的插件,尝试禁用一些不常用的插件。
  • 优化 ~/.vimrc 配置文件,避免重复和冗余设置。
  • 使用 vim --startuptime log.txt 命令生成启动时间日志,分析并优化启动过程。

社区资源推荐

官方文档
在线教程
社区论坛和讨论
插件资源
相关推荐
A小辣椒14 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒18 小时前
TShark:基础知识
linux
AlfredZhao20 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式