`

vim 学习纪要 -- 自己动手搭建IDE

vim 
阅读更多

从无到有学习vim开发环境搭建
vi  (http://baike.baidu.com/view/908054.htm)
vim (http://baike.baidu.com/subview/113188/9338173.htm)

[esc|i|:] 模式切换

插入模式
i:在当前字符的左边插入
I:在当前行首插入
a:在当前字符的右边插入
A:在当前行尾插入
o:在当前行下面插入一个新行
O:在当前行上面插入一个新行


命令模式
[h]、[j]、[k]、[l] 左 下 右 上
v 进入行模式,V 进入列模式 , ~ 切换大小写(选中文本按U大写,u 小写),

. 重复上一次命令

撤销更改
u 撤销,ctrl + r 恢复撤销的更改

删除
D 从光标处删除至行尾,dd 删除一行,dw 删除一个单词,
x 删除光标后一个字符,#x 删除光标后第#个字符
X 删除光标前一个字符,#X 删除光标前第#个字符
dj 删除至下一行,dk 删除至上一行,d^ 删除到行首,d$删除到行尾


替换
r 替换光标所在处的字符,R替换光标所到之处的字符,直到按esc为止

更改
cw 更改光标所在处的字到字尾处,c#w表示更改#个字

剪切且进入插入模式 c
c$ 剪切到行末

复制与粘贴
yy 复制一行,yw 复制一个单词;p 在当前光标后粘贴,P 在当前光标前粘贴
#yw 复制#个字到缓冲区,#yy 拷贝从光标所在的该行“往下数”#行文字


底行模式

w filename , wq 存盘并退出 , q! 退出不存盘,x 保存并退出

# 跳转到第#行

搜索
/ {字符串} 回车 搜索,n 查找下一个,N 查找上一个
? {字符串} ,同/ 但是是反方向

s /from/to/g 在当前行中查找并全部替换 (g 全部替换,否则只替换一次)

m,n s/from/to/g 在m到n行中查找并全部替换 (g 全部替换,否则只替换一次)

%s /from/to/g 在所有行行中查找并全部替换 (g 全部替换,否则只替换一次)


搜索或者替换的时候偶尔忽略大小写,加 \c,如 /naa\c


配置文件
1. 配置文件未知 :version 得到echo $VIM , echo $HOME 从而定位到配置文件
2. $VIM\_vimrc 文件
3. vim -u file 指定配置文件;vim -u NORC不读取任何配置文件
4. 配置文件中使用 " 作为注释符号


常用配置文件内容
set nocompatible         "关闭 vi 兼容模式
set nu                    "显示行号
colorscheme desert         "设定配色方案

syntax enable
syntax on       

set nobackup                "覆盖文件时不备份
set autochdir               "自动切换当前目录为当前文件所在的目录

set magic                   "显示括号配对情况
set laststatus=2            "显示状态栏 (默认值为 1, 无法显示状态栏)

set tabstop=4                "设置tab制表符为4个空格
set autoindent                "自动对齐

set showtabline=2           "显示tab标签名称(1 为不显示)

set ignorecase             "忽略大小写(ic)
set noignorecase         "不忽略大小写(noic)

set smartindent "开启新行时使用智能自动缩进
set smartindent shiftwidth=4 "C语言自动缩进,缩进值为4个字符宽度

set ruler  "显示光标行列信息

set list "显示制表符
filetype on "检测文件的类型

set history=1000 "记录历史的行数

set showmatch    "设置匹配模式,输入左括号会出现右括号

"修改文件自动备份
if has("vms")
    set nobackup
else
    set backup
endif






多文件操作

vim -o file ... 同时打开多个文件, ^w + j|down 向下;^w + k|up 向上
:split file ... 在编辑器中打开多个文件,如果不带参数则对当前文件分割


进阶操作


1. 标记
:marks列出所有标记,m 做标记,' 移动到标记的行首,` 移动到标记的光标位置
m{a-z}:在当前光标的位置标记一个书签,名字为 a-z 的单个字母,名字只能是小写字母
`a 到书签a处,'a 移动到书签a处的行首
`. 上上次编辑文件的地方

2. 移动光标
0 行首,$ 行末,^ 行首第一个字母;
gg 文章头(仅vim),G 文章尾;#l 移到行第#列,b 上个字开头
e 向前移至单词尾,E 同e 但忽略标点;w 向前移至单词首,W 同w 但忽略标点
ctrl + b 屏幕向后移动一页,ctrl + f 屏幕向前移动一页
ctrl + u 屏幕向后移动半页,ctrl + d 屏幕向前移动半页

#G 移动光标至文章的第#行行首,ctrl + g 列出光标所在行的行号
#$ 移动光标至屏幕的第#行行末

H  光标移动到当前屏幕的行首,#H 移到第#行首
dH 删除从光标当前所在行至所显示屏幕首行的全部内容

M  光标移动到当前屏幕中间行的行首
dM 删除从光标当前所在行至屏幕中间行的全部内容

L  光标移动到当前屏幕最底行的行首,#L 移到第#行首(从低向上数)
dL 删除从光标当前所在行至屏幕最底行的全部内容

( 移动光标到上一个句子,) 移动光标到下一个句子
* 读取光标处的字符串,并且移动光标到它再次出现的地方
% 在成对的括号等符号间移动,将光标放到任意符号上,按%


3. 切换大小写gu/gU
gg gu G 从头到尾切换成小写,gg gU G从头到尾切换成大写
H gu G 从屏幕头到文件尾切换成小写
H gu L 从屏幕头到屏幕尾切换成小写

只转化某个单词
gu[#]w ,gu[#]e,gU[#]w,gU[#]e

转换几行的大小写

#gu/#gU 从光标所在行往下再数#行都进行转换

gU0  从光标所在位置到行首,都变为大写
gU$  从光标所在位置到行尾,都变为大写
gUG  从光标所在位置到文章最后一个字符,都变为大写
gU1G 从光标所在位置到文章第一个字符,都变为大写


4. 关键词自动完成
只需要输入开始几个字母,按C-N或C-P


5.多重剪贴板(使用寄存器的命令为双引号")
:reg 列出当前定义的所有寄存器名和它们的内容

使用小写字母来定义寄存器
"kyy 拷贝当前行到寄存器 k
"kp  粘贴寄存器 k 里面的内容

 


6. 打开页签
:tabnew file
:tabedit file
:tabfind
:tabdo
:tabclose

:tabfirst,tablast
:tabNext # 切换到第 # 个标签
:tabmove # 将当前页签拖到第#个位置


疑难问题:

1. Press ENTER or type command to continue 为何出现
:messages 查看问题详情

Messages maintainer: Bram Moolenaar <Bram@vim.org>
Error detected while processing D:\Program Files (x86)\_vimrc:
line    8:
E484: Can't open file D:\Program Files (x86)\vim73\syntax\syntax.vim
line    9:
E484: Can't open file D:\Program Files (x86)\vim73\syntax\syntax.vim
"getturbogears.py" [unix] 444L, 16284C


2. colorscheme desert         "设定配色方案

可能找不到配色文件,使用:messages查看,从http://hans.fugal.net/vim/colors/desert.html下载此文件放到

vim安装目录下的\colors\desert.vim 中

http://www.vim.org/scripts/script.php?script_id=105 写道


" Vim color file
" Maintainer: Hans Fugal <hans at fugal.net>
" Last Change: 5 Oct 2001
" URL: http://fugal.net/vim/colors/desert.vim

" cool help screens
" :he group-name
" :he highlight-groups
" :he cterm-colors

set background=dark
hi clear
if exists("syntax_on")
syntax reset
endif
let g:colors_name="desert"

hi Normal guifg=White guibg=grey20

" highlight groups
hi Cursor guibg=khaki guifg=slategrey
"hi CursorIM
"hi Directory
"hi DiffAdd
"hi DiffChange
"hi DiffDelete
"hi DiffText
"hi ErrorMsg
hi VertSplit guibg=#c2bfa5 guifg=grey50 gui=none
hi Folded guibg=grey30 guifg=gold
hi FoldColumn guibg=grey30 guifg=tan
hi IncSearch cterm=none ctermbg=blue ctermfg=grey guifg=slategrey guibg=khaki
"hi LineNr
hi ModeMsg guifg=goldenrod
hi MoreMsg ctermfg=LightGreen guifg=SeaGreen
hi NonText ctermfg=LightBlue guifg=LightBlue guibg=grey30
hi Question guifg=springgreen
hi Search ctermbg=blue ctermfg=grey guibg=peru guifg=wheat
hi SpecialKey guifg=yellowgreen
hi StatusLine guibg=#c2bfa5 guifg=black gui=none
hi StatusLineNC guibg=#c2bfa5 guifg=grey50 gui=none
hi Title guifg=indianred
hi Visual cterm=none ctermbg=darkgreen ctermfg=yellow gui=none guifg=khaki guibg=olivedrab
"hi VisualNOS
hi WarningMsg guifg=salmon
"hi WildMenu
"hi Menu
"hi Scrollbar
"hi Tooltip

" syntax highlighting groups
hi Comment ctermfg=lightblue guifg=SkyBlue
hi Constant ctermfg=darkcyan guifg=#ffa0a0
hi Identifier ctermfg=darkgreen cterm=none guifg=palegreen
hi Statement ctermfg=brown guifg=khaki
hi PreProc ctermfg=darkmagenta guifg=indianred
hi Type ctermfg=darkgreen guifg=darkkhaki
hi Special ctermfg=darkmagenta guifg=navajowhite
"hi Underlined
hi Ignore guifg=grey40
"hi Error
hi Todo ctermfg=darkred ctermbg=yellow guifg=orangered guibg=yellow2


"vim: ts=4

 

3. 在windows下打开utf-8编码的文件乱码(可以通过 set enc? 查询文件编码)

无论是 查看 set enc=utf-8 或者 set fileencoding=utf-8 都不管用

http://www.cnblogs.com/hopeworld/archive/2011/04/20/2022331.html 写道
Vim有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding(这些选项设置请参考Vim文档中encoding-names章节),它们的意义如下:

encoding
encoding是Vim内部使用的字符编码方式,包括Vim的buffer(缓冲区)、菜单文本、消息文本等。默认是根据你的locale选择。VIM用户手册上建议只在.vimrc中改变它的值,事实上似乎也只有在.vimrc中改变它的值才有意义。你可以用另外一种编码来编辑和保存文件,如你的vim的encoding为utf-8,所编辑的文件采用cp936编码,vim会自动将读入的文件转成utf-8(vim的能读懂的方式),而当你写入文件时,又会自动转回成cp936(文件的保存编码)。
fileencoding
Vim中当前编辑的文件的字符编码方式,Vim保存文件时也会将文件保存为这种字符编码方式(不管是否新文件都如此)。
fileencodings
Vim自动探测fileencoding的顺序列表,启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1放到最后面。
termencoding
Vim所工作的终端(或者 Windows的Console窗口)的字符编码方式。如果vim所在的term与vim编码相同,则无需设置。如其不然,你可以用vim的termencoding选项将自动转换成term的编码.这个选项对GUI模式Vim(GVim)无效,而对Console模式的Vim而言就是Windows控制台的代码页,并且通常我们不需要改变它。

现在来看看Vim的多字符编码方式支持是如何工作的:

启动Vim,根据.vimrc文件中设置的encoding的值来设置buffer、菜单文本、消息文的字符编码方式。
读取需要编辑的文件,根据fileencodings中列出的字符编码方式逐一探测该文件编码方式。并设置fileencoding为探测到的,看起来是正确的字符编码方式。
对比fileencoding和encoding的值,若不同则调用iconv将文件内容转换为encoding所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的 buffer 里,此时我们就可以开始编辑这个文件了。注意,完成这一步动作需要调用外部的 iconv.dll,你需要保证这个文件存在于$VIMRUNTIME或者其他列在PATH环境变量中的目录里。
编辑完成后保存文件时,再次对比fileencoding和encoding的值。若不同,再次调用iconv将即将保存的buffer中的文本转换为fileencoding所描述的字符编码方式,并保存到指定的文件中。同样,这需要调用iconv.dll由于Unicode能够包含几乎所有的语言的字符,而且Unicode的UTF-8编码方式又是非常具有性价比的编码方式 (空间消耗比 UCS-2 小),因此建议encoding的值设置为utf-8。这么做的另一个理由是encoding设置为 utf-8 时,Vim 自动探测文件的编码方式会更准确 (或许这个理由才是主要的 ;)。我们在中文Windows里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为GB2312/GBK比较合适,因此fileencoding建议设置为chinese(chinese是个别名,在Unix里表示gb2312,在Windows里表示cp936,也就是GBK的代码页)。

当vim在utf-8的local下打开gbk文件时,显示的是乱码,可以在~/.vimrc文件中加入如下代码来解决:

set fencs=utf-8,gbk

这一行的作用是告诉vim,打开一个文件时,尝试utf8,gbk两种编码,vim只需要扫描文件的前一段,就可以根据文件里面的数据判断出文件是否用的是utf8或者gbk编码。如果不指定这一行,则vim只会用当前编码 (locale)来打开文件,因为locale是UTF-8,而文件是gbk,所以打开是乱码。

一般vim打开中文文件时出现乱码时可以用下面的方法来解决:

set fileencoding=gb18030 set fileencodings=utf-8,gb18030,utf-16,big5

这样设置的原因说明如下:vim里面的编码主要跟三个参数有关:enc(encoding), fenc(fileencoding)和fencs(fileencodings)。其中fenc是当前文件的编码,也就是说,一个在vim里面已经正确显示了的文件(前提是你的系统环境跟你的enc设置匹配),你可以通过改变 fenc后再w来将此文件存成不同的编码。比如说,我:set fenc=utf-8然后:w就把文件存成utf-8的了,:set fenc=gb18030再:w就把文件存成gb18030的了。这个值对于打开文件的时候是否能够正确地解码没有任何关系。fencs就是用来在打开文件的时候进行解码的猜测列表。文件编码没有百分百正确的判断方法,所以vim只能猜测文件编码。比如我的vimrc里面这个的设置是:

set fileencodings=utf-8,gb18030,utf-16,big5

所以我的vim每打开一个文件,先尝试用utf-8进行解码,如果用utf-8解码到了一半出错(所谓出错的意思是某个地方无法用utf-8正确地 解码),那么就从头来用gb18030重新尝试解码,如果gb18030又出错(注意gb18030并不是像utf-8似的规则编码,所以所谓的出错只是 说某个编码没有对应的有意义的字,比如0),就尝试用utf-16,仍然出错就尝试用big5。这一趟下来,如果中间的某次解码从头到尾都没有出错,那么 vim就认为这个文件是这个编码的,不会再进行后面的尝试了。这个时候,fenc的值就会被设为vim最后采用的编码值,可以用:set fenc?来查看具体是什么。

当然这个也是有可能出错的,比如你的文件是gb18030编码的,但是实际上只有一两个字符是中文,那么有可能他们正好也能被utf-8解码,那么这个文件就会被误认为是utf-8的导致错误解码。

至于enc,其作用基本只是显示。不管最后的文件是什么编码的,vim都会将其转换为当前系统编码来进行处理,这样才能在当前系统里面正确地显示出 来,因此enc就是干这个的。在windows下面,enc默认是cp936,这也就是中文windows的默认编码,所以enc是不需要改的。在 linux下,随着你的系统locale可能设为zh_CN.gb18030或者zh_CN.utf-8,你的enc要对应的设为gb18030或者 utf-8(或者gbk之类的)。

最后再来说一下新建空文件的默认编码。看文档好像说会采用fencs里面的第一个编码作为新建文件的默认编码。但是这里有一个问题,就是fencs 的顺序跟解码成功率有很大关系,根据我的经验utf-8在前比gb18030在前成功率要高一些,那么如果我新建文件默认想让它是gb18030编码怎么 办?一个方法是每次新建文件后都:set fenc=gb18030一下,不过我发现在vimrc里面设置fenc=gb18030也能达到这个效果。

 

 4. 全部替换

http://hi.baidu.com/jrjian/item/91deeedaa93144e0795daa3a 写道
替换的命令有:

:s/a/b/ 表示用b替换改行中第一次出现的a

:s/a/b/g 表示用b替换改行中所有出现的a



:m,ns/a/b/ 表示用b替换m至n行中第一次出现的a

:m,ns/a/b/g 表示用b替换m至n行中所有出现的a

m为.时表示从当前行开始;n为$时表示一直到最后一行



:%s/a/b/ 表示用b替换所有行中第一次出现的a。等价于:g/a/s//b/

:%s/a/b/g 表示用b替换所有行中所有出现的a。等价于:g/a/s//b/g

 

 

分享到:
评论
10 楼 vb2005xu 2014-05-14  
http://www.cnbeta.com/articles/263964.htm vim ide
9 楼 vb2005xu 2014-04-09  
http://coolshell.cn/articles/11312.html 无插件VIM
http://coolshell.cn/articles/894.html 如何在vim中得到你最喜爱的IDE特性
8 楼 vb2005xu 2013-12-25  
如何在vim中编写一个自动补全前后的快捷键


# visual 模式 Ctrl+V (例子是:轻松添加其他的 HTML Tags)
:vmap sb \"zdi<b><C-R>z</b><ESC> :在visual模式下选中的文字前后分别加上<b>和</b>
# 说明:vmap 是绑定一个在visual模式下的快捷键
# 原理:在visual模式下,\"zd 把一个选中的区域命名为z 然后删除,
# i 进入插入模式,输入<b>,<C-R>z 撤销刚才的删除,然后再写入</b>,
# 最后<ESC>返回normal模式

具体操作模式

vim ~/.vimrc

vmap <C-C> "zdii18n('<C-R>z');<ESC>

然后打开文件

vim test
按v进入试图模式,选择一段文本
然后按Ctrl+C

如果原来的文本是 Hello world ,那么新文本将变成 i18n('hello wolrd');
7 楼 vb2005xu 2013-12-25  
http://blog.csdn.net/xiemeikj/article/details/5549392 
vim 多文件操作常用命令
6 楼 vb2005xu 2013-12-25  
vim window size  设置

http://effectif.com/vim/changing-window-size
set lines=40 columns=100

http://vim.wikia.com/wiki/Maximize_or_set_initial_window_size
if has("gui_running")
  " GUI is running or is about to start.
  " Maximize gvim window.
  set lines=999 columns=999
else
  " This is console Vim.
  if exists("+lines")
    set lines=50
  endif
  if exists("+columns")
    set columns=100
  endif
endif

5 楼 vb2005xu 2013-12-24  
vim window size  设置

http://effectif.com/vim/changing-window-size
set lines=40 columns=100

http://vim.wikia.com/wiki/Maximize_or_set_initial_window_size
if has("gui_running")
  " GUI is running or is about to start.
  " Maximize gvim window.
  set lines=999 columns=999
else
  " This is console Vim.
  if exists("+lines")
    set lines=50
  endif
  if exists("+columns")
    set columns=100
  endif
endif

4 楼 vb2005xu 2013-12-24  
VIM中的标签页功能
引用

1. 配置
set tabpagemax=18     VIM默认只能打开10个标签页,在配置文件可以修改这个限制
set showtabline=0     不显示标签栏
set showtabline=1     这是默认设置,意思是,在创建标签页后才显示标签栏。
set showtabline=2     总是显示标签栏
2. 命令行命令
  :tabe filename      用标签页打开文件
  :tabnew filename    用标签页打开文件
  :tab split          用标签页打开当期编辑的文件
  :tabf filename*     用标签页打开与通配符匹配的一个文件
  :tabs               显示所有标签页,> 指示当前页,+ 显示修改未保存

  :tabc   关闭当前标签页,功能等同于:q
  :tabo   关闭所有标签页

  :tabn       跳转后一个标签页
  :tabp       跳转前一个标签页
  :tabfirst   跳转第一个标签页
  :tabr       跳转第一个标签页
  :tablast    跳转最后一个标签页

  :tabm 0/1/2   将当前标签页移动到第1/2/3个页面位置

  :tabdo        对多个标签页同时执行命令,如
                :tabdo %s/aaa/bbb/g
3. 操作命令
  gt        跳转后一个标签页
  gT        跳转前一个标签页
3 楼 vb2005xu 2013-12-24  
http://blog.csdn.net/cx300mhz/article/details/6872251 配置文件例子
2 楼 vb2005xu 2013-12-24  
http://vimcdoc.sourceforge.net/doc/syntax.html
1 楼 vb2005xu 2013-12-24  
http://easwy.com/blog/archives/advanced-vim-skills-taglist-plugin/

相关推荐

Global site tag (gtag.js) - Google Analytics