vimrc配置详细步骤、语法以及配置成品

发布于:2025-08-11 ⋅ 阅读:(12) ⋅ 点赞:(0)

在这里插入图片描述


如果现在不太理解下面用的命令的含义,也可以先去看看linux中的基本命令,可能会对此处的配置有所帮助,当然,下面配置并非与linux shell命令有太大关联,大可不必担心
拓展知识链接linux shell命令大全及其详细解释


一、 vimrc所在路径

配置之始,在于知其所在。Vim 的配置分为 全局 (System-wide)用户 (User-specific) 两种。我们的主战场,永远是用户配置,厉害的大师往往会根据不同需求为不同用户配置独特的vimrc

  • 全局配置: 影响系统所有用户,通常位于 /etc/vim/vimrc。了解即可,我们不碰它。
  • 用户配置: 只影响当前用户,这是我们的核心目标
1、配置文件路径一览
类型 配置文件路径 作用域 备注
全局配置 /etc/vim/vimrc/etc/vimrc 系统所有用户 了解即可,不建议新手修改
用户配置 (Vim) ~/.vimrc 当前用户 我们的主战场!
用户配置 (Neovim) ~/.config/nvim/init.vim 当前用户 如果你用的是 Neovim

💡 提示: ~ 代表你的用户主目录 (例如 /home/your_username)。

2、推荐的目录结构

一个清晰的目录结构是良好习惯的开端。.vim 文件夹是你存放所有 Vim 相关文件的地方。

~/.vim/
├── autoload/  # 存放插件的自动加载脚本 (例如插件管理器)
├── plugged/   # (可选) 用于存放插件,由插件管理器创建
└── ... 其他插件相关目录 ...

~/.vimrc       # 你的核心配置文件!

二、查看和配置已配置好的全局配置以及用户配置

1、查看用户配置:在~目录下使用如下命令

不清楚命令含义的,可以先点此链接学习:linux shell命令详解

ls -a

此命令用于列出当前文件夹下所有文件,包括以.开头的隐藏文件,可以看到我们当前用户的用户配置.vimrc文件
在这里插入图片描述

2、查看全局配置:在~目录下使用如下命令

切换目录

cd /etc
或者
cd /etc/vim

查看vimrc文件

ls -a

在这里插入图片描述

3、查看vimrc具体内容
cat .vimrc

在这里插入图片描述


三、创建第一个 vimrc

如果这是你第一次配置,目录下可能还不存在 .vimrc 文件。

  1. 打开终端。
  2. 执行以下命令,若.vimrc文件不存在,会创建并开始编辑它(若文件已存在,则会直接打开)
1、创建并编辑用户配置

一般我们都是编辑用户配置.vimrc

vim ~/.vimrc
2、创建并编辑全局配置
vim /etc/vimrc
或者
vim /etc/vim/vimrc
3、退出编辑
先点击esc,然后输入:q! 

四、 vimrc 语法

vimrc 的内容,本质上就是一行行 Vim 命令。Vim 每次启动时,都会自动执行这个文件里的所有命令,从而完成初始化。理解其语法是定制你专属神器的第一步。

语法基础
1. 注释

以双引号 " 开头的行是注释。Vim 会完全忽略它。随着你的 .vimrc 文件日渐庞大,清晰的注释是你未来维护配置、回忆起“当初我为什么这么写”的救命稻草。
注释格式

" 注释文本

注释也可以写在命令后,依照自己爱好添加注释即可,双引号不要忘记哦

2. 设置选项 (set)

使用 set 命令来开启、关闭或调整 Vim 的功能。选项分为两类:布尔选项 (开关) 和 带值选项 (赋值)。

  • 开启/关闭布尔选项

    • 开启:set <选项名>
    • 关闭:set no<选项名>
    • 切换(如果已开启则关闭,反之亦然):set <选项名>!
    " 开启功能 (e.g., 显示行号)
    set number
    
    " 关闭功能 (e.g., 禁用自动换行)
    set nowrap
    
    " 这是一个切换操作,可以在 Vim 中临时执行来切换行号是否显示
    :set number!
    
  • 设置带值选项

    • 格式:set <选项名>=<值>
    • 注意:等号 = 两侧不能有空格!
    " 设置 Tab 键的显示宽度为 4 个空格
    set tabstop=4
    
    " 设置主题颜色方案
    colorscheme desert
    
  • 查询选项当前值
    在 Vim 的普通模式下,输入以冒号 : 开头的命令来查询。

    " 查询 number 选项的当前状态 (会显示 number 或 nonumber)
    :set number?
    
    " 查询 tabstop 选项的当前值 (会显示 tabstop=4)
    :set tabstop?
    
    " 查看所有被修改过的配置项
    :set
    
    " 查看所有配置项的当前值 (会列出非常多内容)
    :set all
    

    💡 进阶技巧:想知道一个选项的具体作用?使用 :help 命令!例如 :help 'number' (注意选项名要用单引号括起来),Vim 会打开详细的帮助文档。


3. 键盘映射 (map)

键盘映射是 Vim 的精髓,它能将一系列复杂操作绑定到一个简单的快捷键上,是效率提升的核心。

  • 常用映射命令
    Vim 有多种模式,因此映射命令也需要指定模式:

    • nnoremap: Normal Mode (普通模式) - 最常用
    • inoremap: Insert Mode (插入模式)
    • vnoremap: Visual Mode (可视模式,包括字符、行、块选择)
    • cnoremap: Command-line Mode (命令行模式)
    • noremap: 用于普通、可视、操作待决模式(不常用,推荐用更精确的 nnoremapvnoremap

    ⚠️ 重要心法:永远使用 noremap 版本!
    map 系列(如 nmap)是递归的(Recursive),而 noremap 系列(如 nnoremap)是非递归的(Non-Recursive)

    递归映射的陷阱 (一个具体的例子):

    假设你做了以下两个映射:

    1. nmap j 5j (你希望按 j 一次性向下移动5行)
    2. nmap <F2> j (你希望按 F2 执行 j 的功能)

    当你按下 <F2> 时,Vim 会将它展开为 j,然后发现 j 又被映射到了 5j,于是再次展开…最终,Vim 可能会陷入无限循环或者执行一个你意想不到的复杂操作。

    使用 noremap 就能完美解决:

    1. nnoremap j 5j
    2. nnoremap <F2> j

    现在,当你按下 <F2> 时,Vim 会执行最原始的 j 命令(向下移动一行),而不会去查找 j 是否有其他映射。这保证了你的快捷键行为是可预测和稳定的。

  • 映射的语法与特殊键

    • 格式: <模式>noremap <你的快捷键> <要执行的命令>
    • 特殊键表示法:
      • <CR>: 回车键 (Carriage Return),用于执行命令。
      • <Esc>: Esc 键。
      • <Space>: 空格键。
      • <leader>: 领袖键 (一个特殊的前缀,下面会讲)。
      • <C-k>: Ctrl + k
      • <A-k> or <M-k>: Alt + k (在某些终端下可能不工作)
      • <S-k>: Shift + k

五、配置流程

修改配置时,请遵循这个简单高效的流程:

1. 编辑配置:

vim ~/.vimrc

2. 添加或修改配置项,

例如 set cursorline

3. 保存退出

在 Vim 中输入 :wq

4. 应用生效
方法一 (重启大法)

关闭所有 Vim 窗口,再重新打开一个。

方法二 (热重载 - 强烈推荐)

在当前打开的 Vim 中,执行以下命令即可立即应用新配置,无需重启!

:source ~/.vimrc

六、博主使用的vimrc配置

"能使鼠标在vi文档内进行点击
 set mouse-=a
 set nu
 syntax on
 syntax enable
 colorscheme desert
 
  " TagList
 let Tlist_Show_One_File=1
 let Tlist_Exit_OnlyWindow=1
 
 " WinManager
 let g:winManagerWindowLayout='FileExplorer|TagList'
 nmap wm :WMToggle<cr>
 
 " Omnicompletion
 set nocp
 filetype plugin indent on
 set completeopt=longest,menu

 " Indent
 set smartindent
 set expandtab

 " 自动缩进
 set autoindent
 set cindent
 " Tab键的宽度
 set tabstop=4
 " 统一缩进为4
 set softtabstop=4
 set shiftwidth=4

 " 将tab替换为空格
 nmap tt :%s/\t/    /g<CR>

 set foldenable      " 允许折叠  
 set foldmethod=manual   " 手动折叠

 nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR>
 nmap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR>
 nmap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR>
 nmap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR>
 nmap <C-\>e :cs find e <C-R>=expand("<cword>")<CR><CR>
 nmap <C-\>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
 nmap <C-\>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
 nmap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR>

 autocmd BufNewFile *.[ch],*.hpp,*.cpp exec ":call SetTitle()" 
  
 "加入注释
 func SetComment()
	 call setline(1,"/*===============================================") 
	 call append(line("."),   "*   文件名称:".expand("%:t")) 
	 call append(line(".")+1, "*   创 建 者:     ")
	 call append(line(".")+2, "*   创建日期:".strftime("%Y年%m月%d日")) 
	 call append(line(".")+3, "*   描    述:") 
	 call append(line(".")+4, "================================================*/") 
 endfunc

 "定义函数SetTitle,自动插入文件头 
 func SetTitle()
	 call SetComment()
	 if expand("%:e") == 'hpp' 
		 call append(line(".")+10, "#ifndef _".toupper(expand("%:t:r"))."_H") 
		 call append(line(".")+11, "#define _".toupper(expand("%:t:r"))."_H") 
		 call append(line(".")+12, "#ifdef __cplusplus") 
		 call append(line(".")+13, "extern \"C\"") 
		 call append(line(".")+14, "{") 
		 call append(line(".")+15, "#endif") 
		 call append(line(".")+16, "") 
		 call append(line(".")+17, "#ifdef __cplusplus") 
		 call append(line(".")+18, "}") 
		 call append(line(".")+19, "#endif") 
		 call append(line(".")+20, "#endif //".toupper(expand("%:t:r"))."_H") 
	 elseif expand("%:e") == 'h' 
		 call append(line(".")+10, "#endif") 
		 call append(line(".")+10, "") 
		 call append(line(".")+10, "#ifndef _".toupper(expand("%:t:r"))."_H") 
		 call append(line(".")+11, "#define _".toupper(expand("%:t:r"))."_H") 
	 elseif &filetype == 'c' 
"		 call append(line(".")+10,"#include \<strings.h\>") 
"		 call append(line(".")+10,"#include \<stdlib.h\>") 
"		 call append(line(".")+10,"#include \<string.h\>") 
		 call append(line(".")+5,"#include \<stdio.h\>") 
		 call append(line(".")+6,"") 
		 call append(line(".")+7,"int main(int argc, char *argv[])") 
		 call append(line(".")+8,"{ " ) 
		 call append(line(".")+9,"" ) 
		 call append(line(".")+10,"    return 0;") 
		 call append(line(".")+11,"} ") 
	 elseif &filetype == 'cpp' 
		 call append(line(".")+10,"#include \<iostream\>") 
		 call append(line(".")+10,"using namespace std;") 
	 endif
 endfunc

"新建文件后,自动定位到文件第10行
autocmd BufNewFile * normal 10gg



set termencoding=utf-8
set encoding=utf8
set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030

注:此配置中添加了一些插件设置,需要先安装和配置 TagList、WinManager 和 Cscope等,不然需要删除对应部分配置


七、结语

恭喜!你已完成 vimrc 的入门配置,你的 Vim 现在已今非昔比。

这仅仅是万里长征的第一步。Vim 的世界浩瀚无垠,前方还有插件管理 (如 vim-plug, packer)、LSP (语言服务协议)、更高级的窗口管理等你去探索。但请务必牢记最重要的修行法则:

循序渐进,理解你配置中的每一行代码。

你的 .vimrc 将会随着你的技艺一同成长,最终成为你手中那柄独一无二、心手合一的编程利器。祝你修行愉快!


网站公告

今日签到

点亮在社区的每一天
去签到