【问题标题】:Writing PHP with SQL queries in Emacs在 Emacs 中使用 SQL 查询编写 PHP
【发布时间】:2014-09-17 06:24:05
【问题描述】:

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

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

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

在 web 模式和 php 模式下它看起来像这样:

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

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

【问题讨论】:

标签: php mysql emacs


【解决方案1】:

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

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

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

如果您安装了软件包,此功能将在该点格式化 SQL,这也处理根据其周围代码的深度缩进整个 SQL 字符串,这与 cmets 中的解决方案不同。

(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 将对其进行格式化的临时缓冲区,然后返回原始缓冲区并用新字符串替换旧字符串。实用但不美观。

【讨论】:

  • (感谢 Jordon Biondo!但是,我想添加从 SQLup 调用函数 `sqlup-capitalize-keywords-in-region`。当我在函数中添加 sqlup-capitalize-keywords-in-region 时,以及从 sql 字符串调用它,我得到一个空结果。有什么提示吗?
  • 你能把它变成次要模式吗?
【解决方案2】:

最后一个版本 (9.0.84) 的 web 模式(可在 github 获得)在块字符串中提供原生 sql 缩进。

【讨论】:

  • 我无法让它与问题中的代码(第二部分)一起使用。我应该能够在第三行,按TAB 并缩进吗?
  • SELECT 应该在 " 而且你确定你有最新版本吗?
  • 太棒了!它适用于示例,但即使SELECT 在新行上,我也可以缩进它吗?此外,在JOIN 中包含SELECT 时似乎存在错误。 INSERT 查询也不缩进。这是一个很好的开始,但似乎需要做更多的工作。
  • 我添加了突出显示和与插入、更新、删除的兼容性。我不打算在新行上进行缩进。如果您有其他要求和问题,请在 github 上打开一个问题
【解决方案3】:

Emacs 不能很好地处理带有 PHP 的 SQL。您可以获得here 的扩展,据说它只对SQL 有帮助,所以我不确定它是否会按照您希望的方式处理PHP 代码。不过,还有其他使用 Emacs 的替代方法,我强烈建议这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多