免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1642 | 回复: 0
打印 上一主题 下一主题

Vim 与 SQL*Plus 结合使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-03 14:45 |只看该作者 |倒序浏览

在 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.vim.org/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。同样,5rH 将 Hello 变为 HHHHH。要将一个字符更改为换行符,可输入 r。
R 命令使 Vim 进入取代模式。在该模式下,Vim 会用您输入的内容取代光标下方的字符。您可以用与退出插入模式相同的方式退出取代模式:通过按下 ESC 键。
替换命令
替换命令—%s—是 Vim 编辑器中功能最强大的命令之一。它就像执行全局搜索和取代一样。如果您用过 Linux 的 sed 编辑器,您就会熟悉该命令的语法。基本上,替换的工作方式如下:
: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 DECLAREBEGINEND;/
"创建一个空的匿名块并捕获异常
abbr PANBLEX DECLAREBEGINEXCEPTION WHEN othersTHENEND;/
"为 FOR LOOP 创建一个模板
abbr PFL FOR cc IN col.FIRST..col.LASTLOOPEND LOOP;
"创建一个空函数
abbr PCRFN CREATE OR REPLACE FUNCTION ASBEGINEND;/
参照示例,您可以定义自己的缩写词。注意, 字符序列表示一个新行。Vim 将把该序列解释为一个回车符并创建一个新行。为了执行该操作,Vim 使用键符号引用功能键;例如:
— 空格
— tab
— 回车
— 退出
— 行尾
您可以在 Vim 文档中找到其他键符号。
键映射
Vim 编辑器的另一个强大功能是键映射,用于更改键入的键的含义。使用键映射,您可以自定义编辑器的行为以满足您的需要。常见的做法是,把命令序列映射到功能键上。有一组命令可用来定义、修改、删除和列出键映射。
要列出所有定义的键映射,可键入 :map;要定义一个新的映射,可键入 :map  ;要删除一个映射,可键入 :unmap 。(这些只是基础性的知识;您可以在 Vim 文档中获知更多信息)。
例如,您可以定义如下映射,将当前的 UNIX 时间戳追加到光标所在位置的后面。该映射使用 Vim 的内置函数 localtime()。
:map  a=localtime()
使用键映射您甚至还可以调用一个外部程序,正如您在下面的示例中所能看到的那样。
:map  :!ls -lFa
由于您实际上可以把任意的命令序列映射到一个键,因此您可以把键映射看作一种小型的宏。您应该专注于您频繁用到的命令序列。
如同缩写词一样,您可以把您的键映射存储在 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
    " Modified By:David Kalosi
    " 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
    由于 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 "-\=\"
    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
    else
    command -nargs=+ HiLink hi def link
    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 编辑命令,如 APPEND、CHANGE 和 DEL,来编辑 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
    总结

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/27567/showart_1358370.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP