【问题标题】:ESS-Emacs23 question: How to automate a few basic steps after loading an R scriptESS-Emacs23 问题:如何在加载 R 脚本后自动化几个基本步骤
【发布时间】:2010-09-22 04:34:38
【问题描述】:

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

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

  1. C-x 3(我更喜欢这种拆分方式)
  2. M-x R(打开 R)

每次我在终端上键入时,有没有办法自动执行步骤 1. 和 2.:

emacs misc_r_file.r

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

提前感谢您的帮助。

【问题讨论】:

    标签: emacs emacs23


    【解决方案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 会话呢?

    【讨论】:

    • 非常感谢您的回答。
    【解决方案2】:

    您可能对 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)
    

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

    【讨论】:

    • 非常感谢!我现在在我的 .emacs 中有它!
    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2013-11-26
    • 1970-01-01
    • 2011-05-10
    • 2020-03-05
    相关资源
    最近更新 更多