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

ESS-Emacs23问题:如何在加载R脚本后自动执行一些基本步骤,emacs,emacs23,Emacs,Emacs23,我使用ESS Emacs编辑我的R脚本 每当我加载R脚本时,后面总是跟着: C-x 3(我更喜欢这种分割) M-x R(R) 是否有一种自动化步骤1的方法。二,。每次我在终端上键入: emacs misc_r_file.r 我只是想澄清一下——如果我已经在emacs中打开了一个R脚本,我不想要1或2。只有当我打开一个新的emacs进程时,才应该执行步骤1和2 提前感谢您的帮助。有什么方法可以做到这一点吗?当然,这只是编程 (defvar r-file-loaded-p nil "non-n

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

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

  • C-x 3(我更喜欢这种分割)
  • M-x R(R)
  • 是否有一种自动化步骤1的方法。二,。每次我在终端上键入:

    emacs misc_r_file.r

    我只是想澄清一下——如果我已经在emacs中打开了一个R脚本,我不想要1或2。只有当我打开一个新的emacs进程时,才应该执行步骤1和2


    提前感谢您的帮助。

    有什么方法可以做到这一点吗?当然,这只是编程

    (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会话呢?

    您可能会对FelipeCsaszar感兴趣,它使用Shift-Enter在加载R文件时执行您想要的操作,并且在加载后再执行一些操作(如果R正在运行且某个区域高亮显示,则shift-enter会将该区域发送到R以进行评估。如果R正在运行且未高亮显示任何区域,则shift-enter会将当前行发送到R。在R文件中反复按shift-enter键,逐步完成每一行(将其发送到R),跳过注释行。每次求值后,光标也会下移到R缓冲区的底部。)


    在这段代码中所做的分割就是你想要的C-x-3——我总是忘记,在Emacs中,水平/垂直分割是从有多少人(包括我)理解它向后的,指的是分割线“移入”的方向从分割线本身的方向开始,而不是从分割线本身的方向开始。

    非常感谢!我现在在.emacs中找到了它!非常感谢您的回答。
    ;; 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)