vim使用记录以及相关配置

2021-01-23, updated 2021-10-31

源码编译

获取代码并编译

git clone https://github.com/vim/vim.git
cd vim/src
./configure --prefix=~/opt/usr/local/
make
make install

修改PATH

~/.bashrc
export PATH=~/usr/local/bin:$PATH

使用方法记录

有注释时粘贴代码自动换行导致错乱问题

粘贴代码时对齐问题
set paste
取消
set nopaste

修改文件类型

set fileformat=unix

设置字符可见模式,以^I表示一个tab符,$表示一个回车符等

set invlist

回到正常模式

set nolist

:%!xxd    查看十六进制
:set nolist	回到正常模式
:set invist	^I 表示tab,$表示回车符

查找与替换

替换语法:[addr]s/源字符串/目的字符串/[option]

如果在源字符串和目的字符串中出现特殊字符,如'/','<','>',',‘等需要前面加反斜杠\进行转义

常用命令示例:

#将当前行第一个a替换为b
:s/a/b/

#将当前行的所有a替换为b
:s/a/b/g

#将每行第一个a替换为b
:%s/a/b

#将整个文件的所有a替换为b
:%s/a/b/g

#将1至3行的第一个a替换为b
:1,3s/a/b/

#将1至3行的所有a替换为b
:1,3s/a/b/g

上面是一些常用的替换,但是我们日常碰到的问题不止这么简单,这就要涉及到一些较为高级的替换操作,会涉及到转义,正则表达式相关的知识,下面是一些例子:

#使用#作为分隔符,此时中间出现的/不会作为分隔符,如:将当前行的字符串"a/"替换为"b/"
:s#a/#b/#

#找到包含字母a的行并删除
:g/a/d

#删除所有空行
:g/^$/d

#多个空格替换为一个空格
:s/ \+/ /g

#在正则表达式中使用和和符号括起正则表达式,即可在后面使用\1,\2等变量来访问和和中的内容,如下
将data1 data2修改为data2 data1
:s/\w\+\w\+\s\+\w\+\w\+/\2\t\1

vimgrep的使用方法

vimgrep /匹配模式/[g][j] 要搜索的文件/范围

默认使用vim作为vimgrep命令缩写

vimdiff

vimdiff 等同于 vim -d 命令,即 Vim 编辑器的 diff 模式。

可以使用下列两种快捷键,在文件的各个差异点之间前后移动:

], c:跳转到下个差异点
[, c:跳转到上个差异点

内容合并

打开多个文件

vim -O2 file1 file2

多个窗口切换

Ctrl-w, l:光标切换到右侧的窗口
Ctrl-w, h:光标切换到左侧的窗口
Ctrl-w, w:光标在两个窗口间彼此切换

其它命令

:qa:退出所有文件
:wa:保存所有文件
:wqa:保存并退出所有文件
qa!:强制退出(不保存)所有文件
z o:查看被折叠的内容
z c:重新折叠

问题及解决方法

  1. vim 光标停留在上次退出位置 需要确保~/.viminfo 权限没有问题,并查看以下配置是否添加
if has("autocmd")
  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif
  1. 使用tagbar插件时需要安装ctags
# debian系
sudo apt install ctags

部分插件使用说明

vim-plug

用于管理插件的插件

:PlugInstall    安装插件
:PlugUpdate     更新插件
:PlugUpgrade    升级vim-plug

自用配置

vim-plug下载

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

详细配置,自用备份

syntax on
set number
set tags=tags;
map <c-]> g<c-]>

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab
set softtabstop=4
" 高亮搜索内容
set hlsearch
" 忽略搜索大小写
set ignorecase
" 智能搜索
set smartcase
" 输入时显示搜索内容
set incsearch

source $VIMRUNTIME/ftplugin/man.vim

set wildmenu
" 显示所有匹配的命令或文件名
set wildmode=list:longest,full

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

set encoding=utf-8

" 解决插入模式下delete/backspce键失效问题
set backspace=2
set laststatus=2
if !has('gui_running')
  set t_Co=256
endif

" let Tlist_Show_One_File=1     "不同时显示多个文件的tag,只显示当前文件的
" let Tlist_Exit_OnlyWindow=1   "如果taglist窗口是最后一个窗口,则退出vim
" let Tlist_Use_Right_Window=1
" let Tlist_Ctags_Cmd="/usr/bin/ctags" "将taglist与ctags关联

"让vim记忆上次编辑的位置
if has("autocmd")
  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif

nmap <silent> <F8> <Plug>MarkdownPreview        " 普通模式
imap <silent> <F8> <Plug>MarkdownPreview        " 插入模式
nmap <silent> <F9> <Plug>StopMarkdownPreview    " 普通模式
imap <silent> <F9> <Plug>StopMarkdownPreview    " 插入模式

" open NERDTree with Ctrl+n
map <C-n> :NERDTreeToggle<CR>
" map <F4> :Tlist<CR>

" tagbar config
map <F4> :Tagbar<CR>
let g:tagbar_autofocus = 1 "这是tagbar一打开,光标即在tagbar页面内,默认在vim打开的文件内
let g:tagbar_sort = 0                                         "设置标签不排序,默认排序
let g:tagbar_type_make = {
            \ 'kinds':[
                \ 'm:macros',
                \ 't:targets'
            \ ]
\}
let g:tagbar_type_markdown = {
    \ 'ctagstype' : 'markdown',
    \ 'kinds' : [
        \ 'h:Heading_L1',
        \ 'i:Heading_L2',
        \ 'k:Heading_L3'
    \ ]
\ }
" end

" vim-markdown
" let g:markdown_enable_spell_checking = 0
" let g:markdown_enable_input_abbreviations = 0
" let g:markdown_enable_conceal = 0
let g:vim_markdown_folding_disabled = 1
let g:vim_markdown_frontmatter=1
let g:vim_markdown_math = 1
" let g:vim_markdown_toml_frontmatter = 1
" let g:vim_markdown_json_frontmatter = 1
" let g:vim_markdown_strikethrough = 1
" end

" Specify a directory for plugins
" - For Neovim: ~/.local/share/nvim/plugged
" - Avoid using standard Vim directory names like 'plugin'
call plug#begin('~/.vim_runtime/plugged')

" Make sure you use single quotes

" Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
" Plug 'junegunn/vim-easy-align'
Plug 'itchyny/lightline.vim'
Plug 'kien/ctrlp.vim'
Plug 'scrooloose/nerdtree'
" Plug 'Xuyuanp/nerdtree-git-plugin'
" Plug 'vim-scripts/taglist.vim'
Plug 'majutsushi/tagbar'
Plug 'ervandew/supertab'
Plug 'iamcco/mathjax-support-for-mkdp'
Plug 'godlygeek/tabular'
Plug 'plasticboy/vim-markdown'
Plug 'iamcco/markdown-preview.vim'
Plug 'rust-lang/rust.vim'
" Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
" Plug 'vim-scripts/OmniCppComplete'
" Plug 'vim-scripts/winmanager'

" Any valid git URL is allowed
" Plug 'https://github.com/junegunn/vim-github-dashboard.git'

" Multiple Plug commands can be written in a single line using | separators
" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'

" On-demand loading
" Plug 'scrooloose/nerdtree', { 'on':  'NERDTreeToggle' }
" Plug 'tpope/vim-fireplace', { 'for': 'clojure' }

" Using a non-master branch
" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }

" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
" Plug 'fatih/vim-go', { 'tag': '*' }

" Plugin options
" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }

" Plugin outside ~/.vim/plugged with post-update hook
" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }

" Unmanaged plugin (manually installed and updated)
" Plug '~/my-prototype-plugin'

" Initialize plugin system
call plug#end()

.ctags

--regex-make=/^([^# \t]*):/\1/t,target/
--langdef=markdown
--langmap=markdown:.mkd
--regex-markdown=/^#[ \t]+(.*)/\1/h,Heading_L1/
--regex-markdown=/^##[ \t]+(.*)/\1/i,Heading_L2/
--regex-markdown=/^###[ \t]+(.*)/\1/k,Heading_L3/
words: 2203 tags: vim