【vim】超详细介绍

在这里插入图片描述

安装

安装8.2

默认ubuntu14.04是vim7.4, 用apt升级到8.2

sudo add-apt-repository ppa:jonathonf/vim
sudo apt-get update
sudo apt install vim-gtk3 -- gtk3就可以在有图形和无图形界面系统上均可使用
vim --version查看版本

unix安装路径为/usr/share/vim/vim82

安装中文帮助文档

cd ~/.vim
mkdir -p pack/my/start
git clone https://github.com/yianwillis/vimcdoc.git pack/my/start/vimcdoc
在vim内用:help即可看到中文文档

安装minpac(8版本才有)

git clone https://github.com/k-takata/minpac.git ~/.vim/pack/minpac/opt/minpac

vimrc增加如下

if exists('*minpac#init')
  " Minpac is loaded.
  call minpac#init()
  call minpac#add('k-takata/minpac', {'type': 'opt'})

  " Other plugins
endif

if has('eval')
  " Minpac commands
  command! PackUpdate packadd minpac | source $MYVIMRC | call minpac#update('', {'do': 'call minpac#status()'})
  command! PackClean  packadd minpac | source $MYVIMRC | call minpac#clean()
  command! PackStatus packadd minpac | source $MYVIMRC | call minpac#status()
endif

存盘、重启 Vim 之后,我们就有了三个新的命令,可以用来更新(安装)包、清理包和检查当前包的状态。

通过minpac安装扩展包

下面我们就来试验一下通过 minpac 来安装扩展包。我们在“Other plugins”那行下面加入以下内容:

  " Other plugins
  call minpac#add('tpope/vim-eunuch')
  call minpac#add('preservim/nerdtree') "支持目录预览
  call minpac#add('majutsushi/tagbar') "支持调用链
  call minpac#add('skywind3000/asyncrun.vim')
  call minpac#add('skywind3000/asyncrun.vim') "支持异步
  call minpac#add('yegappan/mru') "最近使用的文件, 用F10 + Tab即可

保存文件,然后我们使用 :PackUpdate 命令。略微等待之后,我们就能看到类似下面的界面:

在这里插入图片描述

这就说明安装成功了。我们可以按 q 来退出这个状态窗口, 此步骤较慢(因需从github拉)

我们也可以使用 :PackStatus 来重新打开这个状态窗口。要删除一个插件,在 vimrc 中删除对应的那行,保存,然后使用 :PackClean 命令就可以了。愿意的话,你现在就可以试一下。

最近编辑的文件

使用

  • :w !sudo tee % https://feihu.me/blog/2014/vim-write-read-only-file/

乱码

在~/.vimrc设置如下

set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1
set enc=utf8
set fencs=utf8,gbk,gb2312,gb18030
  • 中文乱码
    https://jingyan.baidu.com/article/ed2a5d1f9dd87d09f6be17d0.html
vim ~/.vimrc
填入
set encoding=utf-8
set fileencoding=utf-8

已存在交换文件

在这里插入图片描述

无STILL RUNNING, 则说明是上次编辑时, 意外崩溃了, 则按r恢复上次的编辑状态, 再按d删掉上次崩溃时保留的无用文件
有STILL RUNNING, 则说明其他进程正在用vim编辑此文件

  • 试验如下
    先vim 1.txt打开某文件, 输入一些字符, 不保存
    此时kill掉此进程
root@k8s-master-163:~# ps -ef | grep 1.txt
root     46520 19568  0 10:50 pts/4    00:00:00 vim 1.txt

root@k8s-master-163:~# kill -9 46520

重新打开文件, 会提示冲突如下, 会发现没有STILL RUNNING字样

E325: ATTENTION
Found a swap file by the name ".1.txt.swp"
          owned by: root   dated: Tue Apr 19 10:50:52 2022
         file name: ~root/1.txt
          modified: YES
         user name: root   host name: k8s-master-163
        process ID: 46520
While opening file "1.txt"
      CANNOT BE FOUND
(1) Another program may be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r 1.txt"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".1.txt.swp"
    to avoid this message.

Swap file ".1.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

输入r, 按回车, 恢复崩溃前编辑的内容; 并存盘

再次打开文件, 提示文件swap文件较新, 如下

E325: ATTENTION
Found a swap file by the name ".1.txt.swp"
          owned by: root   dated: Tue Apr 19 10:50:52 2022
         file name: ~root/1.txt
          modified: YES
         user name: root   host name: k8s-master-163
        process ID: 46520
While opening file "1.txt"
             dated: Tue Apr 19 10:53:31 2022
      NEWER than swap file!

(1) Another program may be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r 1.txt"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".1.txt.swp"
    to avoid this message.

Swap file ".1.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

此时按d删除交换文件即可

多文件打开

缓冲区的作用是, 如果多个窗口同时对同一个文件编辑, 它们都会汇总在同一个缓冲区中
vim 打开, 然后用:first可回到目录树, 用:n或:N可进入下或上一个文件, 用:bn或:bN可进入下或上一个缓冲区
可用***/*来打开多文件
:args可展示参数列表
:ls可展示各缓冲区列表
<C-^>, 即ctrl+^可快速在两个缓冲区间切换

多窗口编辑

:split(:sp):vsplit(:vsp或:vs), 可用鼠标拖拽分割线, 激活窗口

多标签页编辑

在已有命令行模式命令前加 tab␣ 可以在新标签页中展示命令的结果,如 :tab help 可以在新标签页中打开帮助,:tab split 可以在新标签页中打开当前缓冲区
:tabs 展示所有标签页的列表
:tabnew 或 :tabedit 可以打开一个空白的新标签页,后面有文件名的话则打开该文件
:tabclose 可以关闭当前标签页(如果标签页里只有一个窗口,使用窗口关闭命令 c 应该更快)
:tabnext、gt 或 可以切换到下一个标签页
:tabNext、:tabprevious 、gT 或 可以切换到上一个标签页
:tabfirst 或 :tabrewind 切换到第一个标签页
:tablast 切换到最后一个标签页
:tab sp:tab 新文件
:tab help可在新tab打开帮助文档
:tab new 新文件名创建新文件

NERDTree插件

在这里插入图片描述

安装

如果使用 minpac 的话,我们需要在 vimrc 中“Other plugins”那行下面加入下面的语句,并运行 :PackUpdate 来安装一下:

call minpac#add('preservim/nerdtree')

使用

:NERDTreeToggle:e .
顾名思义,这个插件以树形方式展示文件系统,在目录上敲回车或双击即可打开或关闭光标下的目录树。
在文件上敲回车或双击立即打开该文件,并且光标跳转到文件窗口中,这样你就可以立即开始编辑了。
在文件上使用 go 会预览该文件,也就是光标不会跳转到文件所在的窗口中,方便快速查看多个文件的内容。
按 i 会打开文件到一个新的水平分割的窗口中,按 s 会打开文件到一个新的竖直分割的窗口中,按 t 会打开文件到一个新的标签页中。
NERDTree 会自动过滤隐藏文件和目录,但如果你需要看到它们的话,也可以用 I 来开启和关闭隐藏文件的显示。
按 m 会出现一个菜单,允许添加、删除、更名等操作。

搜索

*会将光标所在单词作为检索项, 配合nN即可继续检索

ctags

安装: sudo apt install exuberant-ctags
建立索引: 进入linux目录, ctags -R .(如果是C++文件则ctags --fields=+iaS --extra=+q -R .)
使用: 命令 <C-]>,或者按 g(g 可理解成 go)键加鼠标单击。你愿意的话,也可以手工输入命令 :tag 后面跟空格和待搜索的符号加回车键。这样 Vim 即会跳转到该符号的定义或声明位置。

Tagbar 插件

tagbar 就可以利用 Ctags 来提取符号,生成源代码的结构图

在这里插入图片描述

跟之前类似,假设使用 minpac 的话,我们需要在 vimrc 中“Other plugins”那行下面加入下面的语句,并运行 :PackUpdate 来安装一下:

call minpac#add(‘majutsushi/tagbar’)
我给它映射了快捷键 ,可以快速打开和关闭 Tagbar 的窗口:

" 开关 Tagbar 插件的键映射
nnoremap :TagbarToggle
inoremap :TagbarToggle

quickfix窗口

:make会编译, 并调到编译错误的源码处
:grep '要查找的符号' 文件名列表会调用操作系统的grep命令, (例如:grep -R --include='*.c' --include='*.h' '\<printf\>' .会找到所有用到printg的.c和.h文件)

常见插件

  • vim-go
  • molokai 配色
  • minibufexpl 显示已打开文件
  • cgdb
  • tagbar 右侧的变量函数展示
  • vim-nox

neo-vim 配置入门

  • brew install neovim下载软件本体
  • pip install --user -U neovim下载neovim对于python的依赖
  • 下载https://github.com/iazkaban/init.vim到~/.config/nvim文件夹下
  • 设置alias vim=‘nvim’
  • 打开vim, 执行
:PluginInstall
:GoInstallBinaries
  • 在~/.config/nvim/plugged/YouCompleteMe路径下执行如下
./install.sh --go-completer
或python ./install.py --go-completer
  • brew install ctags 暂时不知道用途

自动提示

<C-P><C-N>

文件跳转

gf<C-W>f可跳转到定义所在的文件

寄存器

交换两行内容: 先dd, 再p

代码补全

sudo apt install vim-youcompleteme
vim-addon-manager install youcompleteme

如果你的工程里,这个文件产生在一个 dist 目录下的话,别忘了你需要在项目的根目录下执行类似下面的命令:

ln -s dist/compile_commands.json .

neovim 使用

neovim的配置

  • F12会打开左右边栏
    • 左边是nerdtree控制的, 可以打开文件树
    • 右边是tagbar控制的, 可以看到变量函数等
  • F6刷新文件
  • F10代码格式化

nerdtree的配置

  • hjkl上下左右跳转边栏
  • shift+?查看帮助
  • o打开目录或文件

配置

修改vim最好的方式是, 把vim官方的配置拷贝到自己的~/.vim目录下, 然后做一些修修改改, 而不要动vim官方的配置. (因为升级时会被覆盖)

  • ~/.vimrc
" 必备
set enc=utf8
set nocompatible
source $VIMRUNTIME/vimrc_example.vim

" 编码
set fencs=utf8,gbk,gb2312,gb18030
set fileencodings=ucs-bom,utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1 "编码, 先尝试用utf8, 再用gb18030解释中文

" 跨会话撤销编辑能力, 将撤销文件放在~/.vimrc/undodir中使得保存后仍可撤销
set nobackup
set undodir=~/.vim/undodir
if !isdirectory(&undodir) "启动后自动(一次性)建文件夹
	call mkdir(&undodir, 'p', 0700)
endif

" 鼠标选择
if has('mouse')
	if has('gui_running') || (&term =~ 'xterm' && !has('mac'))
		set mouse=a
	else
		set mouse=nvi
	endif
endif

" 各类型文件支持
let do_syntax_sel_menu = 1
let do_no_lazyload_menus = 1

" minpac插件(version>8)
if exists('*minpac#init')
	" Minpac is loaded.
	call minpac#init()
	call minpac#add('k-takata/minpac', {'type': 'opt'})

	" Other plugins
	call minpac#add('tpope/vim-eunuch')
	call minpac#add('preservim/nerdtree')
	call minpac#add('majutsushi/tagbar')
	call minpac#add('skywind3000/asyncrun.vim')
	call minpac#add('yegappan/mru')
    call minpac#add('junegunn/fzf', {'do': {-> fzf#install()}}) "文件模糊搜索
    call minpac#add('junegunn/fzf.vim') "文件模糊搜索
endif

if has('eval')
	" Minpac commands
	command! PackUpdate packadd minpac | source $MYVIMRC | call minpac#update('', {'do': 'call minpac#status()'})
	command! PackClean  packadd minpac | source $MYVIMRC | call minpac#clean()
	command! PackStatus packadd minpac | source $MYVIMRC | call minpac#status()
endif

" 最近编辑的文件
if !has('gui_running')
	" 设置文本菜单
	if has('wildmenu')
		set wildmenu
		set cpoptions-=<
		set wildcharm=<C-Z>
		nnoremap <F10>      :emenu <C-Z>
		inoremap <F10> <C-O>:emenu <C-Z>
	endif
endif

" 设置version<8时粘贴不会因自动缩进而出显示问题
if !has('patch-8.0.210')
  " 进入插入模式时启用括号粘贴模式
  let &t_SI .= "\<Esc>[?2004h"
  " 退出插入模式时停用括号粘贴模式
  let &t_EI .= "\<Esc>[?2004l"
  " 见到 <Esc>[200~ 就调用 XTermPasteBegin
  inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

  function! XTermPasteBegin()
    " 设置使用 <Esc>[201~ 关闭粘贴模式
    set pastetoggle=<Esc>[201~
    " 开启粘贴模式
    set paste
    return ""
  endfunction
endif

" 窗口快捷键
nnoremap <C-Tab>   <C-W>w       " 切换下一个split的小窗
inoremap <C-Tab>   <C-O><C-W>w  " 同上(用于编辑模式)
nnoremap <C-S-Tab> <C-W>W       " 切换上一个split的小窗
inoremap <C-S-Tab> <C-O><C-W>W  " 同上(用于编辑模式)

" 停止搜索高亮的键映射, 按F2
nnoremap <silent> <F2>      :nohlsearch<CR>
inoremap <silent> <F2> <C-O>:nohlsearch<CR>

" 编程语言缩进格式
au FileType c,cpp,objc  setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=4 cinoptions=:0,g0,(0,w1
au FileType json        setlocal expandtab shiftwidth=2 softtabstop=2
au FileType vim         setlocal expandtab shiftwidth=2 softtabstop=2

" 把 /usr/include 目录下的文件按 GNU 编码风格来解释
function! GnuIndent()
  setlocal cinoptions=>4,n-2,{2,^-2,:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1
  setlocal shiftwidth=2
  setlocal tabstop=8
endfunction

au BufRead /usr/include/*  call GnuIndent()

" ctags插件: 加入记录系统头文件的标签文件和上层的 tags 文件
set tags=./tags;,tags,/usr/local/etc/systags

" 开关 Tagbar 插件的键映射
nnoremap <F9>      :TagbarToggle<CR>
inoremap <F9> <C-O>:TagbarToggle<CR>

" 异步
" 和 asyncrun 一起用的异步 make 命令
command! -bang -nargs=* -complete=file Make AsyncRun -program=make @ <args>
" 异步运行命令时打开 quickfix 窗口,高度为 10 行
let g:asyncrun_open = 10
" 映射按键来快速启停构建
nnoremap <F5>  :if g:asyncrun_status != 'running'<bar>
                 \if &modifiable<bar>
                   \update<bar>
                 \endif<bar>
                 \exec 'Make'<bar>
               \else<bar>
                 \AsyncStop<bar>
               \endif<CR>

" 帮助文档: 启用 man 插件, 按大写K即可将文档里的关键字调用man文档
source $VIMRUNTIME/ftplugin/man.vim
set keywordprg=:Man

"YCM代码补全
"需git clone --recurse-submodules https://github.com/ycm-core/YouCompleteMe.git
nnoremap <Leader>fi :YcmCompleter FixIt<CR>
nnoremap <Leader>gt :YcmCompleter GoTo<CR>
nnoremap <Leader>gd :YcmCompleter GoToDefinition<CR>
nnoremap <Leader>gh :YcmCompleter GoToDeclaration<CR>
nnoremap <Leader>gr :YcmCompleter GoToReferences<CR>

进阶配置

猜你喜欢

转载自blog.csdn.net/jiaoyangwm/article/details/127555939