ESS-Emacs23问题:如何在加载R脚本后自动执行一些基本步骤

时间:2010-09-22 04:34:38

标签: emacs emacs23

我使用ESS-Emacs编辑我的R脚本。

每当我加载R脚本时,总是后跟:

  1. C-x 3(我更喜欢这种分裂)
  2. M-x R(打开R)
  3. 有没有办法自动执行步骤1.和2.每次我在终端上输入:

    emacs misc_r_file.r

    只是为了让自己清楚 - 如果我已经在emacs中打开了一个R脚本,我不想要1或2。只有在我打开新的emacs流程时才应执行步骤1和步骤。

    提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

有办法做到这一点吗?当然,这只是编程。

(defvar r-file-loaded-p nil
   "non-nil if an R file has been opened")

(defun maybe-setup-r ()
   (when (not r-file-loaded-p)
       (split-window-horizontally)
       (R)
       (setf r-file-loaded-p t)))

(add-hook 'r-mode-hook #'maybe-setup-r)

为什么不坚持你的Emacs会话呢?

答案 1 :(得分:1)

您可能对FelipeCsaszar的this code感兴趣,它使用Shift-Enter在加载R文件时执行您想要的操作,加上一旦加载后再加一点(如果R正在运行且区域突出显示, shift-enter将区域发送到R进行评估。如果R正在运行且没有区域突出显示,则shift-enter将当前行发送到R.反复按R文件中的shift-enter逐步遍历每一行(发送它到R),跳过注释行。每次评估后,光标也会向下移动到R缓冲区的底部。)

;; Use shift-enter to split window & launch R (if not running), execute highlighted
;; region (if R running & area highlighted), or execute current line
;; (and move to next line, skipping comments). Nice. 
;; See http://www.emacswiki.org/emacs/EmacsSpeaksStatistics,
;; FelipeCsaszar. Adapted to spilit vertically instead of
;; horizontally. 

(setq ess-ask-for-ess-directory nil)
  (setq ess-local-process-name "R")
  (setq ansi-color-for-comint-mode 'filter)
  (setq comint-scroll-to-bottom-on-input t)
  (setq comint-scroll-to-bottom-on-output t)
  (setq comint-move-point-for-output t)
  (defun my-ess-start-R ()
    (interactive)
    (if (not (member "*R*" (mapcar (function buffer-name) (buffer-list))))
      (progn
    (delete-other-windows)
    (setq w1 (selected-window))
    (setq w1name (buffer-name))
    (setq w2 (split-window w1 nil t))
    (R)
    (set-window-buffer w2 "*R*")
    (set-window-buffer w1 w1name))))
  (defun my-ess-eval ()
    (interactive)
    (my-ess-start-R)
    (if (and transient-mark-mode mark-active)
    (call-interactively 'ess-eval-region)
      (call-interactively 'ess-eval-line-and-step)))
  (add-hook 'ess-mode-hook
        '(lambda()
           (local-set-key [(shift return)] 'my-ess-eval)))
  (add-hook 'inferior-ess-mode-hook
        '(lambda()
           (local-set-key [C-up] 'comint-previous-input)
           (local-set-key [C-down] 'comint-next-input)))
  (require 'ess-site)

在这段代码中完成的拆分是您想要的Cx-3 - 我总是忘记在Emacs中水平/垂直分割是从有多少人(包括我)理解它的方向后退,指的是分割线的方向“移入”而不是分裂线本身的方向。