2013-06-02 133 views
1

我正在尝试为ESS设置一些密钥绑定。我读了一个办法是:Emacs ESS密钥绑定

(eval-after-load "ess-mode" 
    '(define-key ess-mode-map (kbd "<f5>") 'myfunc)) 

但是,这只能由<<>>@划定的代码块中。

另一个问题是,我想使用相同的密钥既为普通的LaTeX模式(一个.tex文件)和LaTeX作为一部分Noweb(一个.rnw文件),所以我不能只是定义键两次适用于LaTeX模式和ESS模式。

虽然有LaTeX-mode-hook,但我没有看到类似`ess-noweb-mode-hook的东西。

回答

1

经过一些试验和错误,我找到了答案。

如果我们只在一个LaTeX缓冲区中,这是真的:(and (equal (symbol-name major-mode) "latex-mode") (not ess-noweb-mode)))

如果我们在ESS缓冲区的块外,这是真的:ess-noweb-mode

您可能对以下便利功能感兴趣。

;Check ESS related modes 
(defun is-pure-latex() 
    "The buffer is in LaTeX mode, but not in ESS mode." 
    (and (equal (symbol-name major-mode) "latex-mode") (not ess-noweb-mode))) 

(defun is-ess() 
    "The buffer is in ESS mode." 
    ess-noweb-mode) 

(defun is-ess-doc() 
    "The buffer is in ESS mode and insertion point is outside a chunk." 
    (and ess-noweb-mode (equal (symbol-name major-mode) "latex-mode"))) 

(defun is-ess-chunk() 
    "The buffer is in ESS mode an insertion point is inside a chunk." 
    (equal (symbol-name major-mode) "ess-mode")) 

(defun is-ess-inf() 
    "The buffer is in inferior ESS mode" 
    (equal (symbol-name major-mode) "inferior-ess-mode")) 
2

ess-noweb模式只是一个包装,它会在相应的块中加载latex-mode和R-mode。所以如果你在latex-mode-map中定义一个快捷方式,它应该也可以在.rnw缓冲区中使用。

+0

应该有一种方法来区分.rnw缓冲区的非块模式和.tex缓冲区。 – antonio