VIM 学习日志

摘要

vim 大法好啊

Vim 插件安装

首先安装 Vundle,见 Vundle-Github.

安装插件的时候,先在 vimrc 里面输入 Plugin 'XXX' 并保存,然后 vim 里运行 PluginInstall 即可

Vim 代码折叠

VIM 代码折叠方式可以用 “foldmethod” 选项来设置,如:set foldmethod=indent

有 6 种方式来折叠代码

  1. manual // 手工定义折叠
  2. indent // 用缩进表示折叠
  3. expr  // 用表达式来定义折叠
  4. syntax // 用语法高亮来定义折叠
  5. diff // 对没有更改的文本进行折叠
  6. marker // 用标志折叠

常用命令:

  1. zc 折叠
  2. zC 对所在范围内所有嵌套的折叠点进行折叠
  3. zo 展开折叠
  4. zO 对所在范围内所有嵌套的折叠点展开

VIM 配置文件

基础的配置

set nocp " 不兼容模式
set nu
set cindent
set autoindent
set smartindent
set tabstop=4 " Tab 宽度为 4 个字符
set shiftwidth=4 " 自动缩进的时候,缩进尺寸为 4 个空格
set backspace=indent,eol,start
set foldmethod=syntax
set foldlevel=99
set encoding=utf-8
set ambiwidth=double
"set whichwrap+=b,s,h,l,<,>,[,]
set et  " 编辑时将所有 Tab 替换为空格
set smarttab
"set lbr
set fo+=mB
set selection=inclusive
set wildmenu
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

imap jj <ESC>
imap <C-t><C-t> <C-R>=strftime("%Y-%m-%d %H:%M:%S")<CR>
nmap <F5> :!clear;g++ % -o %<-Wall <ESC>
nmap <F6> :!clear;time ./%<<ESC>
nmap <F7> :!clear;time ./%<<%<.in <ESC>
nmap <F8> :vsp %<.in <ESC>
nmap <F9> :!clear;gedit % <ESC>
nmap <C-g> gg"+yG <ESC>
nmap df za
vmap <C-c> "+y <ESC>

set shell=/bin/zsh
au BufRead,BufNewFile *.ejs set filetype=html " 文件类型映射

插件配置

"Vundle

set nocompatible              " be iMproved, required
filetype off                  "required" set the runtime path to include Vundle and initialize
set rtp+=/home/sshwy/.vim/bundle/Vundle.vim
call vundle#begin()
"alternatively, pass a path where Vundle should install plugins"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

"The following are examples of different formats supported." Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'tpope/vim-fugitive'
"plugin from http://vim-scripts.org/vim/scripts.html" Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent.com/command-t.git'
" git repos on your local machine (i.e. when working on your own plugin)
Plugin 'hotoo/pangu.vim'
"The sparkup vim script is in a subdirectory of this repo called vim." Pass the path to set the runtimepath properly.
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
"Install L9 and avoid a Naming conflict if you've already installed a
"different version somewhere else." Plugin 'ascenator/L9', {'name': 'newL9'}

" Python 缩进插件
Plugin 'vim-scripts/indentpython.vim'
" 自动格式化插件,快捷键 F10
Plugin 'Chiel92/vim-autoformat'
nnoremap <F10> :Autoformat<CR>
let g:autoformat_autoindent = 0
let g:autoformat_retab = 0
let g:autoformat_remove_trailing_spaces = 0

" vim 文件树,F3 启动
Plugin 'https://github.com/scrooloose/nerdtree'
nnoremap <F3> :NERDTreeToggle<CR>
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

" vim 增强状态栏
Plugin 'https://github.com/bling/vim-airline'

" 五颜六色的括号
Plugin 'kien/rainbow_parentheses.vim'
let g:rbpt_colorpairs = [\ ['brown',       'RoyalBlue3'],
                        \ ['Darkblue',    'SeaGreen3'],
                        \ ['darkgray',    'DarkOrchid3'],
                        \ ['darkgreen',   'firebrick3'],
                        \ ['darkcyan',    'RoyalBlue3'],
                        \ ['darkred',     'SeaGreen3'],
                        \ ['darkmagenta', 'DarkOrchid3'],
                        \ ['brown',       'firebrick3'],
                        \ ['gray',        'RoyalBlue3'],
                        \ ['darkmagenta', 'DarkOrchid3'],
                        \ ['Darkblue',    'firebrick3'],
                        \ ['red',         'firebrick3'],
                        \ ['darkgreen',   'RoyalBlue3'],
                        \ ['darkcyan',    'SeaGreen3'],
                        \ ['darkred',     'DarkOrchid3'],
                        \ ]
let g:rbpt_max = 16
let g:rbpt_loadcmd_toggle = 0
au VimEnter * RainbowParenthesesToggle
au Syntax * RainbowParenthesesLoadRound
au Syntax * RainbowParenthesesLoadSquare
au Syntax * RainbowParenthesesLoadBraces

" 代码语法检查
Plugin 'w0rp/ale'
function s:run_ale()
    let g:ale_fix_on_save = 0
    let g:ale_completion_enabled = 1
    let g:ale_sign_column_always = 0
    let g:airline#extensions#ale#enabled = 1
endfunction

autocmd FileType php,python,c,java,shell,bash,vim,cpp call s:run_ale()

" Vim Markdown
Plugin 'KeitaNakamura/tex-conceal.vim' 
Plugin 'godlygeek/tabular'
Plugin 'plasticboy/vim-markdown'
let g:vim_markdown_strikethrough = 1
let g:tex_conceal='abdmg'
let g:vim_markdown_math = 1
let g:vim_markdown_frontmatter = 1
let g:vim_markdown_toc_autofit = 1
nmap <F4> :Toc<ESC>

set conceallevel=2

Plugin 'Valloric/YouCompleteMe'
let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
let g:ycm_autoclose_preview_window_after_completion = 1  "补全后自动关闭 preview" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    "required" To ignore plugin indent changes, instead use:
"filetype plugin on"
"Brief help" :PluginList       - lists configured plugins
":PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate" :PluginSearch foo - searches for foo; append `!` to refresh local cache
":PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal"
"see :h vundle for more details or wiki for FAQ" Put your non-Plugin stuff after this line

"说明,以下代码是用于修改插入模式的光标为竖线,普通模式下为方块状" 这主要是因为想保留普通终端下的方块输入形状。
"if has("autocmd")"  au VimEnter,InsertLeave * silent execute '!echo -ne"\e[1 q"'| redraw!"  au InsertEnter,InsertChange *
"\ if v:insertmode =='i'|"    \   silent execute '!echo -ne"\e[5 q"'| redraw! |"    \ elseif v:insertmode == 'r' |
"\   silent execute'!echo -ne "\e[3 q"' | redraw! |
"\ endif"  au VimLeave * silent execute '!echo -ne"\e[ q"'| redraw!"endif

以下为旧原文*


安装

Windows

vim- 官方网址
windows 稳定版 - 直接下载

linux

sudo apt install vim

yay -S vim

初级 LEVEL0

:help <command> | 显示相关命令的帮助。你也可以就输入 :help 而不跟命令。(退出帮助需要输入 :q
:cd | 修改当前操作目录
:new | 新建文件。新建后,记得使用:w 保存,否则直接关闭不会产生文件;
:wq | 存盘 + 退出 (:w 存盘,:q 退出) (注::w 后可以跟文件名)

i | Insert-Mode,此时可插入文本,按 ESC 回到 Normal 模式。
x | 删当前光标所在的一个字符。
dd | 删除当前行,并把删除的行存到剪贴板里
y | 拷贝选中的文本
yy | 拷贝当前行
p | 粘贴剪贴板
d | 删除选中的文本,并把删除的文本存到剪贴板里
dd | 删除当前行,并把删除的行存到剪贴板里
h j k l | 使用其移动光标,你也可以使用光标键 (←↓↑→). 注:j 就像下箭头。

启动 LEVEL1

w | 到下一个单词的开头。
e | 到下一个单词的结尾。
% | 匹配括号移动,包括 (, {, [. (陈皓注:你需要把光标先移到括号上)
* # | 匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,# 是上一个)

. | (小数点) 可以重复上一次的命令
N<command> | 重复某个命令 N 次
NG :N | 到第 N 行(G 大写)
v | 可视化的选择

进阶 LEVEL2

记住光标的移动,很多命令都可以和这些移动光标的命令连动。
<start position><command><end position>

  • 例如 0y$ 命令意味着:
    i. 0 | 先到行头
    i. y | 从这里开始拷贝
    i. $ | 拷贝到本行最后一个字符
  • 你可可以输入 ye,从当前位置拷贝到本单词的最后一个字符。
  • 你也可以输入 y2/foo 来拷贝 2 个 “foo” 之间的字符串。

光速 LEVEL3

在当前行上移动光标

0 | 到行头
^ | 到本行的第一个非 blank 字符
$ | 到行尾
g_ | 到本行最后一个不是 blank 字符的位置
fa | 到下一个为 a 的字符处,你也可以 fs 到下一个为 s 的字符
t, | 到逗号前的第一个字符。逗号可以变成其它字符
Nfa | 在当前行查找第 N 个出现的 a
F T | 和 f | t 一样,只不过是相反方向
dt" | 删除所有的内容,直到遇到双引号——“

区域选择 <action>a<object><action>i<object>

visual模式下,这些命令很强大,其命令格式为
<action>a<object><action>i<object>

<action> 可以是任何的命令,如 d (删除), y (拷贝), v (可以视模式选择)。
<object> 可能是:

  • w 一个单词
  • W 一个以空格为分隔的单词
  • s 一个句字
  • p 一个段落。
  • 也可以是一个特别的字符:”、’、 )、 }、 ]。

假设你有一个字符串 (map (+) (“foo”)). 而光标键在第一个 o 的位置。

  • vi" | 会选择 foo.
  • va" | 会选择”foo”.
  • vi) | 会选择 “foo”.
  • va) | 会选择 (“foo”).
  • v2i) | 会选择 map (+) (“foo”)
  • v2a) | 会选择 (map (+) (“foo”))

神犇 LEVEL4

块操作:

块操作,典型的操作:0 <C-v> <C-d> I-- [ESC]

  • ^ | 到行头
  • <C-v> | 开始块操作
  • <C-d> | 向下移动 (你也可以使用 hjkl 来移动光标,或是使用 %,或是别的)
  • I-- [ESC] | I 是插入,插入 “—”,按 ESC 键来为每一行生效。

Windows下的 vim,你需要使用 <C-q> 而不是 <C-v><C-v> 是拷贝剪贴板。

<C-n><C-p> | 自动补全
Insert模式下,你可以输入一个词的开头,然后按 或是 ,自动补齐功能就出现了…

可视化选择 v,V,<C-v>

前面,我们看到了 的示例 (在 Windows 下应该是 ),我们可以使用 v 和 V。一但被选好了,你可以做下面的事:

J | 把所有的行连接起来(变成一行)
< > | 左右缩进
= | 自动给缩进(相当强大)

在所有被选择的行后加上点东西:

  • <C-v>
  • 选中相关的行 (可使用 j<C-d> 或是 /pattern 或是 % 等……)
  • $ 到行最后
  • A, 输入字符串,按 ESC。

参考文献

https://blog.csdn.net/sumword_/article/details/53011463


  转载请注明: Sshwy's Blog VIM 学习日志

  目录