在Emacs中使用SQL查询编写PHP

时间:2014-06-24 22:18:00

标签: php mysql emacs

我应该在Emacs中使用什么来开发带有SQL查询的PHP文件?

缩进缓冲区时,代码应如下所示:

<?php
$query = "
    SELECT
        id,
        name
    FROM 
        products
    WHERE 
        id > 12"
?>

在网络模式和php模式下,它看起来像这样:

<?php 
$query = "
SELECT
id,
name
FROM
products
WHERE
id > 12"
?>

如果这是不可能的,一种替代方法是让它启用手动缩进(使用 TAB Shift TAB ,像在Sublime和其他编辑器中那样在PHP代码中使用多行字符串时。我该怎么做?

3 个答案:

答案 0 :(得分:10)

当缓冲区缩进时自动执行此操作将非常困难,您可以尝试多种主要模式,但这并不理想。

一种解决方案是编写一个函数来格式化光标下的sql,然后在编写完查询字符串后手动运行该命令。

此示例需要两个包:expand-regionsql-indent,两者都可以在MELPA上下载。

如果你安装了这个软件包,这个函数会在一定程度上格式化SQL,这也会根据周围代码的深度处理整个SQL字符串的缩进,这与评论中的解决方案不同。

(defun sql-indent-string ()
  "Indents the string under the cursor as SQL."
  (interactive)
  (save-excursion
    (er/mark-inside-quotes)
    (let* ((text (buffer-substring-no-properties (region-beginning) (region-end)))
           (pos (region-beginning))
           (column (progn (goto-char pos) (current-column)))
           (formatted-text (with-temp-buffer
                             (insert text)
                             (delete-trailing-whitespace)
                             (sql-indent-buffer)
                             (replace-string "\n" (concat "\n" (make-string column (string-to-char " "))) nil (point-min) (point-max))
                             (buffer-string))))
      (delete-region (region-beginning) (region-end))
      (goto-char pos)
      (insert formatted-text))))

该函数的工作原理是复制光标下的字符串并将其移动到临时缓冲区,其中sql-indent将格式化它,然后返回原始缓冲区并用新字符串替换旧字符串。它很实用但不漂亮。

enter image description here

答案 1 :(得分:2)

Web模式的最后一个版本(9.0.84)(在github上可用)在块字符串中提供本机sql缩进。

答案 2 :(得分:1)

Emacs不能很好地使用PHP处理SQL。有一个扩展你可以得到here,据说只对SQL有帮助,所以我不确定它是否会按照你想要的方式运行PHP代码。还有其他使用Emacs的替代方案,我强烈建议。