Vim编辑器是一个可定制性很强的编辑器.在这一次的学习中我们将会看到如何来定制我们的Vim编辑器的图形界面.
假如我们现在正在终端窗口下使用Vim编辑器,而现在我们要切换到图形界面下,我们可以用下面的命令来做到:
:gui
(注:但是这个命令要求我们的在编译Vim时加入了这个选项)
当我们的启动gvim时,这个窗口的位置是由窗口系统来控制的.在UNIX下,这个窗口的大小就是我们的启动编辑时终端窗口的大小.换句话说,如果我们有一个24X80的终端窗口,那么我们的在启动Vim编辑器时就会得到一个24X80的编辑窗口.如果有一个比较大的终端窗口,例如是50x132的,那么我们就会得到一个这样大小的编辑窗口.在UNIX系统下,我们可以使用-geometry标记来指定启动的vim的位置和大小.这个选项的一般形式如下:
-geometry width+x heightx_offset-y_offset
这里的width和height以字符数指定了窗口的大小.而x_offset和y_offset则是指定了窗口的位置.x_offset以像素数指定了屏幕的左边和窗口的左边的距离.如果这个值是一个负数,则是指定编辑器的左边和屏幕的右边的距离.与此相类似,y_offset则是指定了上边缘,如果为负数,则是指定了下边缘的空白大小.所以如果我们要在屏幕的左上角启动gvim,可以用下面的命令:
$ gvim -geometry +0+0
参数width和height则是指定了所启动的窗口的大小,也就是所具有的行数和列数.例如如果我们需要一个80x24的编辑窗口我们可以用下面的命令:
$ gvim -geometry 80x24
我们在图形界面下可以用下面的命令来得到当前窗口所在的位置:
:winpos(以左上角为标准)
如果我们要移动到指定的位置,我们可以用下面的命令形式:
:winpos X Y
例如如果我们要将当前的窗口移动到(20,30)处,我们可以用下面的命令:
:winpos 20 30
下面的命令可以显示当前编辑窗口的行数:
:set lines?
要改变这个值,我们可以用下面的命令形式来做到:
:set lines=lines
这里的lines则是我们希望在新的编辑窗口中所具有的行数.
与此相类似的如果我们要改变当前窗口的列数,可以用下面的命令形式:
:set columns=columns
在比较老一些的Vim版本中还会有:winsize这个命令.这个命令并不推荐大家使用,因为我们可以用:set lines和:set columns命令来代替了.
我们还要可以用guioptions选项来控制许多的GUI的基本特征.这个命令的一般形式如下:
:set guioptions=options
options是一个字母的集合,每一个是一个选项.
下面的是一些Vim定义的选项:
a Autoselect
如果我们设定了这个选项,当我们在的可视化模式下选择了文本,Vim会试着将我们的所选择的文本放在系统的全局寄存器中.这就意味着我们可以在这个Vim中选择文本然后用命令"*p将这些文本粘贴到另一个Vim中.如果没有这个选项,那么我们就要用命令"*y来将所选择的文本复制到系统寄存器中.这也意味着在系统寄存中的文本也可以被其他的程序所使用.例如在UNIX系统上我们可以在可视化模式下选择文本然后用鼠标中键将其他复制到系统的终端窗口中.如果我们在Windows平台下,我们在可视化模式下选择的文本会被自动放到系统寄存器中.这就意味着我们可以在Vim编辑中选择文本然后将其粘贴到Word文档中.
f Foreground
在UNIX系统上,gvim命令可以执行fork()命令,这样编辑器就可以在后台运行.我们可以通过设置这样的选项来防止这样的事情发生.如果我们要编辑一个脚本程序需要执行gvim命令使得用户可以编辑文件而且要等待到编辑工作结束时,这样的选项就会显得更为有用.如果我们要调试一个程序,我们就会发现这时的f标记也是相当有用的.(注:这里我们的注意的就是这个要在初始文件中进行设置)
i Icon
如果我们设置了这个选项,gvim就会在X Windows系统上运行而且最小化时会显示一个图标.如果没有设置这个选项,这时只会显示我们正在编辑的文件的名称而不会显示图标.
m Menu 可以显示菜单栏
M Nomenu
如果在初始时设置了这个选项,那么系统菜单的定义文件$VIMRUNTIME/menu.vim就不会被读入.(注:这个选项要在vimrc文件中进行设置)
g Gray
这个选项可以将那些不可用的菜单内容显示为灰色.如果没有设置这个选项,那些不可用的菜单内容就会从菜单栏或是工具栏中移除.
t Tear off 打开tear off菜单
T Tool bar 包括工具栏
r Right scrollbar 在编辑器右侧放置滚动条
l Left scrollbar 在编辑器在侧放置滚动条
b Bottom scrollbar在编辑器底部放置滚动条
v Vertical dialog boxes
在对话框中采用垂直的排列顺序
p Pointer callback fix
我们可以用这个选项来处理当X11窗口管理器发生问题时的情况.这样可以使用程序可以产生定点回溯.我们必顺在gvimrc文件中进行设置.
我们可以通过toolbar选项来控制toolbar的外观.他的一些值如下:
icon 显示工具栏图标
text 显示文本
tooltips当光标位于图标上时显示的文字
Vim编辑器默认的设置如下:
:set toolbar=icons,tooltips
如果我们要关掉工具栏,我们不可以将这个选项设为空字符串,而是用下面的命令来做到:
:set guioptions-=T
如果我们使用终端窗口进行编辑,一些终端可以允许我们更改当前窗口的标题和图标.
例如如果我们要将当前窗口的标题改为我们正在编辑的文件名,我们可以用下面的命令:
:set title
有时文件的全名要比我们所有的标题的空间长.我们可以用下面的命令来改变文件可以占用的空间数量:
:set titlelen=85
在这种情况下,标题的文本可以占用标题栏85%的空间.
如果我们不喜欢Vim为我们设置的标题,我们可以用下面的命令形式来进行更改:
:set titlestring=Hello\ World!
当我们要退出Vim时,Vim会试着重新载入先前的标题.如果他不能成功载入(在这一点上Vim并没有记忆功能),编辑器就会将标题设置为有由titleold选项所指定的字符串.例如:
:set titleold=vim\ was\ here!
如果窗口设置了图标(iconified),icon选项就会告诉Vim是否试着将文件名放入图标标题.如果设置了这个选项,Vim就会试着更改图标的文本.如果我们不喜欢Vim默认的设置,我们可以通过iconstring选项来指定图标的文本.如果我们设置了icon选项使得图标下面的字符串包含用我们当前正在编辑的文件名(或者是我们通过设置iconstring达到同样的作用).如果关闭了这个选项,光标就会有一个一般的Vim标题.
Vim编辑器是UNIX系统上一个可以使用鼠标进行操作的一个文本编辑器.这就意味着我们可以使用鼠标进行许多的编辑操作.我们可以用下面的一些我们讨论的内容定义我们的鼠标操作.在一般的情况下,当我们要从一个Vim编辑窗口移动到另一个Vim编辑窗口时,我们要使用一些窗口切换的命令,如CTRL-Wj或是CTRL-Wk.如果我们执行了下面的命令,那么光标所在的窗口就是我们的当前窗口:
:set mousefocus
mousemodel选项可以定义鼠标可以做什么.有三种可能的模式:extend,popup,popup_setpos.设置鼠标的模式可以用下面的命令形式:
:set mousemodel=mode
在所有的模式中,鼠标左键移动光标,拉动左键可以选择文本.
在extend模式中,右键可以扩展文本而右键可以粘贴文本.这样的操作与xterm中使用鼠标相类似.
在popup模式中,右键可以显示弹出菜单.这种模式也大多数的Windows程序相类似.
popup_setpos模式与popup模式相类似,所不同的只是当我们按下鼠标右键时文本的光标会移动到鼠标点击处,然后显示弹出菜单.
mouse选项可指定鼠标对应某一模式.可能的模式如下:
n 正常(Normal)
v 可视(Visual)
i 插入(Insert)
c 命令行(Command-line)
h 除了hit-return以外的帮助文件中的所有模式
a 除了hit-return以外的所有模式
r more-prompt和hit-return提示
鼠标左键将文本中的光标移动到鼠标点击处,鼠标右键可以使得Vim编辑器进入可视化模式,并且文本光标处和鼠标右键点击处之间的文本会被选中.鼠标中键的作用类似于P命令,可以将未命名寄存器中的文本粘贴到文件中.如果我们在点击鼠标中键之间指定了寄存器,Vim就会将这个寄存器中的内容粘贴到文件中.如果我们的鼠标有一个滚轮,向上滚动时就会向上移动三行,与此相类似当向下滚动时就会向下滚动三行.如果我们同时按下Shift键就会以一个屏幕的单位量进行滚动.也就是说<S-MouseUp>向上移动一个屏幕,而<S-MouseDown>向下移动一个屏幕.
选项mousetime可以定义双击之间的最大时间间隔.这个命令的一般形式如下:
:set mousetime=time
这里的时间是以毫秒为单位的,在默认的情况下为半秒(500ms)
当我们在图形界面下进行文本编辑时,我们要同时处理文本光标和鼠标光标.如果我们认为鼠标这样的存在方式使得我们不舒服,我们可以告诉Vim编辑器当我们没有鼠标时隐藏鼠标光标.我们可以用下面的命令来做到:
:set mousehide
这样以后,当我们开始输入时鼠标就会隐藏.而当我们移动光标时鼠标就会再一次出现.
selectmode选项可以定义编辑器开始选择模式(selectmode)而不是可视模式(visualmode).下面的事件可以引发选择模式:
mouse 移动光标
key 使用特殊键
cmd v,V,CTRL-V命令
这个命令的一般形式如下:
:set selectmode=mode
这里的Mode是由逗号分隔的事件列表(mode,key,cmd)
选项keymodel可以使得<Left>,<Right>,<Up>,<Down>,<End>,<Home>,<PageUp>,<PageDown>做一些特殊的事情.
例如如果我们设置了下面的命令,Shift+Key就可以选择文本:
:set keymodel=startsel
如果我们执行了下面的命令,没有移位的键就会结束选择状态:
:set keymodel=stopsel
我们还可以将这两个命令组合到一起:
:set keymodel=startsel,stopsel
Vim编辑器所使用的菜单是由文件$VIMRUNTIME/menu.vim定义的.如果我们要定义我们自己的菜单,我们首先要看一下这个文件.
定义一个菜单内容,可以使用:menu命令.这个命令的基本形式如下:
:menu menu-item command-string
这个命令与:map命令相类似
这里的menu-item描述了在哪里放置菜单内容.我们比较熟悉的经典菜单内容为File.Save,这就表明了Save菜单在File菜单下.而&号则是表明这是一个快捷键.例如下在gvim中,我们可以用Alt-F来选择File菜单而用s来选择保存菜单(这里没有看明白).所以这里的menu-item看起来就是这样的&File.&Save.
而事实上File.Save的定义如下:
:menu 10.340 &File.&Save<Tab>:w :confirm w<CR>
这里的数字被称为优先级(priority)数.他可以用来决定编辑器如何放置菜单内容.第一个数字10表明了在菜单栏上的位置.小数字靠近左侧,而大数字靠近右侧.第二个数字则是决定了下拉菜单的位置.小数字在上部,而大数字在下部.
在这个例子中我们还可以看出很重要的一点就是menu-item必须是一个词.如果我们要在名字中加入空格或是Tab,我们就要用到<>或是\.例如:
:menu 10.340 &File.&Do\lt:exit<CR>
最后我们还可以为一定的模式来定义菜单.这个命令的一般形式如下:
:[mode]menu [priority]menu-item command-string
mode是下列中的一种:
a 正常(Normal),可视(Visual),运算符操作(Operator-pending)
n 正常(Normal)
v 可视(Visual)
o 运算符操作(Operator-pending)
i 插入(Insert)
c 命令行
还有一些特殊的菜单名称:
工具栏(ToolBar) 菜单下面的图标
弹出菜单(PopUp) 在一定的模式下在编辑窗口中点击右键弹出的菜单
工具栏是使用图标而不是使用文本来表明菜单的作用.例如名为ToolBar.New的menu-item是使得New图标显示在工具栏上.在Vim编辑器中有28个基本的图标.每一个图标都有两个名字,例如New图标可以由ToolBar.New或是ToolBar.builtin00来表示.builtin00-builtin27所指代的图标分别为New,Open,Save,Undo,Redo,Cut,Copy,Paste,Print,Help,Find,SaveAll,SaveSesn,NewSesn,LoadSesn,RunScript,Replace,WinClose,WinMax,WinMin,WinSplit,Shell,FindPrev,FindNext,FindHelp,Make,TagJump,RunCtags.
如果图标并不与基本的图标相匹配,编辑器就会在$VIMRUNTIME/bitmaps目录中进行查找.在UNIX系统中图标大小为20x20像素.
当我们将光标放在图标上时工具栏会显示一个小提示.要定义这个提示,我们可使用下面的命令:
:tmenu menu-itme tip
例如下面的命令可以使得当光标放在打开图标上时会显示Open file字样:
:tmenu ToolBar.Open Open file
我们可以用下面的命令列出所有的菜单映射:
:menu
我们在使用这个命令时遇到的一个问题就是我们会得到51个屏幕的数据输出.这对于我们来说实在是太多了.如果我们要只显示特定的菜单内容,我们可以用下面的命令:
:menu menu
例如我们要列出File的菜单内容,我们可以用下面的命令:
:menu File
而下面的命令只是列出File.Save的菜单内容:
:menu File.Save
在这个命令的执行结果的每一行的首个字母指明了这个命令的模式.这里的字符是与我们前面提到的mode参数相一致的.
下面的命令可以执行一个菜单的内容就像我们的从菜单中选中一样:
:emenu menu-item
:menu命令定义了菜单内容.如果我们定义了一个菜单内容而且想要使得在他的右侧没有映射(no mapping),可以使用:noremenu命令.
下面的命令可以从菜单中移除菜单项:
:[mode]unmenu menu-item
如果我们使用*,那么整个菜单都会被清除.
要移除工具栏的提示,可以用下面的命令:
:tunmenu menu-itme
(注:这里不懂:(
Tearing Off a Menu
You can tear off a menu by using the dotted tear-off line on the GUI. Another way to do this is to execute the following command:
:tearoff menu-name)
Vim编辑器中的一些命令是专为图形界面的Vim而设计的.这些命令都是关于对话框的.
命令:browse可以打开一个文件浏览器,然后会对选中的文件执行命令.例如下面的命令可以使得我们打开文件浏览器然后选择要打开的文件:
:browse edit
编辑器然后会执行:edit file命令.
:browse命令的一般形式如下:
:browse command [directory]
这里的command是以文件名为参数的编辑器命令.例如:
:read,:write,:edit
如果我们指定了directory参数,我们就指定了文件浏览器开始的目录.如果没有指定这个参数,那么浏览器就会选择browsedir选项所指定的目录.这个选项可以用下面的三个值:
last 使用上一次浏览的目录(默认)
buffer 使用与当前缓冲区相同的目录
current 总是使用当前目录
所以如果我们要总是从当前目录开始,我们就要将下面的命令放在我们的初始化文件中:
:set browsedir=current
下面的命令会显示一个查找对话框:
:promptfind [string]
如果我们指定了string的值,那么这个值就会作为查找区的初始值.然后当我们按下查找下一个的按键时,Vim编辑器就会查找指定的字符串.
与此相类似,下面的命令可以打开一个替换对话框:
:promptrepl string
如果我们指定了string的值,他就会被作为查找的内容.
下面的命令会使我们打开一个对话框,我们可以在这个对话框中输入我们想要得到的帮助内容:
:helpfind
:confirm选项会在例如执行:quit命令会破坏数据时执行命令.如果命令的执行会破坏数据,那么就会显示一个确认窗口.
例如下面的命令会显示出一个确认窗口:
:confirm :quit
下面的命令会打开一个窗口并且充许我们在其中查看选项:
:browse set
这个窗口可以使得我们访问所有的选项.开如是一个简短的内容提示.我们可以用光标命令定位内容然后回车就会得到一个详细的列表信息.
clipboard选项可以控制编辑器如何来处理由鼠标选择的文本.如果我们要将所有的鼠标选择的文本放在未命名寄存器中和剪切板寄存器中,我们可执行下面的命令:
:set clipboard=unnamed
这就意味着我们可以文本粘贴到其他的程序中.
另一个选项如下:
:set clipboard=autoselect
如果我们设置了这个选项,可视模式下选择的文本就会放在系统剪切板中.
autoselect选项可以在图形界面和文本下工作.
当我们启动图形界面的Vim时,Vim会试着确定我们的背景是浅色(light)还是深色(dark),并且执行下面的命令来设置正确的值:
:set background=value
语法文件就会由这个值来确定使用哪种颜色.
如果我们不喜欢Vim当前使用的图形界面下面的字体,我们可以用下面的命令来进行更改:
:set guifont=font
这里的Font是字体的名称.在X Windows系统中我们可以用命令xlsfonts列出所有可用的字体.在Windows系统中我们可以由控制台来得到一个字体列表.
我们还可以使用下面的命令:
:set guifont=*
这个命令就会打开一个字体选择列表,我们可以从中选择字体.
selection选项可以定义如何来处理选择的文本.可用的值如下:
.old
不充许选中的内容超过一行的最后一个字符.选中部分的最后一个字符包括在操作之内.
.inclusive
超过一行的最后一个字符会被包含进来.选中部分的最后一个字符在操作之内
.exclusive
越过一行结尾的字任会被包含进来.选中部分的最后一个字符不在操作之内.
选项guicursor可以定义图形界面下的光标显示.这个命令的形式如下:
:set guicursor=mode:style[-highlight],mode:style[-highlight],...
我们可以设置的mode如下:
n 正常模式
v 可视模式
ve 可视模式但不包括selection
o 运算符操作模式
i 插入模式
r 替换模式
c 命令行正常(追加)模式
ci 命令行插入模式
cr 命令行替换模式
sm 在插入模式下showmatch
a 所有模式
我们还可以将这些模式进行组合,如下:
n-v-c
这里的style如下:
horN 水平栏,字符高度的N个百分比
verN 垂直栏,字符宽度的N个百分比
block 光标块,覆盖整个字符
blinkwaitN
blinkonN
blinkoffN
当我们指定了这些选项,系统等待blinkwait毫秒,然后为blinkoff关闭光标,为blinkon打开光标.并进行循环.
在X Windows系统中,窗口管理器负责窗口的边框和装饰.选项guiheadroom可以告诉Vim编辑器在窗口的周边(上部和下部)有多大的空白空间,这样当他进入全屏幕模式时会为边框留下空间.
我们在图形界面下使用Vim时要想执行一个Shell命令时又应如何来做呢?通常系统会使用UNIX设备pty来处理命令接口.
如果我们要使用管道进行连接,可以用下面的命令:
:set noguipty
否则在默认的情况下使用pty进行Shell和GUI的连接:
:set guipty