假设我在单个缓冲区中有多种语言的代码,我可以根据相应的语言使用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)
将SQL部分突出显示为SQL语法会很棒,而文件的其余部分则以Python突出显示。
这在Emacs中可行吗?有什么方法可以向Emacs暗示要使用哪种荧光笔,也许可以利用这些评论?
答案 0 :(得分:11)
当我在C中使用一些SQL时,我有一个使用MMM模式的系统;将所需语句包装在一组注释中,
/* SQL */
和
/* #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)
答案 1 :(得分:0)
这是我最近的工作方式:
--
开头,以免干扰SQL本身。 (mmm-ify-by-class 'python-sql)
。必须先启用mmm-mode。 Orpheus的解决方案提到了这一点,但我一开始并没有意识到他们在说什么。