基础能力系列 - Vim的使用

Posted 搬砖魁首

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础能力系列 - Vim的使用相关的知识,希望对你有一定的参考价值。

vi和vim它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。vi使用于文本编辑,但是vim更适用于coding。


本文旨在抛砖引玉, 求将vim作为IDE的牛人的个性化配置

模式

vi有3个模式:插入模式、命令模式、低行模式。

  • 插入模式:在此模式下可以输入字符,按ESC将回到命令模式。
  • 命令模式:可以移动光标、删除字符等。
  • 低行模式:可以保存文件、退出vi、设置vi、查找等功能(低行模式也可以看作是命令模式里的)。

常用命令

一、打开文件、保存、关闭文件(命令模式下使用)

vi filename 	//打开filename文件 
:w       		//保存文件 
:w xxxx.txt 	//保存至xxxx.txt文件 
:q          	//退出编辑器,如果文件已修改请使用下面的命令 
:q!        		//退出编辑器,且不保存 
:wq           	//退出编辑器,且保存文件 
shift+zz        //退出编辑器,且保存文件		[*]

二、插入文本或行(命令模式下使用,执行下面命令后将进入插入模式,按ESC键可退出插入模式)

a		//在当前光标位置的右边添加文本 
i		//在当前光标位置的左边添加文本 			[*]
A		//在当前行的末尾位置添加文本 
I		//在当前行的开始处添加文本(非空字符的行首) 
O		//在当前行的上面新建一行 
o		//在当前行的下面新建一行 					[*]
R		//替换(覆盖)当前光标位置及后面的若干文本 
J		//合并光标所在行及下一行为一行(依然在命令模式) 

三、其它常用命令

u		//撤消
e! 		//放弃修改,重新回到文件打开时的状态
~ 		//修改光标下字符的大小写 				[*]

dd		//删除光标所在行 						[*]
v		//进入可视化模式(可移动光标选择文本)
y		//复制 								[*]
p		//将剪贴板中的内容粘贴到光标位置之后
P		//将剪贴板中的内容粘贴到光标位置之前
yw		//复制一个单词
y2w		//复制 2 个单词
y$		//复制从当前光标到行结尾的所有单词
y0		//复制从当前光标到行首的所有单词
yy		//复制一整行 						[*]
2yy		//复制从当前光标所在行开始的 2 行
V		//选中一整行							[*]
Vp		//粘贴一整行							[*]

:%s/old/new/g //将文本中所有的字符串 old 替换为 new [*]

四、标签页

标签页的新建
:tabedit file
:tab split

标签页的切换
:tabn/tabp
或使用按键:gt/gT

标签页的关闭
:tabclose 关闭当前的标签页,:tabonly

五、多窗口(分隔)

分割窗口
split/vsplit filename
可简写为sp/vs filename	 [推荐]

窗口间跳转
ctrl+w h/j/k/l
ctrl+w w				[推荐]

vim窗口移动
ctrl+w H/J/K/L

调整窗口尺寸
ctrl+w +/- 调整窗口的高度
ctrl+w </> 调整窗口的宽度
ctrl+w = 所有的窗口设置相同的尺寸
:resize n 将当前窗口尺寸调整为 N 行

关闭窗口
close: 关闭一个窗口
qall: 退出所有窗口
qall!: 放弃修改,退出所有窗口
wqall: 保存并退出所有窗口
wall: 保存所有窗口

个性化配置

  • 基本的配置,缩进显示行号等
  • 文件创建时间, 给每个 C/C++ 文件添加头部,作者等信息
  • F5 编译执行 C/C++源代码 (需要安装clang)
  • Ctrl + F 利用用 astyle 格式化代码 (需要安装astyle)
  • 使用 clang_complete 对代码进行补全 (需要安装clang, Ctrl+n, Ctrl+p)

vim ~/.vimrc

set number
syntax on

" -- New file .h .c .cpp, add file header --
autocmd BufNeWFile *.[ch],*.cpp exec ":call CFileHeader()"
func CFileHeader()
        call setline(0, "// File:    ".strftime(expand('%d')))
        call append(line("."), "// Author:  ryan (email)")
        call append(line(".")+0, "// Date:    " .strftime("%Y/%m/%d %H:%M:%S"))
        call append(line(".")+1, "")
        exec "$"
endfunc


" -- .c .cpp .h file indent --
autocmd BufEnter *.[ch],*.cpp exec ":call CFileIndent()"
func CFileIndent()
        set cindent
        set tabstop=3
        set softtabstop=3
        set expandtab
        set shiftwidth=3
endfunc


" -- Use Astyle to format code, <Ctrl + F> --
func CodeFormat()
        exec "w"
        if &filetype == "h"
                exec "!astyle -n --style=kr -s3 %"
        elseif &filetype == "c"
                exec "!astyle -n --style=kr -s3 %"
        elseif &filetype == "cpp"
                exec "!astyle -n --style=google %"
        endif
endfunc
map <C-F> :call CodeFormat() <CR>


" -- F4 compile and run code --
func CompileC()
        exec "w"
        let compilecmd = "!clang "
        if search("math\\.h") != -1
                let compileflag .= "-lm"
        endif
        exec compilecmd." % ".compileflag
endfunc
func CompileCpp()
        exec "w"
        let compilecmd = "!clang++ "
        let compileflag = ""
        exec compilecmd." % ".compileflag
endfunc
func CompileRun()
        exec "w"
        if &filetype == "c"
                exec "call CompileC()"
        elseif &filetype == "cpp"
                exec "call CompileCpp()"
        endif
        exec "! ./a.out"
endfunc
map<F4> <ESC> :call CompileRun() <CR>


" use clang_complete complete code
let g:clang_library_path = '/usr/lib/llvm-10/lib'

练练手

vim test.cpp

#include <iostream>
#include <string>

using namespace std;

int main() 
    cout << "hello world" << endl;
    return 0;


g++ -o test main.cpp | ./test

以上是关于基础能力系列 - Vim的使用的主要内容,如果未能解决你的问题,请参考以下文章

Vim系列 - 修改换行符

Vim 初学者入门指南

SUNLORDINC顺络电子小尺寸大电流铁氧体磁珠PZ0603系列

linux基础----vim编辑器

基础能力系列 - GDB的使用

Vim系列 - 开启终端