6

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

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

像 make 一样,snakemake 对缩进很严格(实际的制表符“\t”字符,而不是当键入 TAB 时 emacs 的默认行为方式)。当我键入“Cq TAB”时,它会在缓冲区中放置一个真正的制表符:这可行,我在基本模式下使用 Snakefile 进行了尝试,它运行完美。因此,为了避免每次在此模式下需要 TAB 时都键入“Cq TAB”,我想对蛇模式进行的第一个添加是将 TAB 键重新绑定到“Cq TAB”(或类似的东西)。所以我仔细阅读了emacs手册并尝试了:

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

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

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

总而言之,在创建“蛇模式”时对基本模式的这两个简单修改以及在文件名是“蛇文件”时调用蛇模式的方法就是我所寻找的,但我已经花了几个几个小时阅读 emacs 手册并进行一些谷歌搜索,似乎我还没有接近。这很简单,我很确定这是可能的;有什么建议吗?

谢谢

默里

4

4 回答 4

5

你的祈祷得到了回应:

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

我对此很开心。

可以从melpaas获取snakemake-mode

于 2016-03-31T10:58:46.127 回答
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

我敢肯定,这是多么优雅,值得商榷。而且这只是为蛇形制作适当模式的旅程的开始(它会突出显示蛇形制作的特定单词,如“规则”和“输出:”等)

于 2013-06-17T14:47:11.103 回答
1

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

缩进当前行的函数。该函数将在没有参数的情况下被调用。如果在不能自动缩进的地方调用它(例如在字符串中),该函数应该简单地返回“noindent”。只需设置此功能即可使 TAB 适当缩进。 除非确实需要,否则不要重新绑定 TAB。

无论如何它都不起作用,因为您无法将键绑定绑定到其他键绑定。

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

于 2013-06-17T07:47:16.770 回答
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 的答案。

于 2013-06-17T07:34:41.570 回答