1、vi和vim
1.1 为何要学vim
所有Unix like系统中会内置vi文书编辑器,可以编辑程序,程序简单编辑速度快。很多软件的编辑接口会主动调用vim。vim可以看作vi的进阶版本,vim号称编辑器之神,还是很有学习的必要的。
2、vi的使用
基本上vi共分为三种模式,分别是“一般指令模式、编辑模式、和命令行命令模式”三种模式的作用分别是:
*一般指令模式(command mode)
以vi打开一个文件就直接进入一般指令模式,默认模式也简称一般模式,在这个模式中,你可以使用上下左右按键移动光标,你可以使用删除字符和删除整列来处理文件内容。也可以使用复制、贴上来处理你的文件数据。
*编辑模式(insert mode)
在一般模式中可以进行删除、复制、贴上等动作,但是无法编辑文件内容,等你按下“i,l,o,O,a,A,r,R”等任何一个字符会进入编辑模式,在下方会出现insert,replace的字样,此时才可以编辑。回到一般指令模式,按下ESC会退出编辑模式。
*命令行命令模式(command-line mode)
在一般模式下输入“:/ ?”三个中任何一个按钮,就可以将光标移动到最下面一列,在这个模式中可以提供搜寻数据的动作,而读取、存盘、大量取代字符、离开vi,显示行号等动作都是在此模式中达成的。
2.1 按键说明
第一部分:一般模式可使用的按钮说明,光标移动、复制粘贴、搜寻取代
第二部分:一般指令模式切换到编辑模式可用按钮说明
第三部分:一般指令模式切换到命令行界面可用按钮说明
2.2 vim 的暂存盘、救援回复与打开时的警告讯息、
在vim编辑文件的时候会在同一个目录下会再创建一个名为.filename.swp的文件,如果因为某些原因断线,导致你编辑的文件还没有保存,那么就会将之前的操作记录记录在.filename.swp中。当再次打开这个文件时会出现警告窗口,解决方法是:
(1)有可能是多用户多任务环境,别人编辑了这个文件,找到另外的人员将他的工作结束,你再处理。
(2)如果你只是查看该文件内容,那么可以输入英文o,以只读模式打开。
常见处理办法:
(1)如果你之前vim处理动作没有储存,按下R,就能recover项目。此时vim会载入之前的项目,由你决定要不要保存。但这样并不会删除.swp文件,离开vim后还需要你自己删除.swp的文件。
(2)如果你确定这个暂存盘没有用你可以直接按下D删除这个暂存盘。此时vim会载入这个项目并将旧的.swp删除。
暂存盘警告信息中六个可用按钮:
O:打开文件为只读文件
E:正常打开,不会载入暂存盘,很容易出现两个使用者互相修改对方的文件。
R:载入暂存盘内容,之后要手动删除.swp文件。、
D:确定暂存盘无用,打开文件前先将暂存盘删除。
Q:按下q离开vim。
A:忽略这个编辑行为。
3、vim的额外功能
3.1 区块选择
在前面操作单位是以列为单位的,但是如果是操作一个区块就要进入区块选择(visual block),在一般模式下按下V或v或ctrl+v,
3.2 多文件编辑
vim可以在后面同时接好几个文件同时打开,相关按键:
这个功能可以使你将这个文件内内容复制到另外一个文件。
3.3 多窗口编辑
如果需要对照两个文件,在命令行界面输入sp{filename},如果是要启动另一个文件就加入filename如果只输入sp那么会是同一个文件出现在两个窗口。
貌似无法在多窗口下打开旧的文件,也就是说,多窗口文件一般可以用来在同一个文件中,如果文件比较大,可以使用多窗口对比前后数据等。
3.4 vim的挑字补全功能
3.5 vim环境设置和记录:~/.vimrc,~/.viminfo
~/.vimrc 是关于vim的配置文件,可以在这里进行有关设置以及插件等等的设置。
~/.viminfo 是记录动作的文件。
将我的配置文件保存在这里。配置文件里双引号开头的是注释。在这个配置里还有一些插件,这个以后再说。
" This line should not be removed as it ensures that various options are
" properly set to work with the Vim-related packages available in Debian.
" runtime debian.vim
" Uncomment the next line to make Vim more Vi-compatible
" NOTE: debian.vim sets 'nocompatie'. Setting 'compatible' changes numerous
" options, so any other options should be set AFTER setting 'compatible'.
set nocompatible
" Vim5 and later versions support syntax highlighting. Uncommenting the
" following enables syntax highlighting by default.
if has("syntax")
syntax on " 语法高亮
endif
colorscheme ron " elflord ron peachpuff default 设置配色方案,vim自带的配色方案保存在/usr/share/vim/vim72/colors目录下
" detect file type
filetype on
filetype plugin on
" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
set background=dark
" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
"have Vim load indentation rules and plugins according to the detected filetype
filetype plugin indent on
endif
" The following are commented out as they cause vim to behave a lot
" differently from regular Vi. They are highly recommended though.
"set ignorecase " 搜索模式里忽略大小写
"set smartcase " 如果搜索模式包含大写字符,不使用 'ignorecase' 选项。只有在输入搜索模式并且打开 'ignorecase' 选项时才会使用。
set autowrite " 自动把内容写回文件: 如果文件被修改过,在每个 :next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令时进行;用 :buffer、CTRL-O、CTRL-I、'{A-Z0-9} 或 `{A-Z0-9} 命令转到别的文件时亦然。
set autoindent " 设置自动对齐(缩进):即每行的缩进值与上一行相等;使用 noautoindent 取消设置
"set smartindent " 智能对齐方式
set tabstop=4 " 设置制表符(tab键)的宽度
set softtabstop=4 " 设置软制表符的宽度
set shiftwidth=4 " (自动) 缩进使用的4个空格
set cindent " 使用 C/C++ 语言的自动缩进方式
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s "设置C/C++语言的具体缩进方式
"set backspace=2 " 设置退格键可用
set showmatch " 设置匹配模式,显示匹配的括号
set linebreak " 整词换行
set whichwrap=b,s,<,>,[,] " 光标从行首和行末时可以跳到另一行去
"set hidden " Hide buffers when they are abandoned
set mouse=a " Enable mouse usage (all modes) "使用鼠标
set number " Enable line number "显示行号
"set previewwindow " 标识预览窗口
set history=50 " set command history to 50 "历史记录50条
"--状态行设置--
set laststatus=2 " 总显示最后一个窗口的状态行;设为1则窗口数多于一个的时候显示最后一个窗口的状态行;0不显示最后一个窗口的状态行
set ruler " 标尺,用于显示光标位置的行号和列号,逗号分隔。每个窗口都有自己的标尺。如果窗口有状态行,标尺在那里显示。否则,它显示在屏幕的最后一行上。
"--命令行设置--
set showcmd " 命令行显示输入的命令
set showmode " 命令行显示vim当前模式
"--find setting--
set incsearch " 输入字符串就显示匹配点
set hlsearch
"--ctags setting--
" 按下F5重新生成tag文件,并更新taglist
map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
" set tags+=/usr/include/c++/tags
" set tags+=~/home/zl/Dwonload/cpp_src/cpp
" set tags=tags
set tags+=./tags "add current directory's generated tags file
" set tags+=~/linux/linux-2.6.22.6/tags "add new tags file(刚刚生成tags的路径,在ctags -R 生成tags文件后,不要将tags移动到别的目录,否则ctrl+]时,会提示找不到源码文件)
"-- omnicppcomplete setting --
" 按下F3自动补全代码,注意该映射语句后不能有其他字符,包括tab;否则按下F3会自动补全一些乱码
imap <F3> <C-X><C-O>
" 按下F2根据头文件内关键字补全
imap <F2> <C-X><C-I>
set completeopt=menuone,menu,longest,preview " 关掉智能补全时的预览窗口
let OmniCpp_MayCompleteDot = 1 " autocomplete with .
let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
let OmniCpp_DefaultNamespaces=["std","_GLIBCXX_STD"]
let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
let OmniCpp_ShowAccess=1
let OmniCpp_NamespaceSearch = 1
set tags+=/home/zl/tags/c++/tags
au BufNewFile,BufRead,BufEnter *.cpp,*.hpp
set omnifunc=omni#cpp#complete#Main
au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif
set encoding=UTF-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
set fileencoding=utf-8
au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif
set encoding=UTF-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
set fileencoding=utf-8
let g:syntastic_cpp_compiler_options='-std=c++11 -stdlib=libc++'
3.6 常用指令示意图
4、 其他使用事项
4.1 中文编码问题
这里的原因可能有很多,可能你的linux系统支持语系数据,你的终端接口的语系,文本的编码,打开终端的软件等等,在ubuntu下常用的解决办法是:
在vim配置文件里修改编码加入以下设置:
set fileencodings=gb2312,utf-8
set fileencoding=gb2312
set termencoding=utf-8
在ubuntu下可以安装搜狗拼音。
4.2 DOS与linux的断行字符
因为两者断行字符不一致可能会导致程序无法执行,那么需要进行格式转换。
4.3 语系编码转换
5、重点回顾
(1)vim的三种模式,直接的切换。
(2)vim的常用功能。
(3)使用:sp可以分区窗口
(4)vim的配置文件很强大,可以支持很多插件可以配合你将vim修改的无限接近windows下的IDE。