[vim与gvim技巧]vim&gvim技巧大全(5)

 

Here's something very curious:

:%s/foo/bar/gc
is of course a substitution effective for the entire file
with confirm on each occurrence of "foo"
with the option of quitting at any point.

However, using something similar,

:g/foo/s//bar/gc
using the global g to effect the entire file --
does NOT allow quitting at any point
(even with the use of <ESC>).

If there are hundreds of "foo" -- it's an important fine point...

Invite further comments...
Arun Easi, April 23, 2002 23:33
g/foo/s//bar/gc => run the command s//bar/gc for each of the line
matching foo. It is like running multiple "s//" commands (Hence
you have to press q for each of the invocation). The
g in "s///gc" does not imply entire file, it just implies all occurence
on a line (or else, it would have substituted only the first)
dyang@entropia.com, May 30, 2002 9:04
Here is one that deletes every other line (adjusting double spaced files):

:g/.*/norm jdd

pagaltzis()gmx_de, August 6, 2002 15:12
This can be done much simpler:

:%norm jdd
mra@frogne.dk, February 10, 2003 4:49
Another cool g feature is to count the number of lines matching /regexp/

let x=0 | g/regexp/let x=x+1
echo x

Great, if you are editing data files.

Regards
Mike
setanta5@excite.com, March 27, 2003 2:14
Reverse all the lines in a file:

:g/^/m0

I have found that useful . . . honest!

PK

kkgahlot@yahoo.com, September 3, 2003 5:06
Can I do something like this using ":g" (or anything else)

I have a file which contains following kind of lines

abc123=1,2,3
bcd123=100,200,300
abcb123=1,3,4

I want to convert this to following

abc123=1,abc,2,abc,3,abc
bcd123=100,bcd,200,bcd,300,bcd
abcb123=1,abcb,3,abcb,4,abcb

Basically I want to replace each comma in a line with first few letters, which are coming before 123, of that line surrounded by 2 commas.
Anonymous, September 3, 2003 12:45
To answer  kkgahlot's question:

global // execute "s///([=,][^,]*//)///1, " . matchstr (getline ("."), "^.//{-}//(123//)//@=") . "/g"

To make the whole thing a little more transparent some explanations (from the inside out):

We want to execute on each line a command like

s//([=,][^,]*/)//1, abc/g

for each line, but abc gets changed on each line.

The function

matchstr (getline ("."), "^.//{-}//(123//)//@=")

returns the string that matches the pattern /^./{-}/(123)/@=/ on the current line. In the given examples this is the text preceding 123= at the beginning of the line. Depending on the actual requierements, a simpler expression like /^[a-z]*/ could work too.

The command

execute "s///([=,][^,]*//)///1, " . matchstr (getline ("."), "^.//{-}//(123//)//@=") . "/g"

assembles the desired substitute command for the current line by joining some static text with the return value of the matchstr function and then executes it.

As execute works only on the current line, the command

global // execute ...

applies it to all line. If only certain lines should be proecessed replace // with some other pattern.

utzb@gmx.de, November 21, 2003 10:39
Reverting lines in a file can also be done via
:%!tac

instead of tac, you can also use sort, xxd, xxd -r, cut, your-own-filter
Anonymous, March 29, 2004 7:18
too bad :g does not have a /c parameter for confirmed execution of ex commands. Something like the /c used in :<range>s/<PAT>/<REPL>/c for replacing only confirmed pattern locations.

or does it ??
jdimpson@yahoo.com, April 14, 2004 10:06
I just want to add that the :g command in vi/ed is the basis for the name for the Unix grep command, i.e. Global Regular Expression Print.  The "Print" part described the default behaviour of :g when no command was given.  Obviously this behaviour was more useful when using ed.
bsjawle@hotmail.com, August 16, 2004 23:55
Thank you for the tip
发信人: smartiger (天才虎), 信区: Linux
标  题: 解释一下vi的一个高级用法
发信站: BBS 水木清华站 (Tue Jan 14 12:14:54 2003), 转信

:v/./$s/$/<ctrl-v><enter>./|'';/./-1j|$d
         Replaces multiple blank lines with just one blank line.

请问如何解释,特别是|和;

--

                  RedHat   8.0         Slackware  8.0
                  Mandrake 9.0         Debian     2.2r6
                  Xteam    4.0         RedFlag    3.0

                            SmarTiger

※ 来源:·BBS 水木清华站 smth.edu.cn·[FROM: 210.138.200.6]
发信人: sk8er (TRUE SK8ER), 信区: Linux
标  题: Re: 解释一下vi的一个高级用法
发信站: BBS 水木清华站 (Tue Jan 14 16:32:33 2003), 转信

我试了一下,这个好像不像你所说的那样工作。
:v/./$ 把整个文档都选中了,然后用 s 替换……怎么搞的……看不懂。

还不如用

:%s//(/n/s*/)/{2,}//r/r/g

来删除多余的空行。

【 在 smartiger (天才虎) 的大作中提到: 】
:          Replaces multiple blank lines with just one blank line.
: 请问如何解释,特别是|和;

--
People will buy anything that's one to a customer.

※ 修改:·sk8er 于 Jan 14 16:33:55 修改本文·[FROM:  166.111.140.66]
※ 来源:·BBS 水木清华站 smth.edu.cn·[FROM: 166.111.140.66]
发信人: yeshao (叶少·HP加满了!), 信区: Linux
标  题: Re: 解释一下vi的一个高级用法
发信站: BBS 水木清华站 (Tue Jan 14 16:34:07 2003), 转信

 :g/^[[:blank:]]*$/d
【 在 sk8er (TRUE SK8ER) 的大作中提到: 】
: 我试了一下,这个好像不像你所说的那样工作。
: 还不如用
: 来删除多余的空行。

--

痛苦和骄傲,这一生都要拥有

※ 来源:·BBS 水木清华站 smth.edu.cn·[FROM: 202.112.55.84]
发信人: sk8er (TRUE SK8ER), 信区: Linux
标  题: Re: 解释一下vi的一个高级用法
发信站: BBS 水木清华站 (Tue Jan 14 16:36:10 2003), 转信

你把空行全删掉了
他还想为多个留一个空行

【 在 yeshao (叶少·HP加满了!) 的大作中提到: 】
:  :g/^[[:blank:]]*$/d

--
New York now leads the world's great cities in the number of people around
whom you shouldn't make a sudden move.
                -- David Letterman

※ 来源:·BBS 水木清华站 smth.edu.cn·[FROM: 166.111.140.66]
发信人: scaner (沉默), 信区: Linux
标  题: Re: 解释一下vi的一个高级用法
发信站: BBS 水木清华站 (Thu Jan 23 16:29:02 2003), 转信

:v/./$s/$/<ctrl-v><enter>./|'';/./-1j|$d

|是两个命令风格符号

:v/./$s/$/<ctrl-v>enter./
'';/./-1j
$d
??
记得大概是这样.
我也看不动.
自己看help把.
大概意思是吧
所有的空行,变成
<enter>.
变成
<blank line>
........ --> n line -> ndot
然后
d掉最后一行
v那个是区域选择命令

具体的我也不清楚了.

【 在 smartiger (天才虎) 的大作中提到: 】
:          Replaces multiple blank lines with just one blank line.
: 请问如何解释,特别是|和;

--
沉默是痛苦的女儿

※ 来源:·BBS 水木清华站 smth.edu.cn·[FROM: 166.111.168.15]
发信人: allanj (木瓜), 信区: Linux
标  题: Re: 解释一下vi的一个高级用法
发信站: BBS 水木清华站 (Thu Jan 23 18:26:01 2003), 转信

好像在那里见过

你在最后一行加个 .  然后执行下面的命令
    :v/./ ; /./-1j
那个 . 就是为了防止原来最后一行为空,
    不能再匹配 /./ 了

大意:
        /./ 是非空行
        v 是 g! 的简写, 而 g! 就是取 g 的反

    所以 v/./ 就是标记出所有空行

    然后对标记出的每一行  操作
        ; 连接 2 个行号
        /./-1 就是从标记那个行号开始找非空行,
                  然后 (行号 - 1)
        j 就是 连接 2 行
    所以 () ; () j 就是把连续的几个空行 join
    (如果标记的行不存在, g 方式就继续下一个存在的,
     所以连接也不会出问题)

原来的:
    v/./$s/$/^M./|'';/./-1j|$d
在 vim 下没试成, 设了 compatible 也没效果.
他是不是也想在最后加个 . 然后连接, 再去掉?

大致这样分
v/./
    $s/$/^M./   |
    '';/./-1j   |
    $d

v/./        对所有的空行执行后面 3 个命令
    $s/$/^M./   对第 $ 行, 执行后面的替换
    '';/./-1j   从 '' 行开始, 到第一个非空行, 执行 j 命令
    $d          删除第 $ 行

【 在 smartiger (天才虎) 的大作中提到: 】
:          Replaces multiple blank lines with just one blank line.
: 请问如何解释,特别是|和;
--
※ 修改:·allanj 于 Jan 23 18:26:56 修改本文·[FROM:  166.111.215.54]
※ 修改:·allanj 于 Jan 23 18:27:26 修改本文·[FROM:  166.111.215.54]
※ 来源:·BBS 水木清华站 smth.edu.cn·[FROM: 166.111.215.54]
发信人: sk8 (destroying Tsinghua), 信区: Linux
标  题: Re: 解释一下vi的一个高级用法
发信站: BBS 水木清华站 (Thu Jan 23 19:50:40 2003), 转信

不就是合并空行吗?何必搞得这么复杂

这不是解决这个问题的好办法


:%s//(/n/s*/)/{2,}//r/r/g
不就行了

【 在 allanj (木瓜) 的大作中提到: 】
: 好像在那里见过
: 你在最后一行加个 .  然后执行下面的命令
:     :v/./ ; /./-1j
: 那个 . 就是为了防止原来最后一行为空,
:     不能再匹配 /./ 了
: 大意:
:         /./ 是非空行
:         v 是 g! 的简写, 而 g! 就是取 g 的反
:     所以 v/./ 就是标记出所有空行
:     然后对标记出的每一行  操作
:         ; 连接 2 个行号
: ...................
--
※ 修改:·sk8 于 Jan 23 19:56:07 修改本文·[FROM:  218.88.205.178]
※ 来源:·BBS 水木清华站 smth.edu.cn·[FROM: 218.88.205.178]
vim使用技巧(1)
本文参考了vim官方网站的文档http://www.vim.org/tips/index.php。为了查找方便起见,文中的技巧编号沿用原文档中的编号。

1. 使用 * 键可以向后搜索光标所在位置的单词。反之,使用 # 键可以向前搜索光标所在位置的单词。第一次使用 * 或者 # 进行搜索之后,则可以使用 N 或 Shift-N 继续进行搜索。另外,如果设置了hlsearch选项(:set hlsearch)的话,那么使用 * Shift-N 则可以标记当前的单词为高亮显示。

2. 经常会遇到这样的情况,就是在命令行上输入含有一个长长的路径的命令 vi /home/username/linux/src/dir1/dir2/dir3/srcfile.c,编辑结束之后发现需要编辑同一目录下的另一个文 件,这时不得不在vi中重新输入长长的路径。而将下面的脚本放在vimrc文件(Unix下为~/.vimrc,Windows下为_vimrc)中即可 快速输入路径:

"   Edit another file in the same directory as the current file
"   uses expression to extract path from current file's path
"  (thanks Douglas Potts)
if has("unix")
    map ,e :e [C-R]=expand("%:p:h") . "/" [CR]
else
    map ,e :e [C-R]=expand("%:p:h") . "/" [CR]
endif

这样编辑完第一个文件之后,在vi中输入 ,e ,然后就可以利用Tab键进行自动补齐了。注意上面代码中的[]符号,实际输入的时候需要换成小于号和大于号(由于blog自身原因,小于号和大于号不能直接输入)

4. 单词自动补齐:输入一个单词(例如函数、变量名等)的开头几个字母,然后按Ctrl-N或者Ctrl+P键,vim会在当前文档中查找匹配的单词并自动将输入补齐。

6. 使用 % 键可以查找匹配的括号。

7. 使用 [{ 和 ]} 命令可以跳转到光标所在程序块的开头和结尾。

8. 如果当前光标处的单词是一个局部变量,则使用 gd 来跳转到该变量的定义处;如果当前光标处的单词是全局变量,则使用 gD 来跳转到该变量的定义处。

9. [i 命令可以快速察看光标所在位置的变量的定义,[d 命令可以快速察看光标所在位置的宏的定义。

10. 流行的文本编辑器通常都有前进和后退功能,可以在文件中曾经浏览过的位置之间来回移动。在 vim 中使用 Ctrl-O 执行后退,使用 Ctrl-I 执行前进。
相关帮助:  :help CTRL-O  :help CTRL-I   :help jump-motions

12. 如果想在源程序中不使用TAB键并保证缩进为四字符,那么在 vimrc 中加入下列设置:

        set tabstop=4
        set shiftwidth=4
        set expandtab

13. 使用 set incsearch 之后可以在键入搜索关键字时即时显示匹配的位置。

14. 使用 set hlsearch 可以将匹配进行高亮显示。进行一次搜索之后,执行 :nohlsearch 或 :noh 可以暂时关闭本次搜索结果的高亮显示。而使用 :set nohlsearch 则可以永久关闭搜索高亮显示。
可以将:noh命令映射到一个键上,例如:nmap <silent> <C-N> :silent noh<CR>,这样就可以使用Ctrl-N来关闭高亮显示。

posted on 2004年10月05日 5:19 PM
1. 已经在编辑状态(insert mode)了,如何快速执行 normal mode 的命令?
在编辑文本时,需要快速定位到某个位置,如下一个 d 的位置,难道要
<ESC>、fd、i 这般繁琐吗?
其实,使用 Ctrl-O 就可以临时切换到 normal mode, 执行一个命令后自动返回 insert mode。
于是上述命令序列可以改为:
Ctrl-O、fd 即可。
Ctrl-O 要按两个键呢,很麻烦,于是来个 keymap
" make ` functions <C-O> in insert mode
inoremap ` <C-O>
nnoremap ` i`<ESC>

在 normal mode 下按 ` (左上角那个),会正常插入 `,
而在 insert mode 下则相当于按 Ctrl-O,
于是上述命令序列又可简化为
`fd 即可。
在 insert mode 想粘贴剪贴板内容时,可以输入 `P,爽吧?
这样就可以在 insert mode 下天马行空,不用再按 <ESC>和a 切来切去了。

2. vim 的剪贴板怎么怪怪的?
用 y 命令拷贝的文本怎么不能在 X/Windows 的其它应用中使用呢?
事实上,vim 有多个所谓寄存器来寄存剪切的内容。
平时是不是只用 y <motion> 和 p 命令呢?
其实这时使用的是 unamed 寄存器(对应寄存器*,不知对否?),即没有给定名称的,
而给定名称的,可以加前缀 "r 使用。
例如,将当前行放到寄存器a中,输入: "aY
将另一行(先移到其它行)放到寄存器b中,输入: "bY
粘贴寄存器a,输入:"aP
粘贴寄存器b,输入:"bP

好了,扯远了,X/Windows 的剪贴板的内容是存在寄存器+中,不信,自己试试:"+P
能不能将简单的 y 和 p命令与系统剪贴板联系起来呢?
就这句,浪费了我许多口水:)
set clipboard+=unnamed " set clipboard

3. 我不要每次都输入 this_object.set_...
呵,在 C 的结构或 C++ 的对象设置时,那个结构名或对象名总是重复 n 次要输入,挺烦的:(
添加这两句到配置文件中吧:
" Ctrl-F to yank line upstairs
inoremap <silent> <C-F> <C-O>:exe "norm! kly0jPD"<CR>

这是在编辑模式中使用的,怎么个用法?举个例子吧(括号内是我的注释):

(在编辑模式下,先输入这句:)
     this_object.set_height(1.80);
(                    ^)
(                    |)
(用<tab>啊,空格啊移到箭头所示处,即h处,然后按Ctrl-F)
(自动补全成:)
     this_object.set_
(于是你可以继续输入"weight(100);" 了)

不知大家明白没有,不明白的先试试:)

4. 我想注释一堆 C++ 代码
当然,这有许多种我不知道的方法,我的通用方法为,先在配置文件里添加:
vnoremap . :normal .<CR>

呵,一句就够了,示例如下:

假设你有如下几行代码需要注释:
this_object.set_height(1.60);
this_object.set_weight(100);
this_object.run();

你先移到第一行,输入 I//<ESC> (<ESC>就是ESC键),将第一行注释。
然后移到第二行,按 V 进行 line visual mode,按 j 或其它方向移动键选好要注释的所有代码行,
最后按: .
是不是很神奇?

呵,说白了,这只是在 visual mode 里使用 redo 的功能而已,有点跑题了。
当然,殊途是同归的,只是路的长远而已。
这是条通用的路,可以用在很多地方。
回到主题,谁有更直接的办法注释一堆 C++ 代码?一堆 C 代码呢(用/* */ 风格) ?

5. vi 的自动完成有什么新奇的东东?
不就是根据 buffer 的内容来自动完成吗?
有些插件是可以动态地读取头文件或模块来提供自动完成的,例如 python 的 pydict。(此列表待补全:)
我想介绍的是 vi 基于字典的自动完成:
1. 增加基于字典的自动完成
set complete+=k "add dictionary complete
2. 设定字典文件,字典文件其实是个文件文件,每个单词占一行
(以下字典文件可能并不存在)
set dictionary=/usr/share/dict/words "set dictionary
3. 呵,因此我是不用什么英文字典来自动完成的,很少写英文文章,使用字典后反应很慢。
我用基于字典完成的原因是,使用编辑语言的关键字自动完成,见:
" complete from filetype syntax file
autocmd Syntax * execute "setlocal dictionary=".$VIMRUNTIME."/syntax/".getbufvar("%","current_syntax").".vim"
对应的语言语法文件必须存在才可使用,于是写新的 C 文件时,可以直接 inc<Ctrl>-N, cont<Ctrl>-N

(请大家不吝赐教,to be continued)
编辑者: zslevin (10/16/04 10:53)

vi编辑技巧

    游标的移动
    本节所述皆是在 common-mode(c-mode,在 vim 又名 normal-mode)下的移动,原始的 vi 只能在 c-mode 移动,在 insert-mode 只做文字的输入,而不做游标的移动。当然 vim 及 elvis 的方向键是不论在那一种 mode 皆可移动自如。

基本的游标移动

    h 左,或 Backspace 或方向键
    j 下,或 Enter 或 +(要 Shift 键),或方向键

k 上,或 方向键或 -(不必 Shift 键)
    l 右,或 Space 或方向键
    Ctrl-f 即 PageDown 翻页。
    Crtl-b 即 PageUp 翻页。

使用 hjkl 键的移动是为了使手不必离开打字区(键盘中央的部位),
    以加快打字的速度,如果各位不习惯,那就使用方向键吧!

Backspace 及 Space 的移动方式是到了行首或行尾时会折行,
    但方向键或 hl 键的移动则在行首或行尾时您继续按也不会折行。
    转折换行的功能是 vim 的扩充功能,elvis 无此功能。

jk 及使用方向键的上下移动游标会尽量保持在同一栏位。
    使用 Enter,+,- 的上下移动,游标会移至上(下)一行的
    第一个非空白字元处。

好像有点复杂,各位就暂时使用方向键来移动就简单明白了!
    等您爱上了 vim 后再来讲究吧。

进阶的游标移动

    0 是数目字 0 而不是英文字母 o。或是 Hmoe 键,移至行首,(含空白字元)。
    ^ 移至第一个非空白字元,注意,要 Shift 键。
    $ 移至行尾,或 End 键。要 Shift 键。

以上两个按键是源自规则表示式(regular expression),
    在 regexp 中 ^ 是匹配行首,$ 是匹配行尾。

G 移至档尾(最后一行的第一个非空白字元处)
    gg □至档首(第一行之第一个非空白字元处)

gg 是 vim 的扩充功能,在 elvis 或原始 vi 中可用 1G 来
    移至档首(是数字 1 不是英文字 l)。

G 之原意是 goto,指移至指定数目之行首,如不指定数目,
    则预设是最后一行。

w 移至次一个字(word)字首。当然是指英文单字。
    W 同上,但会忽略一些标点符号。
    e 移至前一个字字尾。
    E 同上,但会忽略一些标点符号。
    b 移至前一个字字首。
    B 同上,但会忽略一些标点符号。
    H 移至萤幕顶第一个非空白字元。
    M 移至萤幕中间第一个非空白字元。
    L 移至萤幕底第一个非空白字元。

这和 PageDown,PageUp 不一样,内文内容并未动,
    只是游标在动而已。

n| 移至第 n 个字元(栏)处。注意,要用 Shift 键。n 是从头起算的。
    :n 移至第 n 行行首。或 nG。
    特殊的移动

    ) 移至下一个句子(sentence)首。
    ( 移至上一个句子(sentence)首。
    } 移至下一个段落(paragraph)首。
    { 移至上一个段落(paragraph)首。

sentence 是以 . ! ? 为区格。paragraph 是以空白行为区格。

% 这是匹配 {},[],() 用的,例如您的游标现在在 { 上只要按 %,就会跑到相匹配的 } 上。写程式时满好用的。
    另还有一些 vim 的特殊按键,但这得留待最后才来讲述,否则各位恐怕会头昏眼花了。

    基本编辑指令
    这个单元就开始进入主题了。下编辑指令都是在 commond-mode (c-mode),就是您一进入 vim 时的模式,只能下指令,不能键入文字。如果印象模糊,请瞄一下第一个单元的内容。这个单元说的是基本的指令,有些比较特殊的编辑指令,因为太有个性了,所 以会独立成一个单元来说明。

进入 i-mode 的指令

    i 在游标所在字元前开始输入文字(insert)。
    a 在游标所在字元后开始输入文字(append)。
    o 在游标所在行下开一新行来输入文字(open)。
    I 在行首开始输入文字。
     此之行首指第一个非空白字元处,要从真正的第一个字元处开始输人文字,
    可使用 0i 或 gI(vim)。

A 在行尾开始输入文字。
     这个好用,您不必管游标在此行的什么地方,
    只要按 A 就会在行尾等著您输入文字。

O 在游标所在行上开一新行来输入文字。
    J 将下一行整行接至本行(Joint)。
     并无相对的 split 功能,可在 i-mode 下按 Enter 来达成

,当然如果您熟 macro 的话,可自行定义。
     使用 J 时,预设会消去本行的 EOL,且上下行接缝间会留下一个空白字元,
    这符合英文习惯,却对中文会造成困扰,欲不留空白字元,
    可使用 gJ(大写 J)指令,但这是 vim 的扩充功能,elvis 不适用。

请您随便找一个档案来试看看,光看文字说明太抽象了。

删除指令

    x 删除游标所在处之字元。在 vim 及 elvis 亦可用 Del 键。
    X 删除游标前之字元。不可使用 Spaceback 键。
     vim 可以正确使用以上两个指令于中文,会删去一个中文字 elvis 则不行,
    一个中文字要删两次,即使用 xx。

 dd 删除一整行(delete line)。
    dw 删除一个字(delete word)。不能适用于中文。
    dG 删至档尾。
    d1G 删至档首。或 dgg(只能用于 vim)。
    D 删至行尾,或 d$(含游标所在处字元)。
    d0 删至行首,或 d^(不含游标所在处字元)。
     请回忆一下 $ 及 ^ 所代表的意义,您就可以理解 d$ 及 d^ 的动作,
    这就是 vi(m) 可爱之处。

取代及还原

    r 取代游标所在处之字元。vi(m) 很有个性的,您在 c-mode 按了 r 她就会停在那里等主人键入所要替代的字元,希望您这个当主人的,不要傻呼呼的也楞在那里,赶快键入您的新字元吧!:-)
     vim 中可用于中文字,也就是可以替换一个中文字,elvis 则不行。
    当然您的 vim 是要设在 taiwan 的才行。怎么样!有没有看过如此
    有个性的取代方式?ㄚ!r 就是 replace 啦!

R 取代字元至按 Esc 为止。
    cc 取代整行内容。或大写 S 亦可。
    cw 替换一个英文字(word),中文不适用。(change)
    ~ 游标所在处之大小写互换。当然不能用于中文。别忘了 Shift!
    C 取代至行尾,即游标所在处以后的字都会被替换。或 c$。
    c0 取代至行首,或 c^。
    s 替换一个字元为您所输入的字串。和 R 不同,R 是覆盖式的取代,s 则是插入式的取代,您可亲自实验看看。ㄟ!是小写的 s。
    u 这个太重要了,就是 undo,传统的 vi 仅支援一次 undo,vim 及 elvis 就不只了,vim 是没有限制的。
    U 在游标没离开本行之前,回复所有编辑动作。
    Crtl+r 这个也是很重要,就是 redo 键。
    加上数目字
    喔!骚到 vi(m) 的痒处了,这是 vi(m) 一个非常骚包的功能,只此一家别无分号(当然同源的 ed,sed 等不在此限)。就是您可以在大部份的指令前加上数目字,代表要处理几次的意思。以下用实例来说明比较清楚。

5dd 删除游标所在处(含)起算以下五行内容。妙吧!
    3r 按了 3r 后,您键入一个英文字,则三个字元皆会被您所键入的英文取代。很抱歉,这不能用于中文。
    5J 将五行合并成一行。
    3x 删除三个字元。抱歉,不能用于中文。
    5i A 然后按 Ecs,插入五个 A。中文也可以!
    2i system Esc 插入 systemsystem。中文也可以!
    5G 游标移至第五行,是从档首开始起算。
    5l 移至右第五个字元处,当然 j 是可以用方向键取代的。所有移动指令(参考第二单元)都可以加上数目字来控制,中文也通喔!elvis 当然是不能用于中文。
    其它的指令和数目字结合,就留待各位去发掘吧!最重要的是请您亲自操作看看,使用 vi(m) 常常要动动脑筋,会有更妙的操作方式。
    简单重排功能

    >> 整行向右移一个 shiftwidth(预设是 8 个字元,可重设)。
    << 整行向左移一个 shiftwidth(预设是 8 个字元,可重设)。
     :set shiftwidth? 可得知目前的设定值。:set shiftwidth=4
    可马上重设为 4 个字元。shiftwidth 可简写成 sw。ㄟ,别忘了 Shift 键!

:ce(nter) 本行文字置中。注意是冒号命令!
    :ri(ght) 本行文字靠右。
    :le(ft) 本行文字靠左。
     所谓置中、靠左右,是参考 textwidth(tw) 的设定。
    如果 tw 没有设定,预设是 80,就是以 80 个字元为总宽度为标准来置放。
    当然您也可以如 sw 一样马上重设。

gqip 整段重排。中文会出槌!:-(
    gqq 本行重排。
     重排的依据也是 textwidth。这里的重排是指您键入文字时没有按 Enter 键,
    就一直在 keyin,这样会形成一个很长的一行(虽然萤幕上会替您做假性折行),
    重排后,则会在每一行最后加入 EOL。gq 重排功能是 vim 才有的功能。

    复制(yank)
    yank 是什么意思?有疑问的请查一下字典吧!就好像是中医治疗中的「拔罐」的意思啦(是不是叫「拔罐」?知道的朋友指正一下吧)!反正在 vi(m) 中,她就是复制 copy 的意思。这在 vi(m) 的思考逻辑里,就是「拔」yank 起来,「放」put 上去。其实复制的指令就是 y 一个而已,为什么要独立成一个单元来说明呢?因为 vi(m) 复制、贴上的功能实在太独特了,再配合前面介绍的数目字,及 vi(m) 内部的缓冲区来使用的话,您会发现,原来 vi(m) 肚子里还暗藏著秘密武器。

指令说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值