Linux 环境下的编译器
在 Linux 环境下有很多编译器,例如基于行的编译器 ed 和 ex ,基于文本的编译器 Vim、Emacs 等。使用文本编译器可以帮助用户翻页、移动光标、查找字符、替换字符、删除等操作。
一、Vim 使用简介
Vi 是 visual editor(可视化编辑器) 的简写,发音为 [vi’ai] ,是 UNIX 系统下最通用的文本编辑器,支持多种主流编辑语言。
Vi 可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制。Vi 不是一个排版程序,它不象 Word 或 WPS 那样可以对字体、格式、段落等 其他属性进行编排,它只是一个文本编辑程序。Vi 没有菜单,只有命令,且命令繁多。
Vi 不是一个所见即所得的编辑器,如果要进行复制和格式化文本需要手动输入命令进行操作。 安装好 Linux 操作系统后,一般己经默认安装了 Vi 编辑器。为了使用方便,建议安装 Vi 的扩展版本 Vim,它比 Vi 更强大,更加适合初学者使用。
1. Vim 的安装
在介绍如何使用 Vim 编译器之前需要先安装 Vim 软件包,如果没有安装 Vim ,可以使用如下命令进行安装。
#apt-get install vim (使用apt-get命令安装vi)
Reading package lists... Done (检査软件包列表)
Building dependency tree... Done (建立依赖)
Suggested packages:
ctags vim-doc vim-scripts
The following NEW packages will be installed: (如下软件包将被安装)
vim (vim软件包)
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.(软件包变更统计)
Need to get 0B/745kB of archives.
After unpacking 1438kB of additional disk space will be used.
Selecting previously deselected package vim.
(Reading database . . . 83502 files and directories currently installed.)
Unpacking vim (from .../vim_7.0-122+letch3_i386.deb) ... (解压vim)
Setting up vim(7.0-122+letch3)... (设置vin)
在 Ubuntu 下,apt-get 工具对系统的软件包进行管理。install 选项安装会自动查找和安装指定的软件包,其命令格式为(我的 Ubuntu 在使用此命令时,需要 root 权限,所以前面要加一个命令 sudo ):
sudo apt-get install 软件包的名字(比如此次安装的 Vim)
2. Vim 编辑器的模式
Vim 主要分为普通模式和插入模式。
普通模式是命令模式,插入模式是编辑模式。
在插入模式下可以进行字符的输入,输入的键值显示在编辑框中,这些文本可以用于编辑。普通界面是进行命令操作的,输入的值代表一个命令。例如在普通模式下按 h 键, 光标会向左移动一个字符的位置。
插入模式和普通模式的切换分别为按 i 键和 Esc 键。
在普通模式下按 i 键,会转入插入模式;在插入模式下按 Esc 键进入普通模式。
在用户进入 Vim 还没有进行其他操作时, 操作模式是普通模式。
二、使用 Vim 建立文件
Vim 的命令格式为 “ vim 文件名 ”,文件名是所要编辑的文件名。例如要编辑一个“ hello.c ” 的 C 文件,按照如下所述的步骤进行操作。
1. 建立文件
使用 Vim 建立一个新文件的命令格式为 “vim 文件名 ”。使用如下命令建立一个 hello.c 的 C 语言源文件,并同时将文件打开。
$ vim hello.c
2. 进入插入模式
打开文件后,默认情况下进入普通模式。按 i 键,进入插入模式,vim 会在窗口的底部显示 “ –INSERT– ”( 中文模式显示下显示的是 “ --插入-- ” ),这表示当前模式为插入模式。 在输入文本的时候,最下边有一个指示框,告诉用户正在编辑文件的—些信息,例如:
--INSERT-- 6,11 All
表示当前模式为插入模式,光标在第 6 行第 11 个字符位置上。
新接触 Vim 的读者常常会不知道自己在什么模式下,或者不小心输入了错误的指令和错误的操作。如果遇到这种情况,无论在什么模式下,要回到普通模式只需按 Esc 键就可以了。有时会按两次 Esc 键,当 Vim 发出“嘀”的一声,就表示 Vim 已经在普通模式了。
注释:
i : 进入插入模式,插入位置在光标前。
I : 进入插入模式,插入位置在光标所在行 行首。
a : 进入插入模式,插入位置在光标后。
A : 进入插入模式,插入位置在光标所在行 行尾。
o : 进入插入模式,向 下 新开一行,插入行首。
O : 进入插入模式,向 上 新开一行,插入行首。
3. 文本输入
在编辑区输入如下文本:
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
输入第一行后,按 Enter 键开始一个新行。
4. 退出 Vim
在编译完成后,按 Esc 键退出插入模式回到普通模式,输入 “ : wq ” 退出 Vim 编辑器。
运行命令 ls :
$ ls -l (查看当前目录下的文件)
hello.c
会发现当前目录下己经存在一个名为 hello.c 的文件。
输入的 wq 是 “保存后退出” 的意思:q 表示退出,w 表示保存。
当不想保存所作的修改时,输入“ : ” 键后,再输入 “ q! ”, Vim 会直接退出,不保存所作修改。q! 是强制退出的意思。
Vim 有一个学习的帮助工具——vimtutor,它是很有帮助的一个工具,初学者可以使用它进行 Vim 的练习。输入“ vimtutor ”后,可以按照它的指示由浅入深地进行学习。
三、使用 Vim 编辑文本
Vim 的编辑命令有很多,对于常用的几个命令进行详细介绍。介绍如何在 Vim 下移动光标,进行删除字符、复制、查找、转跳等操作。
1. 移动光标 h、j、k、l 等操作命令
Vim 在普通模式下移动光标需要按特定的键,进行左、下、上、右光标移动操作的字符分别为 h、j、k、l 这 4 个字符,其含义如下:
# 移动光标
h : 左移
j : 下移
k : 上移
l : 右移
M : 光标移动到中间行
L : 光标移动到屏幕最后一行 行首
G : 移动到指定行,行号 -G (3G 移动到第 3 行)
w : 向后一次移动一个字
b : 向前一次移动一个字
{ : 按段移动,上移
} : 按段移动,下移
Ctr-d : 向下翻半屏
Ctr-u :
Ctr-f :
Ctr-b : 向上翻一屏
gg : 光标移动到文件开头
G : 光标移动到文件末尾
gg=G : 从文件开头到结尾,对内容进行排版
按 h 键,光标左移一个字符的位置;按 l 键,光标右移一个字符的位置:按 k 键;光标上移一行;按 j 键,光标下移一行。
当然还可以用方向键移动光标,但必须将手从字母键位置上移动到方向键上,这样会减慢输入速度。而且,有一些键盘是没有方向键的,或者需要特殊的操作才能使用方向键 (例如必须按组合键)。所以,知道用 h、j、k、l 字符移动光标的用法是很有帮助的。
2. 删除命令 x 、dd 撤销命令 u 、Ctrl+R
要删除一个字符可以使用 x ,在普通模式下,将光标移到需要删除的字符上面然后按 x 键。例如 hello.c 的第一行输入有一个错误:
#Include <stdio.h>
将光标移动到 I 上,然后按 x 键,切换输入模式到插入模式,输入 i ,对 include 的修正完成了。
要删除一整行可以使用 dd 命令,删除一行后,它后面的一行内容会自动向上移动一行。dd 命令删除当前行并复制当前行内容到缓冲区。使用这个命令的时候要注意输入 d 的个数,两个 d 才是一个命令,在实际使用过程中经常将 d 的输入个数弄混淆。
恢复删除可以使用 u 。当删除了不应该删除的东西后,u 命令可以取消之前的删除。例如,用 dd 命令删除一行,再按 u 键,恢复被删除的该行字符。
Ctrl+r 是一个特殊的命令,它为取消一个命令,可以使用它对 u 命令造成的后果进行弥补。例如使用 u 命令撤销了之前的输入,重新输入字符是很麻烦的,而使用 Ctrl+r 可以十分方便地将之前使用 u 命令撤销输入的字符重新找回。
# 删除命令
x : 删除光标最后一个字符,相当于 Del
X : 删除光标前一个字符,相当于 Backspace
dd : 删除光标所在行
n dd : 删除指定行数 (2 dd 删除光标所在行起,两行,光标所在行为第一行)
D : 删除光标后本行所有字符,包括光标所在字符
d0 : 删除光标前本行所有内容,不包含光标所在字符
dw : 删除光标开始位置的字,包含光标所在字符
# 撤销命令
u : 一步一步撤销
U : 一次性撤销 当前行 所作的所有操作
Ctr-r : 反撤销
3. 重复命令 . 文本行左移右移 << 、>>
. : 重复上一次操作的命令
<< : 文本行左移,控制缩进经常使用
>> : 文本行右移,控制缩进经常使用
(如果向控制好几行代码一起左移右移,选中要移动的代码行,再按左移或者右移命令即可)
4. 复制黏贴 p 、y
Vim 下的粘贴命令是字符 p ,它的作用是将内存中的字符复制到当前光标的后面。使用 p 时的前提是内存中有合适的字符串复制,例如要将一行复制到某个地方,可以用 dd 命令删除它,然后使用 u 命令恢复,这时候内存中是 dd 命令删除的字符串。将光标移动到需要插入的行之前,使用 p 命令可以把内存中的字符串复制后放置在选定的位置。
y 命令(即 yank )是复制命令,将指定的字符串复制到内存中,yw 命令(即 yank words) 用于复制单词,可以指定复制的单词数量,y2w 复制两个单词。例如下一行代码:
(光标位置)#include <stdio.h>
光标位于此行的头部,当输入 y2w 时字符串 #include 就复制到内存中,按 p 键后,此行如下:
##include include <stdio.h>
㊨ 注意:命令 y 在进行字符串复制的时候包含末尾的空格。按行进行字符串的复制时,使用 dd 命令复制的方式比较麻烦,可以使用 yy 命令进行复制。dd 命令删除当前行并复制当前行内容到缓冲区 。yy 命令复制当前行内容到缓冲区。
yy : 复制当前行
n yy : 复制 n 行,从光标所在行为第一行开始往后
p : 在光标所在位置向下新开辟一行,粘贴
5. 可视模式 替换操作
# 可视模式
v : 按字符移动,以字符为单位,选中文本
V : 按行移动,以行为单位,选中文本可以配合 d, y, >>, << 实现对文本的相关操作
# 替换操作
r : 替换 当前字符
R : 替换 当前行光标后的字符
6. 分屏操作
进入分屏操作要在末行模式下,也就是命令模式下 : 后跟命令
# 分屏操作
sp : 上下分屏,后可跟文件名
vsp : 左右分屏,后可跟文件名
Ctr+w+w : 在多个窗口切换
Ctr+w c/q : 关闭光标所在分屏
执行 shell 下命令 : 末行模式里输入 ! ,后跟命令
7. 启动分屏 关闭分屏 编辑中分屏 分屏编辑中光标的移动 移动分屏 屏幕尺寸
启动分屏
在开始启动 vim ,可以输入指定的参数启动对应的分屏模式。
1. 使用大写 O 参数进行垂直分屏
$ vim -On file1 file2 ... # n 是数字,表示分屏的数量
2. 使用小写 o 参数进行水平分屏
$ vim -on file1 file2 ... # n 是数字,表示分屏的数量
注:n 是数字,表示分屏的数量
关闭分屏
1. 关闭当前窗口
# 关闭当前窗口
ctrl+w c
2. 关闭当前窗口,如果只剩最后一个,则退出 vim
ctrl+w q
编辑中分屏
1. 上下分割当前打开的文件
ctrl+w s
2. 上下分割,并打开一个新的文件
:sp filename
3. 左右分割当前打开的文件
ctrl+w v
4. 左右分割,并打开一个新的文件
:vsp filename
分屏编辑中光标的移动
vi 中的光标鍵是 h,j,k,l,要在各个屏之间切换,只需要先按一下 ctrl+w
1. 把光柄移动到上边的屏
ctrl+w k
2. 把光柄移动到下边的屏
ctrl+w j
3. 把光柄移动到右边的屏
ctrl+w l
4. 把光标移动到左边的屏
ctrl+w h
5. 把光柄移动到下一个的屏
ctrl+w w
移动分屏
1. 向上移动
ctrl+w K
2. 向下移动
ctrl+w J
3. 向右移动
ctrl+w L
4. 向左移动
ctrl+w H
屏幕尺寸
1. 增加高度
ctrl+w +
2. 减少高度
ctrl+w -
3. 让所有屏的高度一致
ctrl+w =
4. 左加宽度
ctrl+w >
5. 右加宽度
ctrl+w <
6. 右增加 n 宽(如:n=30)
ctrl+w n <
实例: ctrl+w 30 <
8. 查找字符串 “ / ”
査找字符串的命令是 “ /xxx ” ,其中的 xxx 代表要查找的字符串。例如查找当前文件的 printf 字符串,可以输入以下命令进行査找:
":/printf"
按 Enter 键后,如果找到匹配的字符串,光标就停在第一个合适的字符串光标上。查找其他的匹配字符串可以输入字符“ n ”向下移到一个匹配的字符串上,输入字符“ N ”则 会向上移到一个匹配的字符串上。
9. 跳到某一行 g
在编写程序或者修改程序的过程中,经常需要转跳到某一行(这在编译程序出错,进行修改程序的时候是经常遇到的,因为 GCC 编译器的报错信息会提示某行出错)。命令“ :n ”可以让光标转到某一行,其中 n 代表要转跳到的行数。例如要跳到第 5 行,可以输入“ :5 ”,然后按 Enter 键,光标会跳到第 5 行的头部。还有一种实现方式,即 nG,n 为要转跳的行数,5G 是转跳到第 5 行的命令,注意其中的 G 为大写。
10. 查看 Man Page
光标移动到函数上,Shift-k 光标移动到函数上,3 Shift-k,查看第三章的 Man Page ,函数相关信息在第三章里面
11. 查看宏定义
[-d: 可以查看宏定义,必领先包含此宏所在的头文件
12. 代码排版
gg=G : 代码自动缩进排版
四、Vim 的格式设置
Vim 下可以进行很多方式的格式设置,这里仅对经常使用的格式进行介绍,例如设置缩进,设置 Tab 键对应空格的长度,设置行号等。
1. 设置缩进
合理的缩进会使程序更加清晰,Vim 提供了多种方法来简化这项工作。要对 C 语言程序缩进,需要设定 cindent 选项;如果需要设置齐一行的缩进长度可以设置 shiftwidth 选项。 例如如下命令实现 4 个空格的缩进。
:set cindent shiftwidth=4
设定了这一选项之后,当输入一行语句后,Vim 会自动在下一行进行缩进。例如在 if(x) 一行代码后面的内容,行的开头会自动向下一级缩进。例如:
if (a==b)
自动缩进 --> do equal ();
自动取消缩进 <-- if (a>b) {
自动缩进 --> do lt();
自动取消缩进 <-- }
自动缩进还能提前发现代码中的错误。例如当输入了一个“ } ”后,如果发现比预想中的缩进多,那可能缺少了一个“ } ”。用 % 命令可以查找与“ } ”相匹配的“ { ”。
2. 设置 Tab 键的空格数量
进行文本编辑的时候 Tab 键可以移动一块较大的距离,不同的文本编辑器对 Tab 键移动距离的解释是不同的。Vim 编辑器 Tab 键的默认移动距离为 8 个空格,当需要对这个值进行更改的时候,需要设置 tabstop 选项的值。命令 “ :set tabstop=2 ” 可以设置 Tab 键对应空格的数量,例如“ :set tabstop=2 ”将 Tab 键的宽度设置为 2 个空格。
3. 设置行号
在程序中设置行号使程序更加一目了然,设置行号的命令是“ :set number ”,按下 Enter 键后程序每行代码的头部会有一个行号的数值。
五、Vim 配置文件.vimrc
Vim 启动的时候会根据 〜/.vimrc 文件配置 vi 的设置,可以修改文件 .vimrc 来定制 Vim 。 例如可以使用 shiftwidth 设置缩进宽度、使用 tabstop 设置 Tab 键的宽度、使用 number 设置行号等格式来定义 Vim 的使用环境。例如按照如下的情况对 .vimrc 文件进行修改:
set shiftwidth=2 #设置缩进宽度为 2 个空格
set tabstop=2 #设置 Tab 键宽度为 2 个空格
set number #显示行号
再次启动 Vim ,对缩进宽度、Tab 键的宽度都进行了设定,并且会自动显示行号。
六、使用其他编译器
在 Linux 下还有一些其他的编辑器,例如 Gvim ( Gvim 是 Vim 的 GNOME 版本)、codeblocks ( 严格来说是一个 IDE 开发环境)。
在 Linux 下进行开发并不排斥使用 Windows 环境下的编辑器,例如写字板、UltraEdit、 VC 的 IDE 开发环境等,在保存的时候要注意保存为 UNIX 格式,这主要是换行符造成的。 在 Windows 下的换行为 “回车+换行”,而 UNIX 环境下的换行为单个的换行,在 Linux 下用 Vim 查看会发现每行的末尾有一个很奇怪的 “〜”。如果没有保存为 UNIX 格式,在 Linux 下可以用 dos2UNIX 转换。例如,文件 hello.c 使用 Windows 编辑器,默认保存,将其转换为 UNIX 格式:
$dos2UNIX hello.c
再次査看文件 hello.c,“〜” 符号已经消失了。