[个人渣翻]卢卡斯: 在Emacs中用pgFormatter格式化SQL代码

卢卡斯: 在Emacs中用pgFormatter格式化SQL代码

pgFormatter是Perl写出来的称手工具,用于SQL语句的解析与编排.
尽管名称如此,他事实上可以用于所有的SQL代码(而不用考虑具体的RMDBS),它支持自SQL-92到SQL-2011的所有标准,并增添了PostgreSQL的拓展语法.
作为一名Emacs沉迷者,我将会向你阐述将pgFormatter嵌入Emacs中的方法,我将会展现一段小而混乱的代码.
不过,基于Emacs自身的实现机制,我们并不需要向Emacs填入特定的代码,现在,稍等片刻,我将会向你展示.

在Emacs中使用pgFormatter,最简便的方法

Emacs允许用户运行一个区域或是一个buffer中的shell指令,只需要使用 M-|
除此之外,使用共同的前缀 C-u 同样也可以替换掉区域或是缓冲中的shell.
这意味着,在使用Emacs的是否,只需要借助 C-u N-| pg_format 就可以简单的格式化SQL代码
在这里 pg_format 就是 pgFormatter的可执行名称(在Rocky Linux中,这确实如此)

一个Lisp风格的使用途径

我使用了一段简单但是丑陋的Lisp代码,它可以装载进入Emacs进而使得pgFormatter的运用变得更加便捷

(defun pgformatter-on-region () "A function to invoke pgFormatter as an external program." (interactive) (let ((b (if mark-active (min (point) (mark)) (point-min))) (e (if mark-active (max (point) (mark)) (point-max))) (pgfrm "/usr/bin/pg_format" ) ) (shell-command-on-region b e pgfrm (current-buffer) 1)) )

这段代码之中定义了一个被称为"pgformatter-or-region"的交互函数(M-x可以直接调用的函数),这函数定义了三个变量:
b SQL区域的开始
e SQL区域的结束
pgfrm 代表了执行程序的路径
当区域活跃的时候,这个函数涵盖整个区域,否则,它将运用于整个buffer.
在最后,函数使用shell-command-on-region函数操作当前的buffer,最后一个参数,1负责输出并提交整个区域的命令输出.
为了执行这一格式化进程,我需要在一个区域之中直接使用 M-x pgformatter-on-region,与之同时,我也可以将这个函数与某个快捷键绑定,作为一个案例:

(global-set-key (kbd "C-i") 'pgformatter-on-region)


原文来自于 https://planet.postgresql.org/

6 个赞