编辑器vi
关于vi
vi是Linux系统中一种文本编辑器,它的使用方法和界面与Unix平台十分相似。掌握了vi的命令,你可以感觉到它强大的功能与高效。
vi相对来说比较小,无论你使用任何Linux系统,你总是可以使用vi的。在很多系统中,可能只有vi供你选择。
vim 是vi的高级版本,兼容vi,功能更强大。
vi的基本操作
vim的进入与离开 | ||
---|---|---|
进入vim | 在系统提示字符下键入: vim <文件名称> | |
离开vim | :q | 退出vim |
:q! | 不保存强制退出vim | |
:wq | 保存后再离开 | |
模式切换 | 在插入模式和底行模式下用[Esc]键切换到命令行模式。 |
vi的三种模式(常用指令)
命令行模式 | 开始编辑命令 | i | 在光标前输入文本 |
o | 在当前行后输入新一行 | ||
O | 在当前行前输入新一行 | ||
光标移动命令 | b | 移动到当前单词的开始 | |
e | 移动到当前单词的结尾 | ||
删除命令 | x | 删除光标所在的字符 | |
dd | 删除当前行 | ||
#dd | 删除当前行以后的#行 | ||
改变与替换操作命令 | r | 替换光标所在的字符 | |
C | 替换自光标位置至行尾所有字符 | ||
cc | 替换当前行 | ||
cw | 替换一个单词 | ||
拷贝和粘贴命令 | yy | 将当前行复制到粘贴板 | |
#yy | 将当前行后的#行复制到粘贴板 | ||
p | 将粘贴板中的内容粘贴在光标后 | ||
其他有用的命令 | u | 撤销 | |
gg | 移动到第一行行首 | ||
G | 移动到最后一行行首 | ||
nG | 跳到第n行 | ||
底行模式 | 设置vi | set nu | 显示行号 |
set nonu | 隐藏行号 | ||
set autoindent | 智能缩进 | ||
set mouse=a | 开启鼠标 | ||
文件保存及退出命令 | 参照离开vim | ||
查询命令 | /abc | 向后查询abc | |
?abc | 向前查询abc | ||
n | 向后继续查询 | ||
N | 向前继续查询 | ||
替换与查找 | :s/old/new | 替换该行第一个old为new | |
:s/old/new/g | 可以替换全行中所有的old为new | ||
:#,#s/old/new/g | 替换两行之间出现的old为new,#,#为两行的行号 | ||
:%s/old/new/g | 替换全文的old为new | ||
:%s/old/new/gc | 全文替换前需确认 | ||
插入模式 | 只有在输入模式下,才可以输入文字。在命令模式下输入(i,a,A等),可进入输入模式,输入模式下按ESC,可返回命令模式。 |
关于vimrc
vimrc文件是vim的环境设置文件。
整体的vim的设置是在 /etc/vim/vimrc 文件中。如果想设置所有用户的配置,在里面设置就可以了,配置和.vimrc是一样的,在最后面添加下面2中的语句。
不建议修改/etc/vimrc 文件,每个用户可以在用户根目录中设置vim,新建.vimrc。
附自用vimrc
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set fileencodings=utf-8,latin1
endif
set nocompatible " Use Vim defaults (much better!)
set bs=indent,eol,start " allow backspacing over everything in insert mode
"set ai " always set autoindenting on
"set backup " keep a backup file
set viminfo='20,\"50 " read/write a .viminfo file, don't store more
" than 50 lines of registers
set history=50 " keep 50 lines of command line history
set ruler " show the cursor position all the time
set mouse=a
set cursorline
set foldmethod=manual
set completeopt=preview,menu
set autoindent
vmap<C-c> "+y
set number
let Tlist_Use_Ringht_window = 1
" Only do this part when compiled with support for autocommands
if has("autocmd")
" In text files, always limit the width of text to 78 characters
autocmd BufRead *.txt set tw=78
" When editing a file, always jump to the last cursor position
autocmd BufReadPost *
\ if line("'\"") > 0 && line ("'\"") <= line("$") |
\ exe "normal! g'\"" |
\ endif
endif
if has("cscope") && filereadable("/usr/bin/cscope")
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
endif
" Switch syntax highlighting on, when the terminal has colors
" Also switch on highlighting the last used search pattern.
if &t_Co > 2 || has("gui_running")
syntax on
set hlsearch
endif
if &term=="xterm"
set t_Co=8
set t_Sb=[4%dm
set t_Sf=[3%dm
endif
".c .h .hpp .cpp 等文件时自动调用SetTitle 函数"
autocmd BufNewFile *.[ch],*.hpp,*.cpp exec ":call SetTitle()"
" 加入注释
func SetComment()
call setline(1,"/*****************************************************")
call append(line("."), " > File name: ".expand("%:t"))
call append(line(".")+1, " > Author: Mr.DONG")
call append(line(".")+2, " > 日期: ".strftime("%Y-%m-%d %H:%M"))
call append(line(".")+3, "*****************************************************/")
endfunc
" 定义函数SetTitle,自动插入文件头
func SetTitle()
call SetComment()
call append(line(".")+4, "")
call append(line(".")+5, "#include <stdio.h>")
call append(line(".")+6, "")
call append(line(".")+7, "int main()")
call append(line(".")+8, "{")
call append(line(".")+9, "")
call append(line(".")+10, " return 0;")
call append(line(".")+11, "}")
endfunc
"自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endfunction
filetype plugin indent on
"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu
"C,C++ 按F5编译运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'"
exec "!g++ % -o %<"
exec "! ./%<"
elseif &filetype == 'cpp'
exec "!g++ % -o %<"
exec "! ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!java %<"
elseif
&filetype== 'sh'
:!./%
endif
endfunc
"代码补全
set completeopt=preview,menu
"let Tlist_Use_Right_Window = 1 " 在右侧显示窗口 "
" 选中状态下 Ctrl+c 复制
vmap <C-c> "+y
打开vim效果
练习
1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录;
2. 进入 vitest 这个目录当中;
3. 将 /etc/man.config 拷贝到本目录底下
4. 使用 vi 开启本目录下的 man.config 这个档案;
5. 在 vi 中设定一下行号;
6. 移动到第 58 行,向右移动 40 个字符,请问您看到的双引号内是什么目录?
7. 移动到第一行,并且向下搜寻一下“bzip2”这个字符串,请问他在第几行?
8. 接着下来,我要将 50 到 100 行之间的 man 改为 MAN,并且一个一个挑选是否需要修改,如何下达指令?
9. 修改完之后,突然反悔了,要全部复原,有哪些方法?
10. 我要复制 51 到 60 行这十行的内容,并且贴到最后一行之后;
11. 删除 11 到 30 行之间的 20 行;
12. 将这个文件另存成一个 man.test.config 的文件;
13. 到第 29 行,并且删除 15 个字符;
14. 储存后离开
答案: