分享

Vim 与 SQL*Plus 结合使用

 dazheng 2007-05-06

在 Oracle 环境中使用 Vim?本文介绍了一些最有效地使用这个流行的文本编辑器的提示和技巧(以及在 Windows 2000 上运行它的一些忠告)。

Vi 工具(包括在几乎每种 UNIX 操作系统中并运行在近 20 种不同的平台上)极有可能是世界上最流行的文本编辑器;而 Vim(或 Vi iMproved) — Vi 的增强扩展版 — 是 Linux 在系统管理员中间最受欢迎的文本编辑器之一。鉴于将 Linux 作为 Oracle 数据库部署平台的日益普遍,人们越来越趋向于结合使用 Vi/Vim 和 SQL*Plus

在本篇文章中,我介绍了当结合使用 Vim 和 SQL*Plus 时如何最有效地使用 Vim,以及如何在 Windows 2000 环境中运行该编辑器。(我不了解您,但是 Vim 是我在 Windows 中安装的第一个软件。)本文章假定您使用的是 Vim 编辑器 6.2 版,它可以从 http://www./download.php 下载。尽管我几乎可以确信本文所介绍的内容也适用于 5.X 版本,但是本文中所介绍的许多示例和功能不适用于标准 Vi 编辑器。

Vi 模式

 

Vim 编辑器可工作在如下几种模式下:
  • 插入模式:在该模式下,您可以将文本插入/追加到所编辑的文件中。
  • 普通模式:在这种模式下,可以使用大多数命令(删除/复制/查找/取代/导航)。
  • 可视化模式:该模式(Vi 中没有)可让您直观地选择一部分文本来编辑/缩进/格式化。
后面将对这些模式及其选项作更详细的介绍。

 

四处移动

移动光标的基本命令(依赖于您的兼容性设置)是:

 

k — 向上移动光标(也可按向上箭头键)
h — 向左移动光标(也可按向左箭头键)
l — 向右移动光标(也可按向右箭头键)
j — 向下移动光标(也可按向下箭头键)。

 

这些命令在所希望的方向上把光标一次移动一格。此外,还有在文件中快速、高效地四处移动的更高级方式。

 

按单词移动

 

w — 把光标向前移动一个单词
b — 把光标向后移动一个单词。

 

移动到行首/行尾

 

$ — 把光标移动到行尾
^ — 把光标移动到行的第一个非空白字符处
0 — 把光标移动到行的第一个字符处。

 

您也许注意到,字符 $ 和 ^ 的功能与其在 POSIX 正则表达式中的功能相同。稍后您将看到,Vim 一般情况下能很好地支持正则表达式。

 

移动到指定行或指定文件位置

 

gg — 把光标移动到文件开头
G — 把光标移动到文件结尾
:[0-9] — 冒号后接着一个数字,用于把光标移动到指定的行号
CTRL-f — 把光标移动到下一页
CTRL-b — 把光标移动到上一页。

 

把光标移动到匹配的括号处

 

把您的光标移动到起始括号上,并按下 % 键。光标将会跳到结束括号上。该功能非常有用,尤其是在包含许多括号的大型源文件或 SQL 语句中导航时。

 

这些是在 Vim 编辑器中四处移动的基本操作。所有前面讲到的命令,除了使用箭头键移动外,都需要在普通模式下使用。只有 Vim 版本的编辑器支持利用箭头键进行导航,并且您必须设置“不兼容的功能”(:set nocompatible)。

 

此外,要移动得更快些,您可以指定几乎每个 Vim 命令的“计数”。其语法是[数量][命令];例如,3w 命令将把光标向前移动三个单词。同样,5j 将把光标向下移动五行。

 

编辑文本

 

既然您知道了如何在编辑器中四处移动,下一步将学习如何插入文本、编辑文本、执行模式匹配和替换。要插入文本,只需简单地按下 I 键并开始输入即可。现在,编辑器处于编辑模式下。在编辑完成后,您可以通过按一次 ESC(退出)键来跳转回普通模式。这与要追加一些文本时的情形相同。按下 A 键,您就可以在光标所在位置后开始插入文本。

 

下面列出了一些更复杂的编辑选项:

 

删除文本段

 

x — 删除光标下方的一个字符
dd — 删除光标下方的一行
dw — 删除光标下方的一个单词
d$ — 删除到行尾为止的全部内容
d% — 删除到匹配括号为止的全部内容
dG — 删除由当前光标位置开始到文件结尾为止的全部内容
dgg — 删除由当前光标位置开始到文件开头为止的全部内容。

 

您将注意到,在删除命令中有几个已“四处移动”一节中介绍过的字符 (w、$、%)。您可以把先前讨论过的移动与 d 结合起来使用—例如,4d 将删除 4 行文本。

 

搜索文本段

 

要搜索一个字符串或一个模式,只需在编辑器的普通模式下输入 /pattern 命令即可开始向前搜索该模式的匹配项。类似地,?pattern 命令向后搜索文件。为了浏览搜索结果,您可以按下 n 键跳转到下一个出现的模式上;输入 N 将在相反方向上执行同样的操作。

 

由于下列字符具有特殊含义,因而如果在搜索模式中使用它们时需要对其进行转义:

 

[]
.
*
^
%
/
?
~
$

 

某些选项会使搜索方式稍有不同。例如,您可以使用 :set ignorecase 选项使 Vim 忽略单词的大小写。使用 :set noignorecase 可以关闭该选项。

 

为了在搜索结果内获得更好的直观导航,您可以使用 :set hlsearch 选项使 Vim 突出显示与搜索模式相符的匹配项。要关闭突出显示,可使用 :set nohlsearch 选项。您可以使用任何有效的正则表达式模式作为搜索准则。例如,/^This 用于搜索以“This”开头的行。

 

更改和替换文本

 

更改操作符,c,其工作方式几乎与 d(删除)操作符完全一样。唯一的区别在于,c 将您置于插入模式下。下面给出了一些使用更改操作符的示例:

 

cw — 更改当前单词
cc — 更改整行
c$ — 更改到行尾为止的全部内容。

 

要取代一个文本段,可使用 r 命令,它将取代光标下方的字符。例如,在 hello 上使用 rH 会将其变为 Hello。同样,5rHHello 变为 HHHHH。要将一个字符更改为换行符,可输入 r<Enter>

 

R 命令使 Vim 进入取代模式。在该模式下,Vim 会用您输入的内容取代光标下方的字符。您可以用与退出插入模式相同的方式退出取代模式:通过按下 ESC 键。

 

替换命令

 

替换命令—%s—是 Vim 编辑器中功能最强大的命令之一。它就像执行全局搜索和取代一样。如果您用过 Linux 的 sed 编辑器,您就会熟悉该命令的语法。基本上,替换的工作方式如下:

 

:<scope>s/pattern/replacement/flags

 

例如,为了把 Hello的每一个匹配项都替换成 Good morning,可键入

 

:%s/Hello/Good morning/g

 

% 字符会把更改复制到文件中的所有行上,而 g 标志会导致该行中的所有单词被替换。如果您想只对 4 到 9 行执行相同的替换,则该命令看起来如下:

 

:4,9s/Hello/Good morning/g

 

这两个数字代表要作替换的起始行和结束行。您还可以进一步指定一个额外的 c 标志,从而在每次取代时得到提示。

 

高级编辑

 

您可以通过自动执行某些编辑操作,来加快整个编辑过程。Vim 有几个功能,您可以使用它们来自动执行某些任务。其中一个功能让您能够重复执行某一命令。

 

设想在您的文件中有几个“today”,假定您想对其中的三处进行更改,因此您不能执行全局搜索和取代。通过发出 cw(更改单词)命令,将单词“today”更改为“yesterday”。按下 ESC 键离开插入模式。现在导航到您想取代的下一个单词,并将光标置于该单词的开始处。按下点号 (.) 键。这样将重复上一个操作。

 

假定您有一个文件,它在每一行上都包含一个单词。您想把每一行转换成插入字符串。例如,Oracle 行看起来应当如下:

 

INSERT INTO companies VALUES (‘Oracle‘)";

 

使用我在上面描述的方法执行搜索和取代,并输入如下命令:

 

:%s/^/INSERT INTO companies VALUES(‘/g
:%s/$/‘);/g

 

全局命令

 

Vim 编辑器的这种功能可让您查找一个模式,并在此执行一个命令。假定您想用“database”替换“Oracle”后面的“RDBMS”。您可以使用如下命令:

 

:g/Oracle/s/RDBMS/database/g

 

这将把 Oracle RDBMS 更改为 Oracle database ,而保持 MySQL RDBMS 不变。

 

缩写词

 

您通过使用一些高级的 Vim 功能已经掌握了不少小把戏。现在,我们看一看 Vim 编辑器处理缩写词的能力。

 

设想您是一位 PL/SQL 程序员或 Oracle DBA。您要在编写程序或查询时反复使用相同的代码段。不幸的是,您每次都得编写它们。如果您创建了自己的缩写词集,这个过程就会非常简单。

 

缩写词就像排好序的映射结构那样进行存储着。每个缩写词都以其“键”作为标识,并将特定文本作为其“值”。当您键入一个键时,它就扩展为缩写词的值。您可以使用如下命令来定义缩写词:

 

:ab key value

 

例如:

 

:ab hh Hello World !!!

 

定义缩写词,并转换到插入模式。键入 hh,并按下空格键。正如您所能看到的,hh 转变成 Hello World!!!。当然,该缩写词是无意义的,但是它演示了其原理。您可以创建自己的缩写词,并将它们保存在一个名为 .exrc(在类似 UNIX 的系统上)或名为 _exrc(在 Windows 平台上)的文件中。同样,您可以把这些缩写词存放在 .vimrc (UNIX) 或 _vimrc (Windows) 文件中。(我更喜欢第二种方案,因为我喜欢把我所有的设置保存在一个位置)。下面给出了一些缩写词,它们可以鼓励人们创建他们自己的缩写词或修改这些缩写词:

 

"创建一个空的匿名块
abbr PANBL DECLARE<CR><CR>BEGIN<CR><CR>END;<CR>/
"创建一个空的匿名块并捕获异常
abbr PANBLEX DECLARE<CR><CR>BEGIN<CR><CR>EXCEPTION WHEN others<CR>THEN<CR><CR>END;<CR>/
"为 FOR LOOP 创建一个模板
abbr PFL FOR cc IN col.FIRST..col.LAST<CR>LOOP<CR><CR>END LOOP;<CR>
"创建一个空函数
abbr PCRFN CREATE OR REPLACE FUNCTION <name><CR>AS<CR><CR>BEGIN<CR><CR>END;<CR>/

 

参照示例,您可以定义自己的缩写词。注意,<CR> 字符序列表示一个新行。Vim 将把该序列解释为一个回车符并创建一个新行。为了执行该操作,Vim 使用键符号引用功能键;例如:

 

<BS> — 空格
<Tab> — tab
<CR> — 回车
<Esc> — 退出
<EOL> — 行尾

 

您可以在 Vim 文档中找到其他键符号。

 

键映射

 

Vim 编辑器的另一个强大功能是键映射,用于更改键入的键的含义。使用键映射,您可以自定义编辑器的行为以满足您的需要。常见的做法是,把命令序列映射到功能键上。有一组命令可用来定义、修改、删除和列出键映射。

 

要列出所有定义的键映射,可键入 :map;要定义一个新的映射,可键入 :map <键> <命令序列>;要删除一个映射,可键入 :unmap <键>。(这些只是基础性的知识;您可以在 Vim 文档中获知更多信息)。

 

例如,您可以定义如下映射,将当前的 UNIX 时间戳追加到光标所在位置的后面。该映射使用 Vim 的内置函数 localtime()

 

:map <F2> a<CR>=localtime()<CR><Esc>

 

使用键映射您甚至还可以调用一个外部程序,正如您在下面的示例中所能看到的那样。

 

:map <F3> :!ls -lFa <CR>

 

由于您实际上可以把任意的命令序列映射到一个键,因此您可以把键映射看作一种小型的宏。您应该专注于您频繁用到的命令序列。

 

如同缩写词一样,您可以把您的键映射存储在 vimrc 或 exrc 文件中。

 

可视化模式、缩进、语法突出显示

 

Vim 编辑器还有另一种编辑模式,称为可视化模式(Vi 中没有该模式)。在编辑器的普通模式下按下 v 键即可启动该模式;在标尺中将显示 VISUAL。从现在起,您使用移动命令作出的任何选择都将突出显示在编辑器中。您可以使用任意一种移动命令来扩展选择。(例如,按下 v 和 G 选择整个文件。)

 

代码缩进

 

您可以按下 = 键在可视化模式中缩进代码。该操作会自动缩进所选的代码段。在 Vim 编辑器中有一些特殊的选项来设置缩进:

 

  • :set autoindent:从上一行开始使用缩进
  • :set smartindent:自动缩进选项的“智能”版本,对于没有缩进文件的文件类型非常有用。
  • :set cindent:设置 C 样式的缩进。

 

语法突出显示

 

Vim 编辑器的最强大的选项之一是语法突出显示。这在您不得不处理大代码段时非常有用,它可以显著增加代码的可读性。语法突出显示与称为 Vim 语法文件一起使用。针对每种所编辑文件的扩展名 (.sql, java),会加载相应的语法文件。

 

例如:

 

  • shell$ vim TestClass.java 加载 java.vim 语法文件
  • shell$ vim main.c 加载 c.vim 语法文件
  • shell$ vim repquery.sql 加载 sql.vim 语法文件。

 

这些语法文件都位于 $VIMRUNTIME/syntax 目录中。

 

例如,在 sql.vim 文件中,文件头的前几行是作者的注释。Vim 文件中的行注释由 " 字符定义。

 

" Vim syntax file
" Language:	SQL, PL/SQL (Oracle 8i/9i)
" Maintainer:Paul Moore <gustav@morpheus.demon.co.uk>
" Modified By:David Kalosi <david.kalosi@spordat.sk>
" Last Change:2004 Feb 10
" Description:Added the missing 9i built-in functions and SQL keywords
" For version 5.x:Clear all syntax items
" For version 6.x:Quit when a syntax file was already loaded

 

下面的代码清除了先前所有的语法定义,以防止冲突。

 

if version < 600
syntax clear
elseif exists("b:current_syntax")
finish
endif

 

由于 SQL 和 PL/SQL 都是不区分大小写的语言,下面的代码行使 Vim 忽略大小写。

 

syn case ignore

 

对于区分大小写的语言,可以设置 syn case match

 

该语言元素的定义如下。要突出显示的关键字由 syn keyword <组> <关键字> 命令定义。该语法文件定义了如下组:sqlSpecial、sqlKeyword、sqlOperator、sqlStatement、sqlFunction 和 sqlType。

 

" The SQL reserved words, defined as keywords.
syn keyword sqlSpecial  false null true
syn keyword sqlKeyword	access add as asc begin by check cluster column
syn keyword sqlKeyword	nocompress nowait of offline on online start
syn keyword sqlKeyword	successful synonym table then to trigger uid
syn keyword sqlKeyword	unique user validate values view whenever
.....................
syn keyword sqlOperator	not and or
syn keyword sqlOperator	in any some all between exists
syn keyword sqlOperator	like escape
.....................
syn keyword sqlStatement alter analyze audit comment commit create
syn keyword sqlStatement delete drop execute explain grant insert lock
syn keyword sqlStatement truncate update
.....................
syn keyword sqlType	boolean char character date float integer long
syn keyword sqlType	mlslabel number raw rowid varchar varchar2 varray

 

下面几行定义了 SQL 中字符串的格式,包括字符串的开头和结尾,以及在搜索字符串结尾标记时应跳过的字符,比如当字符串包含转义字符 \" 时。

 

" Strings and characters:
syn region sqlString		start=+"+  skip=+\\\\\|\\"+  end=+"+
syn region sqlString		start=+‘+  skip=+\\\\\|\\‘+  end=+‘+

 

您可以按与定义字符串相似的方法定义数字。用正则表达式定义 SQL 数字。

 

" Numbers:syn match sqlNumber "-\=\<\d*\.\=[0-9_]\>"

 

SQL 和 PL/SQL 语言也包含注释。下面两行分别定义了 SQL 单行注释和 C/C++ 样式的 /**/ 多行注释。

 

" Comments:
syn region sqlComment    start="/\*"  end="\*/" contains=sqlTodo
syn match sqlComment	"--.*$" contains=sqlTodo

 

下面的命令使 Vim 向后搜索 C 样式注释的开头或结尾,并从该位置开始按语法着色。

 

syn sync ccomment sqlComment

 

您还可以定义关键字,以提醒您关于代码的某些问题。

 

" Todo.
syn keyword sqlTodo TODO FIXME XXX DEBUG NOTE

 

下面的 if-else 块用于向后兼容 Vim 5.8 版。在这点上,令人感兴趣的是 HiLink 命令 — 它们把当前组中特定的关键字与某种标准颜色连接起来。该设置本身依赖于终端类型和环境。

 

正如您将看到的,某些组,如 Comment 和 Number,是预定义的。编写 Vim 语法文件时的惯例是把语言名称加在标准组名称前面。(“Comment”变为“sqlComment”,等等。)

 

下面列出了一些首选的组;实际上还有更多的组:
  • Comment
  • Constant
  • Identifier
  • Statement
  • PreProc
  • Type
  • Special
  • Ignore
  • Error
  • Todo
if version >= 508 || !exists("did_sql_syn_inits")
if version < 508
let did_sql_syn_inits = 1
command -nargs=+ HiLink hi link <args>
else
command -nargs=+ HiLink hi def link <args>
endif
HiLink sqlComment	Comment
HiLink sqlKeyword	sqlSpecial
HiLink sqlNumber	Number
HiLink sqlOperator	sqlStatement
HiLink sqlSpecial	Special
HiLink sqlStatement	Statement
HiLink sqlString	String
HiLink sqlType	Type
HiLink sqlTodo	Todo
HiLink sqlFunction    Statement
delcommand HiLink
endif

 

您可以在命令上使用 :syntax 打开语法突出显示,并用 :set filetype= 命令重写文件扩展名。为了让 SQL*Plus 生成的 afiedt.buf 文件支持 SQL 语法,可输入 :set filetype=sql

 

要正确地查看语法颜色,请确保您的终端能够显示彩色字符,并有选择地设置彩色终端仿真。使用如下命令以在 UNIX 系统上显示和设置终端。

 

对于 bash shell 和 korn shell:

 

echo $TERM         # 显示当前终端设置
export TERM=vt102c # 设置终端为 vt102c

 

对于 C shell:

 

echo $TERM          # 显示当前终端设置
setenv  TERM vt102c # 设置终端为 vt102c

 

您可以把如下代码行置入您的 .vimrc 文件中,以让支持彩色的终端能够自动突出显示语法:

 

if &t_Co > 1
syntax enable
endif

 

有关 Oracle 和 Vim 的更多信息

 

许多人使用内置的 SQL*Plus 编辑命令,如 APPENDCHANGEDEL,来编辑 SQL*Plus 缓冲区中的内容。由于它们有限的应用,我没有看出这些命令特别有用。一种更方便的方法是使用 Vim 做编辑工作。您所需要做的全部工作是把 Vim 设置成操作系统默认的编辑器。在 UNIX 系统上,您可以通过把 EDITOR 环境变量设置成 vim 来达到此目的。

 

对于 bash shell 和 korn shell:

 

echo $EDITOR                # 显示当前的操作系统编辑器
export EDITOR=/usr/bin/vim  # 设置操作系统编辑器为 vim

 

接下来的步骤

 

访问 Linux 技术中心

访问 SQL*Plus 产品中心

下载 Oracle 数据库 10g for Linux

 

下载 sql.vim 配置文件

 

浏览 Vim 文档和 Vim Web 站点
对于 C shell:

 

echo $EDITOR                 # 显示当前的操作系统编辑器
setenv  EDITOR /usr/bin/vim  # 设置操作系统编辑器为 vim

 

在 Windows 中,您不得不修改 %ORACLE_HOME%\sqlplus\admin\glogin.sql 的文件内容,并添加下面的行:

 

DEFINE _EDITOR=‘gvim -c "set filetype=sql"‘

 

您也可以在 UNIX 中执行该任务;它将启动 Vim 并对 SQL 文件进行语法突出显示。

 

这样从现在起,当您需要编辑 SQL*Plus 缓冲区的内容时,只需输入 EDIT,就会启动 Vim 编辑器,并具有针对 SQL 文件的语法设置。当您完成编辑后,只需退出 Vim (:wq)。您将返回到 SQL*Plus 命令提示下,并且您可以照常用斜杠命令 /,来运行缓冲区的内容。

 

但是如果您要编辑的是保存的名为 report.sql 的 SQL 脚本,而不是编辑 SQL*Plus 缓冲区,又该怎样做呢?答案很简单:您所需要做的全部工作就是,在 SQL*Plus 提示下输入 EDIT report.sql,Vim 编辑器就会启动。执行想要的更改,退出编辑器,并使用 @ 命令在 SQL*Plus 中运行您的脚本:

 

SQL> @report

 

总结

 

这篇文章描述了流行的 Vim 文本编辑器的功能。它还演示了在 Oracle 环境中使用 Vim 的一些情景,并提出了如何改进您的日常工作的一些建议。

 

由于原始 sql.vim 文件已过时,我对 sql.vim 语法文件作了某些修改,以使其识别 Oracle 特有的 SQL 扩展名和关键字。您可以用修改后的版本(在此下载)— 它只是简单地在原始文件中添加了新的关键字 — 来取代您当前的 sql.vim 文件。

 


David Kalosi 是工作在斯洛伐克共和国布拉迪斯拉发市的 SporDat spol. s r.o. 的一位数据库专家。他使用 Oracle 软件和 UNIX/Linux 系统已经四年有余了。David 还是 Oracle 应用服务器的一位 OCA。

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多