命令行下的编辑工具 Vim

来源:互联网 发布:mac玩手游问道 编辑:程序博客网 时间:2024/05/16 03:35

 

前言:
后台开发不用vim是不可能的,特别是有的环境下只有vim可用,这可如何是好?所以,vim不得不用。
将一些常用的使用方法记录于此。

将源代码转化为彩色的html文档。

首先,确保你是处于语法加亮状态,把要转换的源码用vim打开,看看是不是有颜色的?如果不是,使用命令:
:syntax enable
将vim的语法加亮功能打开

然后,执行命令:
:source $VIMRUNTIME/syntax/2html.vim

Okey,vim在另外一个窗口里面显示转换好的c++源码。大功就告成了,赶快保存下来吧,执行命令:
:write myhtml.html

ps:上面的$VIMRUNTIME是vim的运行目录,vim会自动定位到相应的目录,如果在那个目录下没有找到2html.vim,也可以手动输入,比如我的电脑上:
:source /usr/share/vim/vim64/syntax/2html.vim
参考:http://blog.csdn.net/euyao/article/details/2222941

显示空格或者tab的标记

vim set list

set nolist


使用SecureCrt 以及连接linux,导致的中文乱码问题汇总:

(特别提醒: 如果您已经按照下面的设置设置好了, 还是没有正确的显示中文, 那么请将securecRT终端再开一个窗口 clone session。不知为何, 第一次进去总是乱码)

场景一:

使用终端 securecrt终端,通过cat方式显示utf-8编码的文件,需要:

1)securecrt的选项设置编码为utf-8

   session-option=》terminal=》Appreance=》character encoding。

   并通过新开一个终端的方式使之生效!!(必须新开一个新的终端窗口,原窗口改完不会生效)

 

   说明:

   .bashrc 里面不论配置 LC_ALL=xx_xx.utf8, 还是 LC_ALL=zh_CN.gbk, 都不影响显示

 

场景二:

使用终端 securecrt终端,通过vim方式显示utf-8编码的文件,需要:

1)securecrt的选项设置编码为utf-8

   session-option=》terminal=》Appreance=》character encoding。

   并通过新开一个终端的方式使之生效!!(必须新开一个新的终端窗口,原窗口改完不会生效)

2)vim的.vimrc配置如下:

    set nocompatible

set encoding=utf-8

set fileencodings=utf-8,cp936 

“如上设置是vim可以识别utf-8和gbk的文件

 

   说明:

   .bashrc 里面不论配置 LC_ALL=xx_xx.utf8, 还是 LC_ALL=zh_CN.gbk, 都不影响显示

 

 

 

场景三:

使用终端 securecrt终端,通过cat方式显示gbk编码的文件,需要:

1)securecrt的选项设置编码为gbk

   session-option=》terminal=》Appreance=》character encoding。

   并通过新开一个终端的方式使之生效!!(必须新开一个新的终端窗口,原窗口改完不会生效)

   (!!这个好像不用新开窗口也能生效)

 

   说明:

   此时 LC_ALL的配置应该不影响,不过我此时的LC_ALL配置为:export LC_ALL=zh_CN.gbk

 

场景四:

使用终端 securecrt终端,通过vim方式显示gbk编码的文件,需要:

1)securecrt的选项设置编码为utf-8

   是的!必须选择utf-8!!!,否则不能生效!!!

   并通过新开一个终端的方式使之生效!!(必须新开一个新的终端窗口,原窗口改完不会生效)

1)设置vim

    set nocompatible

set encoding=utf-8

set fileencodings=utf-8,cp936 

“如上设置是vim可以识别utf-8和gbk的文件

 

   说明:

   此时 LC_ALL的配置应该不影响,不过我此时的LC_ALL配置为:export LC_ALL=zh_CN.gbk

 

 

 

:tselect 显示列表

:tn和:tp 显示后一个tag和前一个tag


ctrl+n ctrl+p 来在提示菜单中上下选择.
可用于自动补全是的多重提示

在历史窗口(文件)之间跳转的通用方法:
ctrl+o ctrl+i 在历史浏览的各个文件中跳转.
无用你是用tags的ctrl+]跳走了,还是通过gf调走了, ctrl+i/O都可以在不同的文件之前跳转

 

如何想VC2005那样,一下子打开指定的代码中指定头文件,跳转到指定的头文件?

vim的path功能, 解决了我打开文件头文件不方便的难题

举例如下: 

 18 #include "panel_auth.h"            

 19 #include "ptlogin_app_id.h"        

 20 #include "uuid_key.h"              

 21 #include "html_template.h" 

如何在光标处在panel_auth.h下的时候, 快速的打开panel_auth.h文件呢?

答案: vim的gf命令 和 path功能.

1)gf用来打开光标下的文件.

2)path用于指定搜索文件的路径

 

举例: 假设我的源码放在isd_qzoneappbase_proj路径下, 如下方法设置path即可.

set path=.,/usr/include, 

set path+=/data/home/nemo/code/isd_qzoneappbase_proj/**

首先把当前路径和系统头文件路径设在path路径下,然后再把源码的路径设置进去

 

此时:就可用gf打开isd_qzoneappbase_proj目录(包括递归目录)下的任一头文件, 也可以打开系统的头文件


一种将当前光标下的单词自动输入到命令行的方法
 <C-R>=expand("<cword>")<CR><CR>
该方法非常有用,可以用来自定义很多快捷键!
eg:如下的快捷键将自动执行tselect 当前光标下的函数。 查找当前光标下函数的所有tag
153 nmap <C-@>d :tselect <C-R>=expand("<cword>")<CR><CR>

定义一些快速关闭窗口的快捷键
,ww 快速关闭当前窗口
,wh 快速关闭左侧窗口
,wj ,wk ,wl 的含义同hjkl的方向的含义一样,快速关闭指定方向的窗口
配置如下:
155 let mapleader = ","

 

162 "关闭上下左右窗口的快捷键

163 "另外注意 

164 "  <C-W>o 关闭其他所有窗口                                                                                                      

165 "  <C-w>q 关闭当前窗口

166 map <silent> <leader>wj <C-w>j<C-w>q<cr>

167 map <silent> <leader>wh <C-w>h<C-w>q<cr>

168 map <silent> <leader>wl <C-w>l<C-w>q<cr>

169 map <silent> <leader>wk <C-w>k<C-w>q<cr>

170 "关闭当前窗口

171 map <silent> <leader>ww <C-w>q<cr>


vim中快速格式化代码(将凌乱不看的代码对齐)
进入v模式,选中代码, 按 = 号

vim中的一些简写,缩写语法
快速输入名字
:iabbrev zdl Nemozhang // 记Nemozhang的缩写为zdl, 在插入模式下输入zdl,再接一个空格是,会自动把zdl扩展为nemozhang
:iab zdl Nemozhang也行

 

程序员常用的快速输入注释
:iabbrev #b /****************************************

:iabbrev #e <Space>****************************************/

查看全部简写
:abbreviate

删除简写
:iunabbreviat zdl
:iunab zdl

 

 

vim 中在函数间快速移动,快速的在代码中移动


zb : 将当前光标所在行显示在页面最下面
zt  : 将当前光标所在行显示在页面最上面  
zz : 跳到中间(!!! 慎用, 因为大写的ZZ会直接保存并退出vim) 

 

% 跳到 和()  {}等匹配的对应位置

 

{ 或  } 跳到下/上一个空白行 ==========> 非常有用!!! 注意{是shift+[键

[[ 跳到函数定义开头 或者上一个函数定义开头

][ 跳到函数定义结尾 , 或者下一个函数定义结尾

]]  跳到下一个函数开头
gd  跳到变量的定义处(对局部变量有效)(不怎么有用,可以直接#号搜索即可)

 

vim中使用make

  :cc 3           跳到第三个错误处

  :cnext          下一个错误

  :cprevious

  :clist! 查看所有make的报错


查看vim中的已有的按键映射

 

:map 
比如我本机输出:

   ,ee           :e ~/.vimrc<CR>                                                                          

   ,ss           :source ~/.vimrc<CR> 
   <C-W><C-T>    :WMToggle<CR> 

 

 

 

vim 自带的文件浏览 (不是WMToggle插件哦)

edit . 浏览当前文件夹文件, 可以快速的打开其他文件
edit dirname 浏览指定的文件夹

不退出vim,不保存当前文件,而打开新的文件 

:edit! foo.txt 强行忽略当前文件的修改,而打开新的文件

 

既不想保存,也不想放弃修改,又想编辑其他的文件

        :hide edit foo.txt

打开文件时,回到上次对该文件的最后编辑的位置 (非常高效)

`" 回到你离开文件时光标所在的位置。 比如我上次编辑了applist_select.cgi下次可以通过这种方法重新回到最后查看过的位置

`. 回到你离开文件是最后改动的位置。
 
vim的文件另存为

:saveas newfilename 另存为。与windows下行为一致,保存后,编辑新的文件。而不是老文件。
:w newfilename 只是把文件保存为一个新的文件,但vim仍然编辑的是老文件。

已只读方式打开文档(真正只读,不可修改)
vim -M applist2.cpp

打开文件
:e ~/1.php  // 打开~/1.php


 

 

查询vim的设置情况 

:set compatible? 查询是否设置了兼容模式

:set filetype? 查询vim识别的当前的文件类型


vim中F1,F2,F3,F4等按键映射不管用,出现P,Q,R,S等奇怪字符
按 F1 显示 P 然后换行
按 F2 显示 Q 然后换行
按 F3 显示 R 然后换行
按 F4 显示 S 然后换行
答案:我是用的终端secureCRT的设置有问题。
option-terminal-emulation-terminal:【xterm】。即可。

vimdiff 
linux下高级的,彩色的文件比较工具
使用方法: vimdiff file1 file2

各个差异点之间快速移动
跳转到下一个差异点:]c

跳到上一个差异点:[c

把一个差异点中当前文件的内容复制到另一个文件里

dp (diff "put")


把另一个文件的内容复制到当前行中

do (diff "get",之所以不用dg,是因为dg已经被另一个命令占用了)重新比较文件差异(通常vim在文件更新后会自动更新差异,如果没有,可以通过下面命令手动更新)

:diffupdate

设置差异点处显示的上下文行数(vim默认是6)

:set diffopt=context:3


关于vimdiff非常详细的参考资料:
技巧:Vimdiff 使用
http://www.ibm.com/developerworks/cn/linux/l-vimdiff/#ibm-pcon

有个文件,混杂了utf-8编码和gbk编码, 在vim里面打开完全乱码无法看,没有一个字可以看清楚
在windows下可以打开,只有部分显示乱码.
这是因为我的vim设了utf-16le, 这个格式几乎可以打开任何文件,可惜的是,当文件不是utf-16le的时候,打开就完全乱码了.
下面是我的错误的vim设置(其实也不算错误啦)
set fileencodings=usc-bom,utf-8,chinese,gb18030,utf-16,utf-16le
vim打开文件时, 首先从前面的编码尝试, 如果能打开就采用其. 当vim尝试了一圈之后,发现前面的都一一不支持, 最后utf-16le支持打开,可惜我的文件并是不utf-16le格式的!
解决方法:
把utf-16le去掉即可. 去掉之后, 我的utf8和gbk的混合文件就可以以utf-8打开或者gbk打开了. 至少只有部分字符时乱码,大部分英文自己是可以看的.
所以一般都把兼容性不强的编码放在前面,比如上面的usc-bom应该是ascii编码,兼容性最差.设置utf-16le是个好事,能兼容打开更多的文档,可以遇到了混杂utf8和gbk的时候就杯具了, 如果极少使用utf-16le的文件, 那么干脆把这个utf-16了去掉较好.

vim中的滚屏
Ctrl+E   向前滚动一行(光标跟着一起走)
Ctrl+Y   向后滚动一行(光标跟着一起走)
Ctrl+F/B 向前向后滚动一页

.vimrc文件的第一行一般都是 :set nocp 或 :set nocompatible, 为什么?
因为.vimrc存在的目的就是为了是vim在vim模式下工作。 所以,先设为vi不兼容,也就是vim模式。
:help cp 查看更多信息

有没有办法在不退出vim的情况下重新加载.vimrc的配置?
:source ~/.vimrc 即可。
可以映射快捷键,在.vimrc中加入如下两行
let mapleader = ","
map <silent> <leader>ss :source ~/.vimrc<cr>
map <silent> <leader>ee :e ~/.vimrc<cr>
这样在vim的正常模式下, 输入 “,ss” 即可重新加载.vimrc, 输入“,ee”即可编辑.vimrc
有关<leader>的含义,参考 易水 vim进阶 第4章 vimrc初步

编辑模式下退格键backspace退格键和上下左右光标移动键不能用,非常不方便。

在编辑模式下,移动光标会变成A B C D等字符并换行。
这是vim与vi的兼容性问题。默认vim工作在vi兼容模式下,很多新手带来了困惑。
:set nocp 或 :set nocompatible
查看帮助 :help nocp 

编辑模式下,backspace退格键无法删除文档里原有的东西,只能删除刚输入的东西。
需要设定
:set bs=2 或 :set bs=indent,eol,start 或 :set backspace=indent,eol,start
查看帮助 :help bs
文章参考:http://blog.csdn.net/ablo_zhou/archive/2009/02/03/3860236.aspx

光标在行尾按右方向键不到下一行行首,在行首按左方向键不到上一行行尾,怎么回事?
需要设定
:set ww=b,s,[,]
参考帮助 :help ww 或者 :help whichwrap
        b: 在 Normal 或 Visual 模式下按删除(Backspace)键。
        s: 在 Normal 或 Visual 模式下按空格键。
        h: 在 Normal 或 Visual 模式下按 h 键。
        l: 在 Normal 或 Visual 模式下按 l 键。
        <: 在 Normal 或 Visual 模式下按左方向键。
        >: 在 Normal 或 Visual 模式下按右方向键。
        ~: 在 Normal 模式下按 ~ 键(翻转当前字母大小写)。
        [: 在 Insert 或 Replace 模式下按左方向键。
        ]: 在 Insert 或 Replace 模式下按右方向键。
文章参考:
http://blog.csdn.net/ablo_zhou/archive/2009/02/03/3860236.aspx

复制粘贴时,一旦使用了dd,dw,原来复制的东西就被删除的东东替换了
使用指定的寄存器粘贴. 避免受到dw dd命令的干扰

"0p 0指的是第0个寄存器, 双引号不可少. 完整命令时: 双引号0p
更多参考寄存器的玩意参考:
http://blog.csdn.net/KataDoc360/archive/2009/08/09/4427721.aspx


快速在项目中查找文件 不用在各个目录之间切换
类似于si的输入部分文件名字自动匹配一样.
1) 易水 vim进阶 的博客上有个vim插件可以用
2) 人肉方法 
    1) 收集全部项目文件
        find . -name "*.h" -o -name "*.c">allfiles 
    2)用vim打开allfiles 搜索指定的文件名 通过 gf命令快速打开

 

 

 

快速返回上次编辑过的地方(光标停留的地方)
类似于vc2005的ctrl + '+/-'.

 

快速查看文件信息
CTRL+G 文件名字,文件行数,以及当前所在的位置行号

 

光标快速移动
hl 左右 jk上下
    如何方便的记住呢?  键盘上J所在那行最右一个字母字母是J,所以,J是向右, 同样H是向左喽.
    j可以认为字母的下半身比较大,往下沉.
w,b向左/向右移动一个单词,相当于windows的ctrl+<>
当某一行较长时,hl上下移动时可能会跨行,这时你可以在按 h、j、k 或者 l 之前键入一个 g即可.

0行首,
$行尾
^第一个非空字符 (非常有用!!!)
(注意,三个键在键盘上市从右向左,^和$需要配合shift键输入)
向前移动一个词w,向后移动一个词b (相当于windows下的ctrl+光标移动)
*:读取光标处的字符串,并高亮文章中的全部字符串.并且移动光标到它再次出现的地方。(相当于快速搜索sourceinsight的alt+f4快速搜索)
#:反方向快速搜索光标所在的单词
3j 将会把光标向下移动三行。

numG:将光标定位到num行。(输入该命令是无须线输入:号),等价于 “:num回车”
文件开头:gg
文件结尾:G
上翻页:ctrl+b (记住翻页时bf即可。)

下翻页:ctrl+f
a:在当前字符的右边插入
o: 新插入一行

如何用vim 删除指定区域的文字?(注意,不是删除一样哦)
输入 V 进入 visual 模式, 左右移动光标选中区域, 按D键即可删除。
复制指定区域通删除是一样的,区别的是,复制使用y。

vim支持列模式吗?
输入 Ctrl+V 进入 列visual模式,可以选择矩形块。

如何不退出vim的情况下执行shell命令?
vim :!进入shell模式,输入shell命令

如何让vim跳到一个函数的原型(函数的定义)处?
ctrl+]调往函数定义(如果有多个定义,使用:ts), 看完后跳回ctrl+t。
前提是要ctags的支持。
1)安装ctags  apt-get install exuberant-ctags
2)ctags -R * 在当目录下为所有源代码文件生成tags。 在当前目录下运行vim即可支持ctrl+], ctrl+t跳转。
3)如果tags在其他的目录,那么可以通过如下的方式明确指定tags
     :set tags=~/code/xxx/tags
4)  需注意:vim启动时,vim的工作目录(vim启动是所在的目录)的名为tags的文件档案会被自动载入,同时,位于$VIMRUNTIME/doc 及 $HOME/.vim/doc 目錄下的 tags 檔也會自動載入。而且,凡是載入的 tags 檔裡頭所有標誌文字都可以使用補全鍵來補全,別忘了這個好用的功能。
5)如果同一个在多处存在相同的tag,怎么办?
   :ts 命令就能列出一个列表供用户选择。   
   :tp为上一个tag标记文件,“:tn”为下一个tag标记文件。当然,若当前tags文件中用户所查找的变量或函数名只有一个,“:tp,:tn”命令不可用。

更多信息参考后文 ctags的使用

vim中的查找
输入:/keyword 回车
n下一个匹配, N上一个匹配

vim 高亮当前光标下的关键字
*  寻找光标所在处的单词word(全字匹配)。直接输入*号即可. n/N:向下/上遍历高亮的结果
g* 模糊匹配当前光标所在地方的单词
据说还有 mark.vim插件. 没试过.
取消高亮输入:nohl

vim书签mark的功能 回到上次编辑的位置
:marks  得知目前所有書籤的列表
mx  x 代表 26 個小寫英文字母,這樣游標所在處就會被 mark。
`x  回到書籤原設定位置。` 是 backward quote,就是 Tab 鍵上面那一個。

 

小写字母书签  只作用於單一檔案內。
大写字母书签  可作用於編輯中之各檔案間。
数字书签        可作用於前次編輯的十個檔案。

数字的用法比较特殊,'0 是回到前一次編輯檔案中離開前的最後位置,'1 則是回到前二次編輯檔案的最後位置,依此類推。您不必使用 m 來標示,vim 會自動記憶。很玄吧!其實這是 viminfo 的功能,您要認真追究的話,請 :h viminfo-file-marks。viminfo 關掉,就沒這個功能了!
所謂前次指的是前次啟動的 vim。


vim中的替换:%s/10.3.3.3/10.6.207.119/cg等价于::1,$s/10.6.207.2119/10.6.207.119/cg将全部出现的 "10.3.3.3" 替换为 10.6.207.119, 并且替换每一个进行提示确认是否替换.语法:[range]substitute/from/to/[option]在[range]指定范围,将“from”替换成“to”;substitute可简写为s如:1,10s/first/second/将1到10行的first替换为second

:%s/first/second/
% 表示范围是全文
上句表示全文每行首个匹配“first”的替换成“second”
s默认每行首个匹配“first”的替换成“second”

要全文替换,命令为
:%s/first/second/g
其中%表示所有行,g表示对于每一行进行操作
(!!!暂时发现 不用g也会全局替换, 即是一行中出现两个目标, 两个目标都会被替换.)
对于要匹配的字符串中有特殊字符,需要反斜线/进行转义(这部分涉及到元字符,正则表达式),例如
用  /tau  替换  /lambda
s///tau///lambda

[option] : 表示操作类型
如:g 表示全局替换;
c 表示进行确认

vim中的替换模式
rx 把但前光标位置的字母替换为x。 也就是点击r进入替换模式。
这样省的每次都先进入插入模式把东西先删除掉再插入。

vim中删除
dd删除一个行,x删除一个字符,这些都很常用的啦
d$删除当前到行尾 dw删除当前单词

注意:
$总是代表着行尾。
g代表着文件开头或结尾 gg文件开头 G文件结尾
再配合着下面“光标快速移动一节”的0,^可以做很多灵活的删除

撤销和重做
u撤销(undo),.重做redo

批量注释以及反注释
ctrl+v 之后,然后按j或者k,选择要注释的多行(也可以按上下箭头键,但是有些情况下不起作用),然后按 I (注意大写的i),进入插入模式,然后写下//,然后按下ESC即可。

what
how
就会变成
//what
//how

反注释怎么办呢?更简单了,同样Ctrl+v进入列选择模式,移到光标把注释符选中,按下d,OK了吧?!

vim显示/隐藏行号
:set nu 或者 :set number
不显示行号
:set nonu

vim拷贝模式 vim下粘贴东西是往往每行都多出个tab的文章偏移的问题

copy的时候 :set paste, 进入copy模式 :set nopaste改回来

vim正用呢死机了,输不了东西,没反应
按下 ctrl+q.即可
因为不小心按到了 ctrl+s 锁屏了,<C-Q>解锁.

vim多标签浏览
vim 从 vim7 开始加入了多标签切换的功能, 相当于多窗口.
用法
:tabnew [++opt选项] [+cmd] 文件            建立对指定文件新的tab
标准模式下:
gt , gT 可以直接在tab之间切换。

不常用:
:tabc       关闭当前的tab // nemo comment:可用:q退出即可。
:tabo       关闭所有其他的tab
:tabs       查看所有打开的tab
:tabp      前一个
:tabn      后一个


vim多子窗口浏览
常用的:
:qa! 退出全部窗口
Ctrl-w 方向键 或 hjkl键在各个视窗之间切换
Ctrl-w Ctrl-w 在窗口之间循环切换
Ctrl-w o  即 :only! 使游標所在之視窗,成為目前唯一顯示的視窗
不常用的:
Ctrl-w n  即 :new。開一空的新視窗。
Ctrl-w s/v  即 :水平或垂直分割窗口
Ctrl-w q  即 :q 結束分割出來的視窗。

 

垂直分割窗口,并且打开当前文件夹树

:vsplit .

当然也可是 <C-W>v , 再输入:e .

水平分割窗口,并且打开当前文件夹树

:split .

当然也可是 <C-W>s , 再输入:e .

 

调整窗口大小

CTRL-W =        使得所有窗口 (几乎) 等宽、等高,

但当前窗口使用 'winheight' 和                'winwidth'。

CTRL-W <        使得当前窗口宽度减 N (默认值是 1)。

CTRL-W >        使得当前窗口宽度加 N (默认值是 1)。

CTRL-W -        使得当前窗口高度减 N (默认值是 1)。

CTRL-W +        使得当前窗口高度加 N (默认值是 1)。


调整窗口位置

<整个窗口的移动>

CTRL-W-H 将窗口移到最左边

CTRL-W-L 将窗口移到最右边

CTRL-W-J 将窗口移到底端

CTRL-W-K 将窗口移到顶端

 

更多窗口操作

http://liaochengcn.blog.163.com/blog/static/17021133620104270817822/



vim文件浏览 File Explorer 资源管理器 文件列表树
安装 winmanager
:WMToggle 调出文件列表树窗口
:ctrl+w然后方向键,在不同窗口间切换, 或者直接ctrl+ww(两个w)切换
下载以及安装:http://www.vim.org/scripts/script.php?script_id=1440
下载bz2, 解压开是个*.vba, 拷贝到 ./vim/plugin, 进入到plugin目录, 用vim打开这个*.vim文件, 运行:so %
即可.
参考:http://hi.baidu.com/phps/blog/item/1bf9bb09105711266a60fb7a.html

去掉讨厌的 >---
11 "set list
12 "set listchars=tab:>-,trail:-

vim智能单词提示 智能补全
<C-X>,<C-P> 即:先ctrl+x,再ctrl+p
或者直接<C-N> 或这直接 C-P


 

原创粉丝点击