Emacs中的多语言语法高亮

8

假设我在一个缓冲区里有来自多种编程语言的代码,那么能否让emacs根据每段代码对应的语言来进行语法高亮?

比如下面这段代码是python脚本的一部分,但它包含了SQL代码:

import psycopg2 as pg
import pandas.io.sql as psql

# Some SQL code:
my_query ='''
select count(distinct s.object_uid) 
from dx.dx_segment as s;
'''
# end of SQL code

dataframe = psql.frame_query(my_query, connection)

在Emacs中是否可以仅将文件中除SQL部分以外的其他内容使用Python语法高亮,而将SQL部分以SQL语法高亮呈现?是否可以通过注释提示Emacs使用哪个高亮器来实现这一点?

1
对于任何寻找选项的人,可以在http://www.emacswiki.org/emacs/MultipleModes上进行交叉引用。 - phils
2个回答

11
Great! How can I assist you?
/* SQL */ 

and

/* #SQL */

以下内容将为我提供SQL语法高亮显示:
 (require 'mmm-mode)
 (set-face-background 'mmm-default-submode-face nil)

 (mmm-add-classes
  '((embedded-sql
     :submode sql-mode
     :front "/* SQL */"
     :back "/* #SQL */")))

 (mmm-add-mode-ext-class 'c-mode "*.c" 'c-sql)
 (setq mmm-never-modes
               (append '(ediff-mode) '(text-mode) mmm-never-modes))

我可以使用mmm-ify-by-class来应用c-sql类 - 也许你可以在Python中做类似的事情?对我来说,下面的lisp允许Emacs将示例Python中的示例SQL字符串视为SQL(浅灰色背景表示MMM模式处于活动状态)(已修改以允许单行语句)。
(require 'mmm-mode)

(mmm-add-classes
 '((python-sql
    :submode sql-mode
    :face mmm-code-submode-face
    :front "# SQL\\(\n\\|\t\\)*\\(\[ -_A-Z0-9\]+\\)\\(\[ =\]\\)\\(\"\"\"\\|'''\\)"
    :back "\\(\"\"\"\\|'''\\)\\( \\|\t\\|\n\\)*\\# /SQL")))

(mmm-add-mode-ext-class 'python-mode "*.py" 'python-sql)

谢谢 @Orpheus。如果我想将代码改成 Python + SQL 的组合,我猜我可以用 # /* SQL */# /* #SQL */ 来包裹我的 SQL 代码行,因为 Python 的注释是以 # 开头的。除了你的示例中的这些内容,还有什么需要我修改以适应 Python 呢?(mmm-add-mode-ext-class 'c-mode "*.c" 'c-sql) 这一行告诉 mmm-mode 做了什么呢? - Amelio Vazquez-Reina
1
标签值的选择只是为了不太可能用于其他目的,并遵循语言规则 - 在Python的情况下,可能是# SQL# /SQL的组合? mmm-add-mode-ext-class仅意味着解析与*.c正则表达式匹配的任何文件并应用c-mode主模式和用户定义的c-sql模式(有关说明,请尝试C-h f mmm-add-mode-ext-class;希望这有所帮助。 - Orpheus
2
谢谢 - 我无法让它工作。我正在使用Emacs 24.3,最新版本的python-mode(刚从存储库中拉取)和来自mmm-mode的最新版本(通过MELPA进行包安装,版本为20140211)。有没有想法如何调试问题? - Amelio Vazquez-Reina

0

以下是我最近的解决方法:

  1. 在 SQL 字符串变量中指定标签--否则 python-mode 将把它视为一个字符串并相应地进行格式化。
  2. 这意味着标签应该以 -- 开头,以避免干扰 SQL 本身。
  3. 在我想要突出显示的 SQL 区域内运行 (mmm-ify-by-class 'python-sql)。在执行此操作之前必须启用 mmm-mode。Orpheus 的解决方案提到了这一点,但我起初没有意识到他们在说什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接