emama模式为snakemake?

时间:2013-06-15 19:08:20

标签: python emacs makefile snakemake

snakemake是一种类似python的make替代品,它更倾向于工作流而不是编译。它非常好,但也很新,我似乎无法在Emacs中找到它的模式。我只想要一些非常简单的东西:从基本模式的一个非常轻微的修改,所以我在阅读emacs手册,我在init.el中启动了以下内容:

(define-derived-mode snake-mode fundamental-mode
   ...
)

和make一样,snakemake对缩进很严格(实际制表符“\ t”字符,而不是默认情况下emacs在TAB类型时的行为方式)。当我改为键入“C-q TAB”时,它会在缓冲区中放置一个真正的制表符:这是有效的,我在基本模式下使用Snakefile尝试它并且它运行得很好。因此,为了避免每次在这种模式下输入TAB时键入“C-q TAB”,我想对snake模式进行的第一个添加是将TAB键重新绑定为“C-q TAB”(或类似的东西)。所以我仔细阅读了emacs手册并尝试了:

(define-derived-mode snake-mode fundamental-mode
  (global-set-key (kbd "\t") (kbd "C-q \t"))
  ...
)

但是这个和其他替代方案都不起作用...也许不像建议的做法那样重新绑定标准键,如TAB键?

我想要的蛇模式的另一个补充是它根据python强调语法(但有任何python行为,例如,python缩进行为)

总而言之,如果文件名是“Snakefile”,那么在创建“蛇形模式”时只需对基本模式进行这两个简单的修改,并且还有一种方法也可以调用snake模式,但我是在寻找已经花了几个小时阅读emacs手册和做一些谷歌搜索,似乎我甚至没有关闭。这很简单,我很确定它是可能的;有什么建议吗?

由于

默里

4 个答案:

答案 0 :(得分:4)

以下(有点优雅,我认为......至少它是短暂的)kludge现在可以做到这一点。它确实做了我要求的两件事,即(1)重新绑定TAB键(以一种很好的方式),以及(2)根据python进行语法高亮(加上它仅在调用文件时进入此模式) “Snakefile”,这很好,因此这回答了我的问题

; snake-mode
(add-to-list 'auto-mode-alist '("Snakefile" . snake-mode))

(defun insert-tab ()
  (interactive)
  (insert "     ")) ; a "real" tab, i.e., what "C-q \t" would give

(define-minor-mode snake-mode
  "Snakemake."
  :lighter " snake-make"
     (python-mode)
     (setq indent-line-function 'insert-tab)
)

; how to hard-code "\t" to a "real" tab (not recommended)
; (global-set-key "\t" `insert-tab)

; end snake-mode

这是多么优雅,我敢肯定,有争议。并且这只是一个关于蛇皮的正确模式的旅程的开始(这突出了像“规则”和“输出:”等蛇形特定的单词等。)

答案 1 :(得分:4)

你的祈祷得到了回答:

https://github.com/kyleam/snakemake-mode

我很高兴。

可以melpa作为snakemake-mode获得。

答案 2 :(得分:1)

define-derived-mode宏自动提供以其定义的模式命名的键映射。你可以和define-key一起使用它来使 TAB 键只需插入一个这样的标签:

(define-derived-mode snake-mode fundamental-mode "Snake"
  "A mode for Python's snakemake."
  (define-key snake-mode-map "\t" 'self-insert-command))

或者,您可以设置模式的缩进机制,以便在适当的时候通过在行的开头插入(单个)TAB来智能地缩进行。这样你就不必重新绑定 TAB ,虽然当然要正确实现智能缩进比简单地重新绑定密钥要困难得多。有关更多信息,请参阅lunaryorn的答案。

答案 3 :(得分:1)

不要这样做。这不是主要模式应该如何处理缩进。他们不应该重新绑定TAB,请参阅C-h v indent-line-function

  

缩进当前行的功能。   将不带参数调用此函数。   如果它被称为无法自动缩进的地方   (例如在一个字符串中),该函数应该只返回`noindent'。   设置此功能是您正确缩放TAB所需的全部功能。   除非确实需要,否则不要重新绑定TAB。

无论如何它都无法工作,因为你无法将键绑定绑定到其他键绑定。

相反,在模式函数中将indent-tabs-mode设置为t,以使Emacs使用制表符进行缩进,并将indent-line-function本地缓冲区设置为根据以下内容适当缩进的函数语言规则。显然,你必须自己编写这个函数。