分享

vim与gvim技巧]vim&gvim技巧大全(7)

 望穿墙 2015-06-25

转自:http://blog./uid-8494387-id-2030952.html

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

3. C-X (auto complete)
在insert模式下,C-X C-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 procedure procname()
  前加上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
    :help c_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-X CTRL-L补全了一行,但不是自己想要的,可以继续按CTRL-L查找,也可以按CTRL-P或CTRL-N继续查找。找到后如果再按CTRL-X CTRL-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 more information
: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,syntax off。
: 速度不错,关闭也是瞬间。
: ...................
'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/
暂时没弄明白前面为什么用\n,而后面用\r。


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


VI是VIsual editor的意思,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-8 locale下均正常。解决办法:在自己的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操作有关,具体请:help z


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


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


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

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

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

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

set mouse=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 tips 之五

 


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./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./tips/tip.php?tip_id=460

用法:
当你不想看到对齐线时 在vim的normal模式下 :set nolist
如果你想看到对齐线时 在vim的normal模式下 :Seetab
 
在我们谈起Vim编辑器似乎只是觉得他只是一个类似于一个命令行方式的文本编辑器。而事实上不是这样的。Vim在窗口环境中也可以完美的完成我们的工作。在窗口环境下,我们不仅可以使用那些在Vim文本方式下的命令来完成工作,而且还有许多的菜单和其他的选项。这些都使得我们可以完美的来完成我们的工作。
我们要启动图形界面的Vim可以用下面的命令:gvim file。这样就可以打开图形界面来编辑文本file。图形界面下的Vim编辑器的外观因你所用的操作系统的不同而有所不同,就是同样的操作系统也会因你所使用的工具集不同(Motif,Athena,GTK)而会呈现不同的外观。而值得向大家推荐的是GTK版本的Vim编辑器,当然其他版本的也是可以来完美的完成我们的工作的。
在Windows系统中我们可以在标准形式下用鼠标来选择文本,而在X Window系统中我们也会有一个标准的系统来使用鼠标,但是这两种标准是不同的。然而比较幸运的是我们可以定制我们的Vim编辑器。我们可以使得我们的Vim中的鼠标的行为看起来像是X Window系统中的鼠标的行为。下面的命令是设置鼠标的行为为X Window风格的鼠标行为::behave xterm。而下面的命令则是使得鼠标的行为是Windows风格的行为::behave mswin。在UNIX和Linux系统中的鼠标风格是xterm风格,而在Windows中的鼠标风格是在安装过程中选择的。为了控制鼠标的行为,命令:behave有以下这些选项:
        Setting for        Setting for
Option        :behave mswin        :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还有一个工具栏,这些工具可以快速的完成我们的工作。

 


vi编辑器的学习使用(一)
vi编辑器是Unix的世界中一个相当强大的可视化编辑器,有人曾这样的说过在世界上有三种人:一种是使用Vi的,另一种是使用是Emacs的,剩下的是第三种人。由此可以看出Vi和Emacs的强大。在有关Linux的论坛中关于Vi和Emacs的论争也是一直不断的。现在看来这样的论争也实在是没有办法的,这两个编辑器是同样的强大,同样有不同的人在支持。在个人看来就是同时喜欢这两个的。然而他的这种强大也是要会付出一定的代价,他的学习和使用也是相当的复杂的,在学习的起点常常会面临着一个巨大的学习困难。但是只要过了这样的一段时间你就可以来体会Vi的强大了。

一 Vi的启动与退出在现在的Linux世界中还有一个发行版本被称为是Vi的改进版本,所以被称为是Vim,也就是Vi Improved的意思。在现在的一般的Linux的发行版本中常常是Vim的。要启动Vi可以终端窗口输入vi或是vim,这样就可以终端窗口打开一个Vi的编辑窗口。或者是输入gvim,这样就可以打开一个类似于gedit这样的文本编辑器,他有一些菜单,但是大部分的功能仍是通过命令行的方式来完成的。在vi中有两种模式:一是命令模式,一是编辑模式。命令模式是用来输入命令行来完成工作的。而编辑模式是用来编辑文本的。在两种模式中切换可以通过Esc来完成。在我们完成了文本编辑以后可以这样的来退出:

:q 这是退出的命令,如果你已经做过了改动,那么就会提示错误。

:q! 这也是一个退出命令,与上一个不同的是,我已经做过了改动,但是我想放弃这些改动,从而用这样的命令。

:w 这是文件写入的命令,但是执行完这个命令后并没有退出vi.

:wq 这个命令的意思是保存并退出

二 Vi的基本编辑命令在启动了Vi以后是在命令模式的,这是可以输入i(insert)进入插入模式。这时会在Vi窗口的下端显示出你这时的状态。这时你就可以来输入文本了。在这样的情况下,你可以用Backspace来Delete来删除一个字符。用方向键来控制光标。其实在知道了这样的几个命令后就可以用来编辑文档了。但是这样的几个命令并不能保证你能高效的来完成你的工作。而事实上在命令模式下我们用键盘来移动光标而不用将手离开键盘去按方向键,这样就可以大大的增强你的编辑速度。

我们可以用h(left),j(down),k(up),l(right)这几个键来移动光标。我们可以将光标放在一个字符上同时按下x键来删除这个字符。

我们可以将光标放在某一行同时按下dd,这样就可以将这一行删除。

当然有的时候也许我们做了一些事情,不过我我们觉得以前的要更好一些,我们想要恢复到以前的状态,在这样的情况下我们可以u和U这两个命令。u要撤销上一次的修改,而U将是撤销所记录的所有的修改。

而有的时候我们觉得现在的工作要好一些,我们希望撤销刚才所做的撤销工作,也就是我们要重做这些工作,这时我们可以使用CTRL_R命令来达到我们的目的。

有时我们可以使用新增的命令,使用a和A来完成这样的工作。a在当前光标所在的字符后面进入插入状态,而A是在一行的末尾进入插入状态。使用这两个命令可以方便我们进行文本的插入操作。

在vi的编辑模式中,是将回车换行看作新的一行的开始。有时我们希望新插入一行,这时可以使用o和O这两个命令来完成。o是在文本的下面新增一行并进入插入模式,而O是在文本的上一行新增一行并进入插入模式。

有了这些命令,现在的我们就可以比较方便的来完成我们的文本编辑工作了。但是有时候得到在线的帮助对于我们来说显得更为重要,要得到vi的帮助,可以在命令的模式下输入:help,这样就可以得到vi的在线帮助了。要想退出帮助,可以输入退出命令,:q.

为得到更明确的帮助,我们可以明确的指明我们所需要知道的内容。例如我们想知道关于x一些更详细的内容我们可以输入:help x.我们要想得到其他的帮助,我们就可以这样来得到我们想要的帮助。

在vi中可以使用数字和命令组合的方式得到新的命令,例如3h,这样就可向左移动3个字符。同样可以使用数字和其他的移动键进行组合来达到快速移到的目的。也可以是数字和其他的命令组合形成新的命令,例如3x就可一次删除3个字符。为了我们更快速的掌握vi的使用,vi本身也提供了一个学习的教程,只要你能耐心的做下来,我想使用vi对你来说应不再是一件难事了。进入vi的学习教程,可以在终端输入vitutor.这样就可以进入vi的学习教程,为了得到更多的帮助信息,可以在vi的窗口内输入:help tutor.这样就会得到更多的关开Tutor的帮助信息的。


vi编辑器的学习使用(二)
vi学习笔记之二在上一节的学习中,我们只是学习一些使用vi进行文本编辑的基本的命令。有了这些的基本命令我们就可以完成一般的文本编辑任务。在这一节中我们要学习一些其他的一些编辑命令,这些命令将包括其他的一些光标移动命令,如何在一行中快速的查找我们想要的东西,其他的一些文本删除和更改的命令,键盘宏和特殊字符的输入。在vi的编辑中,我们可以有多种的光标移动命令:我们可以用w命令向前移动一个字符,用b命令向后移动一个字符。就像其他的vi命令一样,我们也可以用数字来做前缀从而组成新的命令,来快速的移动。例如4w就是向前移动4个单词,而5b则是向后移动5个单词。而我们在编辑的过程中又如何来快速的移到一行的开始或是结尾处呢?在vi中$和^可以来完成这样的工作。$可以使光标移到一行的结尾处,而^可以使光标移到一行的开始处。$命令可以和数字进行组合形成新的移动命令,而^也可以和数字进行组合,但是组合后组成的新的命令中数字却不起任何的作用。在我们的文本编辑中我们就会移动光标是我们经常要做的事情,但是我们很快就会发现查找我们要找的字符串也是我们经常要做的一件事。那么如何在文本编辑中快速的查找到我们想要的字符呢?在vi的编辑命令有几个这样的小命令可以帮助我们来完成这样的工作:f是向前搜索的命令。例如fx是向前搜索字母x.利用f向前搜索的命令我们也可以快速的移动到指定的位置。而F是向左搜索的命令,也就是向后搜索。例如Fx是向后搜索字母x。与f和F这两个命令相类似的是t和T这两个命令。t命令类似于f向前搜索命令,所不同的是t搜索到时并不是将光标停在目标字符上,而是停在目标字符的前一个字符上。和他相反的就是这个F命令。当然这几个命令都可以和数字组合来形成新的命令来完成我们的工作。在搜索的工作过过程我们可以使用ESC来退出搜索而开始我们新的工作。在我们的工作中常常要求我们移动到指定的行,那么我们如何来做到这一点呢?我们当然可以使用数字和方向键组合来完成。虽然这种方式不够快速,但是确实可以来实现。而在vi中提供了一个新的命令来完成,那就是G。例如3G可以使我们快速的移到第3行。而1G则可以使我们移到文章的最顶端,而G则是定位到文章的最后一行。那么在vi的编辑中我们又如何来知道我们在第几行呢?我们可以使用:set number来叫vi加上行号,这样我们就可以很容易的知道我们所在的行号了,取消行号的命令为:set nonumber。那么在没有行号的文章中我们又如何来知道我们所处在的位置呢?我们可以使用ctrl+G命令来知道。这个命令可以清楚到告诉我们总共有多少行,而当前我们又在多少行,以及所占的百分比等信息。在我们进行编辑的过程中我们可以使用CTRL-U和CTRF-D来进行上下的翻页。当然这样的功能也可以通过功能键来实现。在我们的文本编辑过程中另一件我们要常做的事情就是文本的删除了。我们可以使用dd来删除一行,我们还可以使用dw来删除一个字符。删除的命令操作d是一个相当灵活的命令,我们可以用他来进组合来完成工作。例如d3w则是一次删除3个字符,而3dw则是指一次删除一个字符,而这样的操作进行3次,即总的是也是删掉3个字符。而在d$则是删除从当前位置到本行结束的所有字符.也d命令相类似是的c命令,这是一个更改的命令,所不同的是他在删除一个字符的同时进入插入状态,这样我们就可以进行另外的文本操作了。另一个有兴趣的命令则是.命令。.命令可以使vi重复执行刚才执行的命令。在我们进行文本编辑的时候,有时要用到合并行的命令,也就是将几行合并为一行,这时我们可以使用J命令。这个命令可以将本行和下一行合并为一行。当然,就像大多数的Linux命令一样,我们可以使用数字来使几行合并为一行。例如3J就可以将当前行下的三行(包括当前行)合并为一行。那么我们又如何时来做替换文本的工作呢?我们可以使用r的命令。例如rx就可以当前光标下的字符替换为x。我们当然也是可以用数字来组合以形成新的命令来进行工作,例如5rd就是将当前光标以后的5个字符替换为d。有时我们要进行大小写的转换,这时我们就可以用~命令。这个命令可以实现在大小写的转换。在vi中一个比较有趣的东西便是键盘宏了,这个可以使我们实现多个命令的记录,有时这样可以高效的完成我们的工作。例如我们现在的文本是 stdio.h stdlib.h math.h 但是我们都知道在C语言的编辑中我们所需要的是 #include #include #include 如何来做到?如果你有足够的耐心可以一句一句的来加,但是在这里我们可以使用键盘宏来完成我们的工作,这样我们就可以体会到他的强大之处了。开始输入qa.其中的a是一个宏的名字,我们可以用任何我们喜欢的字母来代替,q是开始录制宏的命令标志。这样我们就可以开始我们的宏输入了: ^ 移到一行的开始 i#include < 在一行的开始插入#include < $ 移到一行的结束 a> 在结束处加入> j 移到下一行 q 结束宏的录制这样当我们要使用宏时就可以输入@a,这样就可以执行这个宏了。我们还可以在执行命令前加上数字来告诉vi执行几次。这样我们就可以快速的完成我们的一些工作了。在vi的编辑中我们还可以输入一些由平常的键盘不可以输入的字符,有关这样的信息我们可以输入:help digraphs得到更多的信息。 (注:在vi中我们通常所指的一行是以回车做为标志的,即只有输入回车才算是一行的结束,从而开始新的一行)
vi编辑器的学习使用(三)
vi学习使用笔记之三我们在使用vi进行编辑文本的时候常作的一件事就是要在所编辑的文本中进行查找。如何快速的查找到我们想要的东西呢?在vi中我们可以使用f,F和t,T来进行向前或是向后查找。除了这些命令,我们还可以使用其他的一些命令来快速高效的完成我们的工作。在vi的编辑操作中,我们可以使用/string命令来查找字符串string,打下回车后,光标就能跳到正确的地方。在这个命令中/后的字符是我们想要查打的字符,而回车键则表明了命令的结束。但是有时我们所想要查找的字符具有特殊的意义,例如.*[]^%?$~等等,那么我们又如何来查找这些具有特殊意义的字符呢?这时我们可以使用\放在所要查找的字符前,这样再使用/来查找就可以正确的查找了。有时我们在进行查找操作时想要查找的内容并不仅在一处,我们想要做的是在整个文章中进行查找。那么我们又如何来进行我们刚才的查找命令呢?我们可以这样的来做:/。这样我们就可以继续我们刚才的查找操作了。在这里回车是命令结束的标志。我们还可以使用n命令来继续刚才的查找命令。这两个命令都能达到同样的效果,但是显然用n可以有更少的键盘操作。偷懒嘛:)在vi中他还具有记录查找命令历史的作用,这样我们就不用输入刚才输入的查找命令了,而是只需要在他所记录的查找命令进行一下查找就可以了。例如你刚才做过的三次查找分别是:/one,/two,/three.而现在输入/,然后按方向键的上或是下我们就看到刚才查找的内容显示在vi的下面,这时只要打下回车我们就会找到我们要找的内容了。当然在vi中还在一些其他的查找选项,例如我们可选择高亮的显示查找的文本,命令为::set hlsearch,关闭高亮显示的命令为::set nohlsearch.如果也想同时关掉刚才高亮显示的结果,可以用这样的命令::nohlsearch。在我们进行查找的选项中,我们还可以有这样的命令::set incsearch。在我们打开这个选项以后,我们在进行查找时就会显示出不断匹配的过程。例如你想查找的内容是include,在打开这个选项后你可以输入/i,光标定位在i上,再继续输入n光标定位在in上,如此直到查打到我们所要求的。关闭这个选项的命令为::set noincsearch。一般来说我们在进行查找时总是在向前查找,那么又如何来向后查找呢?我们可以使用?命令。这个命令就是向后查找的命令。而还有一个命令N是逆向查找的命令,他可以实现立即反向查找。(注:在查找的时候我们还可以用一些其他的表达式来进行查找,例如/^string是在开头进行查找,而/string$是在一行的末尾进行查找。不过看书我的理解是这样的,不过总是试验不成。而/c.m则是查找所有第一个字母为c,而第三个字母为m的字串,由此可以实现一些查找的匹配
vi编辑器的学习使用(四)
vi学习使用笔记之四我想我们在接触了vi以前一定会用一些其他的编辑器,在那些的编辑器里复制,剪切和粘贴都是最平常的操作,而在vi中这些操作也是同样的存在的。在vi编辑器有一个注册的概念(concept of register),正是这个概念使我们可以时行多次的剪切和粘贴等的操作。在一般的编辑器中我们被限制只有一个剪切板可以用,而在vi中我们最多时可以有26个剪切板可以来使用,这样就会大大的提高我们的完成工作的效率。而在vi中更是有一个相当强大的功能那就是他可以同时处理多个文件。如此强大的功能我们又来如何的操作呢?在vi的编辑中我们可以使用d或是x来删除文本,但是经过这样的操作所删除掉的文本并没有被vi所丢弃,而是被保存起来。我们可以使用p命令来粘贴刚刚所删掉的内容。下面我们可以来试一下看一下他是如何工作的。我们可以在vi中随意的输入几行,然后我们移动到其中的一行,用dd命令来删掉其中的一行,这时我们就不会再在vi中看见他。如何叫他再回来?我们可以将光标移到任意的地方,然后用p命令,我们就会看到刚才被删除掉的内容又回来了。同样我们使用x命令来删除的东西也可以这样的粘贴回来。所不同的就是我们用dd来删除一行再用p命令时是在当前光标的下一行粘贴,而删除一个单词再用p命令来粘贴时是在当光标处粘贴。有了这样的命令有时我们就可以来处理我们输入错误的单词了。例如我们不小心将the输入成了teh,这时我们可以将光标移到e的位置,用x命令删掉,再用p命令粘贴回来,这时我们就会发现现在的输入正是我们想要的输入了。p命令可以在一个文件中使用几次,每一次都可以将刚删除的内容重新粘贴在我们所希望的地方。当然这个命令也可以使用数字做前缀来明确的指出所要执行的次数。在使用vi进行文本编辑的过程中我们还可以对某一行进行标记,做法为我们将光标移到某一行,用命令ma来进行标记。在这里m是标记的命令,a是我们对这一行所做的标记的名称,当然我们也可以使用其他的标记名称,必竟我们是有26个字母可以用的嘛:)。在做了这样的标记以后我们可以快速的移到被标记的地方,‘a就可以使我们快速的移到刚才我们所做标记的地方。这里’是单引号,这时我们就会移到被做标记那一行的行首。我们也可以使用`a来移到我们所做标记的地方,这里`是反引号,也就是数字键1左边的那一个,不要弄错了噢:),这时我们就会移到所做标记时光标所在的位置,可以说是更精确啊。这也是这两个命令的不同之处。在进行文本编辑时我们可以列出当前所做的所有的标记。命令为 ::marks。这时vi就会列出当前的所有的标记。当然如果我们将做了标记的那一行删除的话所做的标记也就不存了。我们用标记不仅可以快速的移到做了标记的行,而且还可以用标记来删除掉一行,例如我们在某一行用ma做了标记,然后我们移到这一行的底部,这样我们就可以用在d‘a来删掉这一行。可以说这也是标记命令提供给我们的方便吧。在vi中还有一个命令可以提供复制的操作,那就是y命令。yy命令可以复制一行,然后我们可以用p命令来粘贴。这时我们也可用标记命令来组合使用,我们可以在一行用ma标记此行,然后将光标移到这一行的底部,用y’a命令就可以来复制这一行了。然后到我们所希望的地方用p命令来粘贴。我们也可以使用Y命令来复制一行,或是用数字做前缀来明确的指明复制几行,然后用p命令粘贴到我们所希望的地方。在vi中还有一个比较有趣的命令便是!命令。这个命令告诉vi编辑器我们要来运行一个系统命令,这时vi就会将以后的输入做为一个命令来运行,运行的结果也就是输出将替代当前光标所在的行的内容。例如我们在 Linux中知道sort是一个排序的命令,他是将一个文件或是一些输入进行排序后输出到屏幕或是其他的文件。那么我们想对vi中的内容进行排序来如何做呢?这时我们可以将光标放在文本的开头的一行,输入!10G,这时vi就知道要到10行,也就是我们要操作的内容是第1行到第10行,这时在vi的下端就会显示出!,这时我们就可以输入命令了,sort。也就是我们要输入的完整的命令应为:!10Gsort。这样回车以后vi就会对文本中的10行进行操作,将操作的结果替换掉现在vi中的文本来显示。而!!是在一行运行命令,并且输入的结果为当前行的内容。例如我们输入!!ls,就会将ls的执行结果显示在vi中,并且是当前的内容,如果此行原先有内容将会被替换掉。如果我们完成一个文件的编辑而要开始一个新的编辑时我们最平常的做法就是退出当前的文件而重启vi开始一个新的编辑。事实我们可以直接在vi中输入:vi file而开始一个新文件的编辑。如果当前的文件你没有保存,vi会给出警告的信息,这时你可以输入:write来保存当前的文件。你也可以用:vi!file强制开始一个新文件的编辑。与vi相类似的一个命令是:view,所不同的是他以只读的方式打开一个文件,这时vi会给出警告信息,但是你也可以进行修改,只是你不能进行保存,如果你要保存,vi就会给出提示。当然在这样的情况下你可以用命令:write!来强制保存。我们还可以使用vi来编辑多个文件。我们可以在终端输入vi file1 file2 file3,这样我们就可以来编辑多个文件了,在默认的情况下vi来显示第一个文件,如果要切换到下一个文件我们可以输入:next,这样我们就可以切换到第二个文件了。如果你没有保存,vi会给出提示信息,这时也就不可能切换到第二个文件了。这时我们可以输入:write进行保存然后再切换到第二个文件,或者是我们输入:write:next.来保存后再切换到第二个文件。或者是我们可以用:wnext来简写这个命令。当然我们也可以用命令:next!来强制切换到第二个文件。当然这样你所做的改动也就会丢失掉。为了避免这样的情况,我们可以打开vi的自动保存功能。:set autowrite.这样我们就不会为没有保存而收到提示信息了。关闭自动保存的命令为::set noautowrite.当然next命令也可以用数字做前缀来指明所要执行的次数。如何来确定我们在编辑哪一个文件呢?我们可以用这样的命令来明确我们所编辑的文件::args.这个命令会显示出我们所打开的文件,同时会显示我们正在编辑的文件。如果我们想要回到上一个文件我们可以用这样的命令::previous或是:Next.如果你要保存当前的文件并切换到前一个文件可以用这样的命令::wprevious或是:wNext.如果我们要编辑第一个文件我们可以用:first或是:rewind来快速的切换到第一个文件,同理如果我们要编辑最后一个文件我们可以用:last来快速切换。如果我们在一个文件中进行一些改动,再切换到另一个文件中进编辑,这时我们就可以用CTRL_^来切换这两个文件。
vi编辑器的学习使用(五)
在使用vi进行文本编辑的时候我们也可以打开多个窗口进行编辑。这也正是vi编辑器的强大这处。那么我们如何来打开多个窗口进行文本编辑呢?我们又如何在多个文本窗口中进行切换呢?如何来控制窗口的大小呢?在vi编辑器还有一个缓冲区的概念,利用缓冲区我们可以进行多文本的编辑。打开一个窗口最简单的方法就是下面的命令::split。输入这样的命令后vi就会将当前的窗口平分为两个。并且在这两个窗口中显示的是同一篇文章。如果你在其中的一个窗口进行文编辑,那么另一个窗口也会同步的显示出你所做的工作。如何在两个窗口中进行切换呢?在gvim中要方便得多,只要用鼠标就可以进行窗口的切换。而在vim中则需要用命令来实现。CTRL_Ww这个命令可以实现在两个文本窗口中进行切换。切换窗口还有另外的命令:CTRL_Wj 可以将光标定位在下一个窗口中,而CTRL_Wk可以将光标定位在上一个窗口中。如果想关闭 一个窗口可以用命令ZZ或是:q.当然了CTRL_Wc也可以做到同样的事情。我们打开一个窗口一般并不是要在两个窗口中显示同一个文件,我们常常需要的是在两个窗口中显示两个文件来加快文件编辑的工作。如何在新窗口中打开一个文件来进行编辑呢?我们可以用这样的命令::split file.这样我们就可以在另一个窗口中打开文件file开始我们的编辑工作了:)。那么我们如何来控制窗口的大小呢?我们在输入split命令时可以带上一个参数,这个参数 也就指定了打开的窗口的大小。例如我们可以这样的输入::3 split file。这样我们就可 以在一个新窗口中打开文件file,而这个窗口的大小有三行。当然我们也可以将这个命令中的空格去掉,也就是写成::3split file这样也可以达到同样的作用。与split命令相类似的一个命令就是:new命令。所不同的就是split命令打开一个新窗口,但是在两个窗口中显示同一个文件,而new命令则是打开一个新窗口开始一个新文件的编辑.我们还可以打开一个新窗口,在这个窗口中打开一个文件来读。命令为:sview。这个命令是:split和:view这两个命令的组合。在这样的多文本窗口中进行操作时我们常做一个工作就是要改变窗口的大小。可以使我们来改变窗口大小的命令为: CTRL_W+这个命令增大窗口,默认增量为1 CTRL_W-这个命令减小窗口,默认值为1 CTRL_W=这个命令可以将几个窗口的大小变得相等。另外还有一个命令countCTRL_W_可以使得当前窗口变得count这样的高。如果没有指定count将会使得当前窗口变得尽可能的最大。 :buffers 这个命令就会列出当前的编辑中所有的缓冲区状态。在这个状态列表中,前面的数字就是缓冲区的数字标记,第二个标记就是缓冲区当前的状态,而后一个则表明与空上缓冲区所关联的文件名。他的一些状态是这样的: - 非活动的缓冲区(Inactive Buffer) h 隐藏的缓冲区(Buffer is hidden) % 当前的缓冲区(current buffer) # 交换缓冲区(Alternate buffer) + 文件已经被修改如果我们要选择一个缓冲区我们可以用这样的命令::buffer number number就是缓冲区状态列表中所显示出来的数字。我们也可以用文件名字来选择缓冲区: :buffer file 关于缓冲区有一些有用的命令可以快速的完成我们的工作:我们可以用下面的命令来分割当前的窗口开始编辑一个缓冲区::sbuffer number 如果我们指明了数字,那么当前窗口就会显示数字所标记的那缓冲区中的内容,而如果没有指明数字,那么就会利用当前的缓冲区。当然这个命令我们也可以用文件名来做为参数进行操作。对于缓冲区还有一些其他相关的命令: :bnext 到下一个缓冲区 :count bnext 到下一个缓冲区执行count次 :count sbnext 命令:split 和 :count bnext组合形成的命令 :count bprevious 到前一个缓冲区count次 :count sbprevious :count bNext 与:bprevious作用相同 :blast 到最后一个缓冲区 :brewind 到第一个缓冲区
vi编辑器的学习使用(六)
vi编辑器学习使用之六在现在的vi版本,或者是说是在vim中,与其先辈区分开来的一个特征就是现在的版本中有一个可视模式。这种可视模式可以使你加亮一个文本块然后整体进行命令操作。例如你可以用高亮显示出一个文本块,然后用d命令来删除这个文本块。这种可视模式与其他的编辑相比的一个好处就是你可以在做改动以前看到你的操作对于所编辑的文本产生的影响。那么我们如何为用这种有趣的可视化模式来进行我们的文本编辑工作呢?要进入可视化模式,我们可以输主命令v,这样在vi的状态行就会显示我们已经进行可视化模式了。在这样的模式下,我们移动光标,那么在光标起始的位置和光标现在的位置之间的文本都会以高亮显示的。这时我们可以对这些高亮显示的文本整体进行命令操作,例如这时我们可以输入d命令,那么这些高亮显示的文本就会被删除掉。一般来说可以化模式可以具体的分为三种可视化模式,一种就是我们刚才用v命令进入的所谓的字符式可视模式(character-by-character visual mode)。在这种模式下,我们在进行文本选择以高亮显示时是以字符为单位的,我们可以一个字符字符的来选择。而第二种就是所谓的行可视化模式(linewise visual mode),这时我们可以输入V命令来进入这种可视化模式。这时我们所进行的操作是在以行为单位来进行的。还有一个命令可以使我们进入可视化模式,这就是CTRL_v,这就是我们所要说到第三种可视化模式,他可以使一个矩形内的文本高亮显示,然后以这些文本为整体进行编辑操作。在可视模式下我们也可以得到一些相关的帮助信息。当然在输入命令时要在所希望帮助的名称前有v_做为前缀。例如我们想得到一些关于在可视模式下进行删除操作的命令,我们可以这样的来得到帮助信息::help v_d 当我们要退出可视化模式时,我们可以按ESC键退出。当然CTRL_c也可达到同样的作用。与ESC作用相同的还有CTRL_和CTRL_N. 在可视化模式下我们可以进行各种各样的编辑操作。如d命令可以删除那些高亮显示的文本内容,而D命令只是来删除一行,哪怕这一行中只有部分文本是高亮显示的。与d和D命令类似的是复制y和Y命令。y命令是将高亮显示的文本复制下来,而Y只是将一行文本复制下来。c命令可以将以高亮显示的文本删除掉然后进入编辑模式,而C命令的作用与其相类似,所不同的只是C命令只是删除一行文本。我们还可以利用可视化模式将几行文本合并为一行。J命令可以将高亮显示的文本内容合并为一行,同时以空格来区分各行,而如果我们不希望看到这些空格,我们可以使用gJ命令。我们在可视模式下进行文本编辑时也可以进行可视化模式的选择和切换。你可以在任何情况下进行这种切换,而切换的做法只是简单的输入那种可视化的命令操作。例如现在我们在字符模式的可视化模式下进行操作,而现在我们想切换到块模式的可视化模式,这时我们只是要简单的输入CTRL_v可以了。当然我们也可以先用ESC来关闭当前的可视化模式,然后再选择我们所希望的可视化模式. 对于程序员来说似乎这种可视化模式会有更大的用处,我们可以用一种可视化模式来高亮显示文本,然后用>命令来进行文本的缩进,我们还可以用<命令来进行相反的缩进。我们更可以用CTRL_]跳转到某一个函数定义的地方。我们还可以利用可视化模式的高亮文本进行做法关键字用man命令来得到更多的信息。当然这必须是man可以查找得到的内容对于可视化模式的文本编辑还有一个有趣的现象,这个主要的表现在CTRL_v所定义的文本块内。例如我们用这个命令来定义了一个文本块,然后输入Istring,这个命令中I是插入文本的命令,string是我们要插的文本,而Esc则是结束插入操作的命令。这时就会看到我们所输入的文本显示在文本块的左侧,也就是开头的地方,当我们结束插入操作时我们就会惊奇的发现我们所输入的文本也会同时出现我们所定义的文本块内所包含的其他行的开头部分。同样当我们用c命令来操作时我们也会发现类似的情况。当然了,在用c这个命令进行操作时你所输入的文本应不超过一行,否则的话将会只有第一行的文本会被改动。而C命令也会有相类似的情况。我们也可以类似的来得到一些关于块操作的命令帮助:例如::help v_b_r
vi编辑器的学习使用(七)
vi编辑器学习使用之七
vi是一个强大的编辑器,他不仅可以用来处理我们平时的文本工作,他还可以用写程序文件。在vi中有许多命令可以方便的完成我们的程序处理工作。在用vi进行程序处理时,vi充分的显示出来了他的强大之处,他可以实现在语法加亮显示,实现自动缩进,实现括号匹配,还可以在程序中实现查找和跳转。
我们可以用这样的命令在vi中打开语法加亮显示的功能::syntax on。这样以后我们在输入的字符中,vi就会自动的识别出关键字,字符串以及其他的一些语法元素,并以不同的颜色来显示出来。这对于程序员来说是一个巨大的帮助。当然你可以自定义语法加亮显示的颜色。
一般情况下,vi的这种语法加亮显示的功能可以工作的很好,但是有时我们也遇到一些小小的麻烦。也许我们都遇到过背景是白色而字体是浅黄色的情况,在这样的情况下是非常难读的。vi编辑器有两种语法加亮的办法,一种是当背景为浅色时用,而另一种是当背景为深色时用的。当我们启动vi时,他会检测我们所使用的端是哪一种背景颜色,是浅色还是深色,然后再应用语法加亮的颜色方案。当然了,有的时候vi也是可以检测出错的。我们可以用这样的命令来知道我们的背景的情况::set background?。这样vi就会在底端给出我们具体的显示。如果vi检测的并不正确,我们可以用这样的命令来为他赋下正确的值::set background=light或是:set background=dark.当然我们要清楚的知道,这样的操作要在打开语法加亮的命令之前来执行。vi实现语法加亮显示的功能是通文件的扩展名来文件的类型从而实现功能的。但是有时我们在编辑一个C程序文件时并没有使用传统的扩展名,那么我们如何来告诉vi我们正在编辑的文件的类型呢?解决的办法就是用filetype这个选项。例如我们要告诉vi我们正在编辑的是一个C程序文件我们可以这样的来做::set filetype=c。这样以后vi就会知道我们正在编辑的是一个C程序文件并正确的加亮语法显示。
除了语法加亮显示的功能以外,vi还提供了缩进的功能。命令<<将使当前行向左移动一个移位宽度,而命令>>将使当前向右移动一个移位宽度。这个所谓的是移位宽度具体是多少呢?在vi中默认的是八个空格的宽度。然而平时的经验可以表明当缩进是四个空格宽度时最有利于程序的阅读。那么我们如何将这个移动宽度定为四个空格的长度呢?这时我们就可以用下面的命令来做到::set shiftwidth=4.而这时的命令仅是对当前的一行有效,我们也可以像其他的vi命令一样的在命令前用数字做为前缀还指定命令作用的范围。如5<<就将缩进五行。
在vi中还有许多自动进行缩进的选项,一般有以下的几种:C缩进(cindent):这是C语言的缩进形式,采用这样的缩进方式的程序语言有:C,C++,Java等。当采用这种缩进格式时,vi就会自动的采用标准的C语言形式。还有一种形式是smartindent:在这种缩进模式中,每一行都和前一行有相同的缩进量,同时这种缩进形式能正确的识别出花括号,当遇到右花括号(}),则取消了缩进形式。另外的一种缩进形式便是所谓的自动缩进(autoindent):在这种缩进形式中,新增加的行和前一行有相同的缩进形式。vi编辑器可以很好的识别出C,C++,Java以及其他的一些结构化程序设计语言,并且能用C语言的缩进格式来很好的处理程序的缩进结构。我们可以用这样的命令来打开C语言形式的缩进结构::set cindent.这样以后vi编辑器就会用C语言的缩进形式来正确的处理程序文件。一般而言C缩进结构可以满中绝大多数人的需要,当然了不同的人有不同的编程风格,如果你不喜欢这样的缩进结构,你可以自己定义自己的缩进形式。也许我们做程序设计的人并不想每一次想要编辑C程序文件时都要用命令:set cindent来打开C缩进形式,为了解决这样的问题,我们可以改写vi的配置文件来使vi能够自动的完成这样的工作。我们在.vimrc(UNIX/LINUX)或是_vimrc(WINDOWS)中加入下面的几句:
:filetype on
:autocmd FileType c,cpp:set cindent
第一行是打开vi文件类型识别功能,第二行是如果所识别的文件类型为C或是C++文件那么便打C缩进形式。
在vi中除了C缩进形式以外我们还有smartindent缩进形式可以来用。在smartindent这种缩进模式中能够正确的识别出{和}。同时增加了识C语言关键字的功能。如果一行是以#开头的,那么这种格式将会被特殊对待而不采用缩进格式。这种缩进格式不如cindent,但是却强于autoindent。另外的一种缩进形式便函是autoindent。在其他的一些结构化程序设计语言如Pascal,Per或是Python语言中,我们所希望的是新的一行能和上一行有相同的缩进形式,这时我们便可以打开autoindent缩进形式,:set autoindent。这样就可以很好的来满足我们的要求了。
vi不仅有这些功能,而且还有更多的功能来快速的处理程序文件。其中一个便是可以快速的在文件中定位变量及宏定义等。其中一些常用到的命令有:
[CTRL_I/]CTRL_I    在本文件中以及在由#include命令包含进来的文件中进行查找光标下面的文字
gd/gD    查找变量的定义
[CTRL_D/]CTRL_D    跳到宏定义的地方
[d/]d/[D/]D    显示宏定义

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多