VIM与Gvim使用

在insert模式下,C-R (register)插入register里的内容,一个有趣的reg是"=".
假设你想输入123K的具体字节数,不用打开计算器,试试这个“=1024*123”,
“125952”就出来了!
另外在命令行里C-R C-W和C-RC-A是必用的技巧,它们将光标下的
考到命令行里,省了你无数的typing。

3. C-X (auto complete)
在insert模式下,C-XC-P/N/L/F等自动完成前面的词、行、文件名等,是编程时必用的
命令。其中C-P和C-N可以不用C-X。

4. [p & ]p (smart paste)
paste同时自动根据目标行的缩进调整来源行的缩进。在copy代码段的时候非常有用。

5. C-O (fast out, fast in)
在insert模式下,用C-O后可以执行一个normal命令,然后立即返回insert模式,省去了
用ESC的麻烦。

6. [I (fast grep )
[I显示文件中包含光标下的所有行。我常用来浏览某个id在程序中的引用情况。
还有很多相关的命令::h include-search

7. object-select
iw, aw, ib, i], i} ... 都非常有用!看help吧
:h object-select

先写这么多,以后再补充吧。

例如你想把所有的"..."形式的串替换成'...'的形式
但引号里的内容不变
你就可以用
%s/"\(.*\)"/'\1'/来做
上面这个正则表达式"\(.*\)"里 \用来表示()是元字符
第一个在括号里的被匹配的串就可以被\1来代表, 以后依次是\2 \3。
顺便说一句,我到现在还不
知道怎么限制vim里正则表达匹配的贪婪算法。

------------------------------------

里面说的非贪婪匹配是 \{-},
    也就是%s/"\(.\{-}\)"/'\1'/g
    \太多了可以用 \v,
       %s/\v"(.{-})"/'\1'/g
详细
    :h/\{-
    :h \v
另外 和 perl 正则表达式的区别在 :h perl-patterns
把aaaaa.20300.2000.com 替换为aaaaa.com
  ~字符 ~~~~~数字和点

我用s/\(^.*)\(\.\d*.\)com/\1.com/
结果为 aaaaa.20300.com
请问有没有好点儿的办法?谢谢


☆─────────────────────────────────────☆
   alphatan ( C )于  (Tue Aug 10 09:27:19 2004) 提到:

【 在 qiaolin (风儿) 的大作中提到: 】
: 把aaaaa.20300.2000.com 替换为aaaaa.com
:   ~字符~~~~~数字和点
: 我用s/\(^.*)\(\.\d*.\)com/\1.com/
  1. \(^.*\) 一下子把整个字符串吞进去了. \1 =aaaaa.20300.2000.com
  2. 遇到com把 com从\1中吐出来. \1 =aaaaa.20300.2000.
  3.遇到.把com前面的\.吐出来   \1 =aaaaa.20300.2000
  4. 遇到\d*, 再把随后的2000吐出来 \1 =aaaaa.20300.
  5. 遇到\., 把.也呕出来了.  \1 =aaaaa.20300
所以, 得到你要的结果.
可以用\{-}进行非贪婪匹配.

但为什么不直接把数字跟它们的点去掉呢?
s/[0-9.]\+//g

: 结果为 aaaaa.20300.com
: 请问有没有好点儿的办法?谢谢
☆─────────────────────────────────────☆
   qiaolin (风儿)于  (Tue Aug 10 09:36:27 2004) 提到:

谢谢大侠,有问题请教:
贪婪匹配的顺序是怎样的呢?
在这个例子中,先匹配第一个pattern,再从最后面的pattern一个一个“吐”出来?
【 在 alphatan ( C ) 的大作中提到: 】
:   1. \(^.*\)一下子把整个字符串吞进去了. \1 = aaaaa.20300.2000.com
:   2. 遇到com把 com从\1中吐出来.\1 = aaaaa.20300.2000.
:   3.遇到.把com前面的\.吐出来   \1 =aaaaa.20300.2000
:   4. 遇到\d*,再把随后的2000吐出来 \1 = aaaaa.20300.
:   5. 遇到\.,把.也呕出来了.  \1 = aaaaa.20300
: 所以, 得到你要的结果.
: 可以用\{-}进行非贪婪匹配.
: 但为什么不直接把数字跟它们的点去掉呢?
: s/[0-9.]\+//g
这里没有这样用是因为aaaaa也可能是a123a,可不可以用/w呢?
在查找、替换命令 使用以下正则表达式元字符,功能强大。
也可用在:g/命令中

& 代表最近匹配串
~ 代表最近替换串
. 任一字符
^ 行首 或 表示 非
$ 行末
\< 词首
\> 词尾
*           0次或多次
\( \) 分节指定与其中正则式匹配的部分,在替换时候可以用 \1 \2\3  ... 引用匹配部

[] 表示选择
- 表示范围 ,例如 [0-9]代表数字,[a-z]代表小写字母 [^0-9a-zA-Z]代表非数字和大小
写字母
\{m,n\} 前面部分的从 m 次 至 n 次出现,m n 为数值
\{m\}               精确m次出现
\{m,\}              大于等于m次出现

以下举几例子,欢迎大家提出问题来共同探讨。
1.在20列后插入串
:%s/^.\{20\}/&insert something here/g

2.把C++语言里 //注释 修改为 /* */ 格式
:%s/\/\/\(.*\)$/\/\*\1\*\//g

3.在建存储过程的sql文本里,在每个create procedureprocname()
  前加上drop procedure  procname;  [ ]里输入的是一个空格和TAB键。
:%s/^[ ]*[cC][rR][eE][Aa][tT][eE][    ]*[pP][Rr][oO][cC][eE][dD][uU][rR][eE][    ]*
\([^(]*\)/drop procedure \1;Ctrl_VCtrl_Mcreate procedure \1/g

----------------

数字加减, CTRL-A, CTRL-X

----------------

vim里自动缩进一段
把光标移动到某个花括号,
按 =% 缩进整段。
把整段不按格式往外缩一个tab
>%
缩两个
>>%
往里缩
<%

注意%匹配很多东西,
如果你想从
#ifdef
缩到
#endif
也可如此

try :help c_CTRL-R
    :helpc_CTRL-D

:将光标下的keyword拷贝到命令行缓冲区中
*: 从系统剪贴版中拷贝内容
=: 表达式求值
": 拷贝buffer中的内容
....

: 命令和文件提示
常用命令:
------------------------------
   CTRL-Z     vim 切换到后台

   :g/xxx     列出所有含 xxx 的行; 适合想到含 xxx 的某行, 但不知道行号,
                   /xxx 又太慢

    q: q/q?   编辑长命令时比较舒服, 执行按回车, 按 CTRL-C 再次进入
                   : / ? 原来的输入状态, 再按一次关闭.

   CTRL-W=    所有窗口等高, 适合 diff 时自己移动了 window 大小
   CTRL-Wo    等效于 :only
   CTRL-Wc    等效于 :close!

    gvim-u    用 NONE 的话必须大写, 可以用 nul 文件, gvim -u nul, 而且不
                       区分大小写

        -s    执行脚本文件, 是 normal 时的指令, cmd 的命令要 :,但不用加
        -w    把所有按键记录appedn   到指定文件中
        -W                   overwrite
               这 2 个适合不会 perl sed 的 vimer

       --servername
       --remote-silent    这 2 个搭配着用, 可以总在一个 vim 里打开新文件, 比如
               gvim.exe  --servername smarter --remote-silent  test.text
               命令太长, 可以自己 alias 一下(win32 下用 doskey 就可以)

    再次选中上次选中的内容, 用 gv
   在选中的区域首尾跳动, 用 大写 O

   :redi      把输出信息重定向, 比如 保存所有 set 选项到 剪切板
                   :redi   @*
                   :se all
               具体 :h redi


c\c++ 下常用的:
------------------------------
    [[
    ]] 在 C 的{} 形成的段落中移动 (在第一列 { 之间跳动,
       一次一个函数,一个结构或类的定义)

    [# 和 ]#在 #if #else #endif 的上下位置间移动
   [{    ]}
   [(    ])
   [/    ]/ 在注释/* */ 间移动
       这样在这些块的中间位置, 就能迅速到块头和块尾
       如果已经在这些行上, 如果不是到对应点,
           会到上一级范围, 如 { 上按 [{ 到上一级
               ]}  则到对应点

    (vim里常用 [ 表示 "向上",
               ] 表示 "向下",
       比如上面的例子, 以及 [i ]i, diff 时候的 [c ]c 等)

   %  在 ()  {}  []  #ifdef#endif  /* */之间跳转
       可以 :so  $VIMRUNTIME/macros/matchit.vim
       这样可以在 if endif <\tr> 之间使用

    对 1个块的操作, 具体 :h v_a
       里面的 iX aX 什么的都很好用

    ctags 用-a 附加新 tags 到 ctags 文件后

    --- 对c
    ---ctags  -R --c-types=+px  d:\mingw\include (etags)
    --- 因为ctags 确省不把函数声明作为 tag

    --- 对c++
    --- ctags -R--language-force=c++ --c++-types=+px --verbose --extra=+q
           extra=+q 用来增加生成 Class::member 的形式, 默认没有
           这样就可以用 :ts CView::OnDraw 这种形式看
    --- 因为 c++一些头文件不用 .h 所以要用 --language-force

    --- 对java
    --- ctags -R--languages=java c:/jdk131/src
    --- 要把src.jar 展开

   :che    检查include 的文件在 path 中是否存在, 注意会递归验证

插入模式
------------------------------
    insert模式下的:
       CTRL-W     回删一个 word, 具体 :h i_ctrl-w
       CTRL-U     回删在当前行输入的内容

       CTRL-R     用某个 reg 的内容

       CTRL-E
       CTRL-Y

      0CTRL-D     这 2 个对缩进, 具体 :h i_0_CTRL-D
      ^CTRL-D

       CTRL-C     退出 insert

      另外, ascii 第 1 - 26 个对应的就是 CTRL-A 到 CTRL-Z
           所以下面几个也常用
       CTRL-H  对
       CTRL-J  对 vim 里叫
       CTRL-M  对

    不使用ab:  输入 缩写 后, 按 ctrl-v接着输入以后的字符
发信人: sysfree (虫), 信区: VIM
标  题: 插入模式下的命令汇总
发信站: BBS 水木清华站 (Wed Nov 17 14:36:29 2004), 站内

插入模式下有用的键盘命令:
(注意:以下命令都是在插入模式用的,也就是左下角要显示"--Insert--")

CTRL-[ or CTRL-C:退出插入模式。如果嫌太费事,可以试试这个。
CTRL-A:插入先前插入过的内容。看起来比较有用,但是飘忽不定,很难把握。
CTRL-N/CTRL-P: 搜索匹配,自动完成单词(超级有用)。
CTRL-R:插入寄存器内容。例如*会插入windows剪贴板的内容。:reg命令查看全部寄存器。
CTRL-T/CTRL-D: 将本行缩进/去缩进,无论光标在什么位置
CTRL-Q: 当CTRL-V不能用时,可以试试这个。
CTRL-Y: 输入和上面一行相同的字符。有时候可能用的着。
CTRL-E: 输入和下面一行相同的字符。
CTRL-X: 进入CTRL-X模式。

CTRL-X模式基本上是用来自动完成的。vim的自动完成可以包含当前文件、头文件、tag文件、字典文件等。
CTRL-X模式中的主要命令:
CTRL-X   CTRL-L: 整行自动完成
   CTRL-P/CTRL-N: 在当前文件中自动完成单词
    CTRL-I:在头文件中查找匹配的单词
    CTRL-]:在tag中补全单词
    CTRL-F:自动完成文件名
    CTRL-D:在头文件中查找宏定义
以上命令都可以再紧跟CTRL-P或CTRL-N,表示继续向前或向后搜索。
例如:按CTRL-XCTRL-L补全了一行,但不是自己想要的,可以继续按CTRL-L查找,也可以按CTRL-P或CTRL-N继续查找。找到后如果再按CTRL-XCTRL-L将会把找到的那一行的下面的行也复制过来,很过瘾吧?
下面两个命令也在CTRL-X模式,但是不属于自动完成:
CTRL-X CTRL-E: 在插入模式下让屏幕往上滚一行
CTRL-X CTRL-Y: 同上,屏幕下滚一行

其它不常用的命令没有列出。欢迎补充。

去掉菜单   set go-=m
去掉工具条  set go-=T
去掉右边的滚动条  go-=r
去掉下边的滚动条  go-=b
4 最好的办法,编辑_vimrc.
加入set fileformats=unix,dos,mac
不管什么格式都可以识别了。按说vim可以自动转换的,不知道为什么
要自己加,我的是vim63 windows版。
你想要的是 'cscopequickfix' 这个选项吧?

首先,你要设置 'cscopequickfix' 这个变量,比如
set cscopequickfix=s-,c-,d-,i-,t-,e-
再打开 quickfix 窗口
copen
然后,比如你要找出所有出现 elephant 的地方,可以
cscope find s elephant
所有的结果都显示在 quickfix窗口里面了,可以双击或者回车来选择。

发信人: ann77 (ann), 信区: VIM
标  题: Re: 请教如何将vim和编译器整合使用
发信站: BBS 水木清华站 (Wed Jul  7 12:49:16 2004),站内

我做了一个试验,也许对你有帮助。

VIM和其他编译器一起工作的原理就是把
compiler 的stderr 重定向到一个临时文件中。

然后用 :cfile 打开这个临时文件,
用 errorformat 来解释临时文件的内容。

下面我的具体做法,
我是在 BASH 下。
$for i in * ; do echo "2:$i:$(head -n 1 $i)" ; done > x
生成一个错误文件,内容如下
2:scr:#!/bin/bash
2:screenshell:#!/bin/bash
2:view-data.py:#!/usr/bin/python
2:view-data.sh:#!/bin/bash
2:x:2:scr:#!/bin/bash
每一行的格式就是
行号:文将名称:错误信息。

然后用 vim
:set errorformat=%l:%f:%m

设定 errorformat 的格式, :help errorformat for moreinformation
:cfile x
打开错误文件。

然后就可以想 make 出错的时候一样,打开每一个文件的第2行了。


我认为,你切换到了新的 compiler 后,你要做的事情就是
观察新的 compiler 的错误输出,编写一个新的 errorformat
就行了。

调试的时候,可以
$ make 2>temp-error-file
然后 vim 中
:set errorformat=?????
:cfile tmp-error-file

【 在 Charity (花无缺) 的大作中提到: 】
: 在RH下,我已经习惯了
: GCC + Vim + Make整合使用,
: Vim好像可以直接利用GCC编译器生成的Error List,
: ...................
标  题: Re:如果查看一个10000000行的文件,如何提高速度?
发信站: BBS 水木清华站 (Fri Jul 23 11:03:37 2004), 站内

只要就是颜色高亮引起的, 只要syntax off 或是set filetype=就可以了
这个在打开那些一行xml文件时尤其明显(xml可以set filetype=html)

【 在 thinelephant (严重消化不良) 的大作中提到: 】
:主要是翻页的速度,如果向下一点一点的翻页速度还可以,但是向上翻页或者滚动就很慢,或者跳到文件末也要等一会。退出也要等一会。
: 呵呵,我已经找到解决方案了:只读打开,set compatible,syntaxoff。
: 速度不错,关闭也是瞬间。
: ...................
'd

d 表示0-9的数字,
代表最近打开的文件
发信人: windblown (......), 信区: VIM
标  题: Re: 问一个替换怎么写
发信站: BBS 水木清华站 (Tue Dec 14 10:08:39 2004), 站内

用sed吧
sed -e '
:REPEAT
s/\([[:alpha:]]*\) \([0-9]*\),/\1 \2\n\1 /
t REPEAT
' yourfile

【 在 thinelephant (严重消化不良) 的大作中提到: 】
: 每一行都是 \S\+ \(\d\+,\)*\d\+的形式,想把每行的逗号分割的数字展开成多行。
: 例如
: elephant 13,18,19
: ...................
vim 使用的一些小技巧。

在每行后面插入一行68个-号,用下面的命令:
:%s/\n/\r---------\r/


vim的列模式。
在命令模式下,按v(orV)可进入可视模式,但是只能按行选择。要进入列模式,使用ctrl+v。


VI是VIsualeditor的意思,ex是他的“不可视”版本。如果多许多文件进行同样的编辑,用vim一个一个弄,就显得很麻烦。这种情况,我们可以采用ex进行自动化处理。例如要把当前目录下所有的html文件编码由big5转换成gb2312,可以执行下面的脚本:
#!/bin/bash
for I in *.html;do
ex - $I< :set encoding=big5
:setfileencoding=gb2312
:wq
EOF
done


基于GTK2的gvim在gbk的locale下,菜单和编辑区中文字全乱码,而gb2312和utf-8locale下均正常。解决办法:在自己的home目录下,创建一个.gvimrc文件,其中包括:
set encoding=gb2312
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
其原理似乎也是使用了gb2312的locale。gvim(GTK)本身不支持gbk?


vim具有的fold功能,可以把相连的某些行折叠起来,在需要的时候展开。
选中要折叠的行,zf命令创建一个fold并折叠起来,zr命令展开。z打头的很多命令都和fold操作有关,具体请:helpz


假设你在编辑一篇html文件,可以使用如下命令对它进行排版:
:%!tidy -iq
tidy是一个html/xml格式化工具,同时还具有查错和转换功能。


vim对很多源文件提供彩色显示功能,能否把vim中显示的彩色发布到web上呢?下面的命令能帮你完成。
:TOhtml


使用y命令在vim中复制的时候,可以保存在a-z26个寄存器中,其实还有两个寄存器可以使用:*和+,放置在*寄存器中的文字("*yy),可以通过鼠标中健粘贴到其它程序中,比如mozilla,+号寄存器中的文字("+yy),通过右健菜单中的paste粘贴出来。反之亦然。(这一招学到smth上acura的,在此表示感谢!)
********************************************************************************
件,然后在里面加入一行就可以打开所有的编码的文件了(暗爽):

setfileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
保存从新起动vim,打开文件ok了。说到这里我感觉vim里面还有一个显示行号和语法高亮是我常用的功能,每次在vim里面输入syntaxon太他吗的烦了,我这种懒人是不能容忍这种事情发生的,算了,往里面在写两行字符,让他打开的时候自动的开启吧:

setnu          #打开显示行号的功能
syntaxon          #打开语法高亮的功能
这样打开一个源代码文件感觉就比较爽了,效果太好了,不好,这么正规的软件代码也有bug,我改改,去除那个bugsection,我自己往里面写,输入代码,可是怎么不会自动缩进呀,这让我们这些人怎么能够忍受呀,好了,听说有个vim给写好的配置文件,是推荐的,拷贝了直接使用,估计就可以了,在终端输入命令一条吧。

cp /etc/vim/vimrc /usr/share/vim/vim63/vimrc_example.vim
好了,就这样从新打开 vim,一切 ok 了,如果能有鼠标控制,有 menu就更好了,我们继续添加,不就是网 .vimrc 里面加己行字吗,呵呵:

setmouse=a     #加入鼠标支持
set wildmenu
这样就差不多了,基本上可以满足一般人的需求了,可是我这种程序源的话可能在读源代码的时候会经常的在多个文件中间转换,如果每次都退出在用vim打开的话很麻烦的,怎么办,分屏打开多个文件,这个可以,使用:new命令就可以,可以分屏的,但是我的可是15的显示器,分分还有什么呀,还是想个其他的方法吧,能不能用一个简单的命令在不退出vim的情况下来回转换呀,答案是肯定的,伟大的vim什么做不到呀。还是在.vimrc里面加入几句话,不过这才麻烦点,呵呵

if has(”unix”)
 
   map ,e :e=expand(”%:p:h”) . “/”
else
    map ,e :e=expand(”%:p:h”) . “\”
endif
保 存重新打开 vim,然后用 vim打开一个源代码文件,在正常模式下输入,e就会有一个框出来,上面罗列了当前目录下的所有文件,你用 tab建来选择打开那个文件,太爽了。基本上 vim的东西就这些了,还有的就是一些汉化的了,我在 linuxfans.org下载了vim 的中文文档,解压安装了,使用的不错


vim设置自动格式化文本:

源码:--------------------------------------------------------------------------------
:set formatoptions=croamq
 :help formatoptions 看帮助;
  t 在文本宽度内,自动换行,对注释行无效;
  c对于注释,在文本宽度内自动换行,并自动插入注释前导;
  r在插入模式下,回车后自动插入当前注释前导;
  o在正常模式下,用o或O插入空行时,自动插入当前注释前导;
  q允许用"gq"格式化注释。但格式化不改变空行或只带注释前导的行。
  m对于255以上的多字节字符也进行断行。这对于每个字符就是一个字的亚洲文本特别
    有用。
  n 对于带. ) ] }的数字,如1.,1)等等,自动换行对齐;要求自动缩进选项ai打开。
    例如:1.test
            wraps.
         2. test2...
********************************************************************************
具体的可以help看帮助

讨论到的自动缩进是 autoindent
主要是 c 代码等
拷贝粘贴  就在已经缩进的基础上再缩进 很不美

于是就可以 set noautoindent 解决
或者设置 set paste

具体 vim 网站有 Tips
Tip #330: how to stop auto indenting
http://www.vim.org/tips/tip.php?tip_id=330
********************************************************************************
摘要:vim的一个有趣的用法

如果想在vim里面达到这个效果,在vimrc中加入一下两行:
au BufWinEnter *. exe 'set list listchars=tab:\|\ '
au BufWinEnter *. exe 'command Seetab :set list listchars=tab:\|\'

当你编程序时, 就会达到这个效果.源自:http://www.vim.org/tips/tip.php?tip_id=460

用法:
当你不想看到对齐线时 在vim的normal模式下 :set nolist
如果你想看到对齐线时 在vim的normal模式下 :Seetab
 
在我们谈起Vim编辑器似乎只是觉得他只是一个类似于一个命令行方式的文本编辑器。而事实上不是这样的。Vim在窗口环境中也可以完美的完成我们的工作。在窗口环境下,我们不仅可以使用那些在Vim文本方式下的命令来完成工作,而且还有许多的菜单和其他的选项。这些都使得我们可以完美的来完成我们的工作。
我 们要启动图形界面的Vim可以用下面的命令:gvimfile。这样就可以打开图形界面来编辑文本file。图形界面下的Vim编辑器的外观因你所用的操作系统的不同而有所不同,就是同样的操作系统也会因你所使用的工具集不同(Motif,Athena,GTK)而会呈现不同的外观。而值得向大家推荐的是GTK版本的Vim编辑器,当然其他版本的也是可以来完美的完成我们的工作的。
在Windows系统中我们可以在标准形式下用鼠标来选择文本,而在XWindow系统中我们也会有一个标准的系统来使用鼠标,但是这两种标准是不同的。然而比较幸运的是我们可以定制我们的Vim编辑器。我们可以使得我们的Vim中的鼠标的行为看起来像是XWindow系统中的鼠标的行为。下面的命令是设置鼠标的行为为XWindow风格的鼠标行为::behavexterm。而下面的命令则是使得鼠标的行为是Windows风格的行为::behavemswin。在UNIX和Linux系统中的鼠标风格是xterm风格,而在Windows中的鼠标风格是在安装过程中选择的。为了控制鼠标的行为,命令:behave有以下这些选项:
       Settingfor       Setting for
Option       :behavemswin       :behave xterm
'selectmode'   mouse,key       (empty)
'mousemodel'   popup           extend
'keymodel'   startsel,stopsel   (empty)
'selection'   exclusive       inclusive
xterm的鼠标风格的行为主要有以下一些:
左键:       移动光标
拉动左键:   在可视化模式下选择文本
右键:       选中光标处到右键点击处的文本
中键:       在光标处粘贴选中的文本
Windows的鼠标风格的行为主要有以下一些:
左键:       移动光标   
拉动左键:   在选择模式下选中文本
   选中到光标处的文本
   显示弹出菜单
中键:       将系统剪切板中的文本粘贴到文件
(注:其中的S为Shift键)
其他的一些特殊的用法:
Shift+左键:   向前搜索光标处的文本
Shift+右键:   向后搜索光标处的文本
Ctrl+左键:   跳转到以光标处的文本为名字的标记(tag)处
Ctrl+右键:   跳转到前一个标记处
在图形界面的Vim编辑器还有一个有趣的特征,那就是当我们点开一个菜单时就会发在子菜单的第一行有一条虚线,点击此虚线就可以将这个菜单移其他的地方。关闭后Vim的菜单结构又恢复到正常的状态了。在GTK版本和Windows版本中的图形界面的Vim还有一个工具栏,这些工具可以快速的完成我们的工作。

你可能感兴趣的:(GVIM)