Emacs中的Ruby模式是否有用于编译/运行的快捷键?

4
我对Emacs有一些了解,因为我用它写毕业论文时使用了AUCTex。
然而,这次我尝试编写一些简单的Ruby程序,主要是为了学习,我在Google上搜索了Ruby in Emacs,但没有找到我想要的内容。
根据我目前所了解的,我知道我使用的Emacs(23.3.5)具有内置的ruby-mode,应该支持基本的语法高亮,自动缩进等。但是关于调试/运行的快捷键,是否有类似于Mode Compile的东西呢?

这里没有问题。在Emacs中,将“mode-compile”绑定到键上的方法与其他键绑定相同。每个具有“.rb”扩展名的文件都会进入“ruby-mode”。它像其他模式一样使用“M-x describe-mode”进行文档记录。有无数的Emacs教程可以通过您喜欢的搜索引擎获得并访问。 - pmr
请将这些问题具体清晰地分开,以便可以逐个解决。您认为缺少哪个键?按下此键时,您希望发生什么?您自己有做出哪些努力来解决此问题?有什么阻碍了您的努力? 换句话说,不要让那些试图帮助您的人做所有的工作。 - event_jr
@evernt_jr,我对Emacs并不是很熟悉,所以我不知道ruby-mode具体有什么作用?它是否可以使用'ruby -w my_program.rb'来编译/运行代码?如果可以,应该怎么做呢? - Paul L
@pmr,我确实提到了我已经谷歌搜索过了,并且搜索了ruby-mode教程、emacs ruby教程等等,然后才来问这个问题。基本上我只是想要一个指针,就像'M- describe-mode'一样。因为我发现在ruby-mode中,似乎没有一个快捷键可以用于编译/运行,我错过了ruby-mode的某个功能吗?还是有其他的方法?如果我错过了ruby-mode的某个功能,那么如何找出ruby-mode能做什么? - Paul L
3个回答

4
我建议使用quickrun.el,这是由我维护的。
quickrun.el 是一个用于执行编辑缓冲区的扩展程序。它支持许多编程语言和标记语言,当然也支持 Ruby。
您可以通过以下 URL 下载 quickrun.el。

https://raw.github.com/syohex/emacs-quickrun/master/quickrun.el

如果您想要添加quickrun.el到您的配置文件中,只需按照以下设置进行操作并进行评估(或重新启动Emacs)即可。

(add-to-list 'load-path "~/.emacs.d/elisp") ;; If you install quickrun.el to ~/.emacs.d/elisp
(require 'quickrun)

现在您可以使用以下命令来执行当前缓冲区。
M-x quickrun

您可以使用编译当前缓冲区(而不是执行)。
M-x quickrun-compile-only

如果您经常使用quickrun命令,您应该分配键绑定,如下所示。
(global-set-key (kbd "<f7>") 'quickrun)
(global-set-key (kbd "<f8>") 'quickrun-compile-only)

请查看 GitHub页面,如果您想了解有关quickrun.el的更多信息。
谢谢。

1
谢谢,我现在正在使用quickrun。我认为它更适合我的使用,因为安装/配置和使用都相对简单。而且它的工作方式符合我的期望:在输入命令后编译/运行,无需任何额外步骤即可查看结果。 - Paul L
感谢 syohex 提供如此棒的软件包! - Brandon

3
我建议使用inf-ruby在Emacs中获取一个IRB会话。然后,您可以使用例如C-c C-l来调用inf-ruby-load-file将您的缓冲区加载到IRB会话中。
此外,您可能还想使用Flymake针对ruby -c不断进行语法检查来检查您的缓冲区。以下是我从emacs-starter-kit中获取的3个函数:
(defun flymake-ruby-init ()
  (let* ((temp-file (flymake-init-create-temp-buffer-copy
                     'flymake-create-temp-inplace))
         (local-file (file-relative-name
                      temp-file
                      (file-name-directory buffer-file-name))))
    ;; Invoke ruby with '-c' to get syntax checking
    (list "ruby" (list "-c" local-file))))

(defun flymake-ruby-enable ()
  (when (and buffer-file-name
             (file-writable-p
              (file-name-directory buffer-file-name))
             (file-writable-p buffer-file-name)
             (if (fboundp 'tramp-list-remote-buffers)
                 (not (subsetp
                       (list (current-buffer))
                       (tramp-list-remote-buffers)))
               t))
    (local-set-key (kbd "C-c d")
                   'flymake-display-err-menu-for-current-line)
    (flymake-mode t)))

(eval-after-load 'ruby-mode
  '(progn
     (require 'flymake)
     (push '(".+\\.rb$" flymake-ruby-init) flymake-allowed-file-name-masks)
     (push '("Rakefile$" flymake-ruby-init) flymake-allowed-file-name-masks)
     (push '("^\\(.*\\):\\([0-9]+\\): \\(.*\\)$" 1 2 nil 3)
           flymake-err-line-patterns)
     (add-hook 'ruby-mode-hook 'flymake-ruby-enable)))

此外,我使用以下函数来显示光标处的Flymake错误:
;; Flymake errors at point from Dave Love on gnu.emacs.help:
(defun my-flymake-show-help ()
   (when (get-char-property (point) 'flymake-overlay)
     (let ((help (get-char-property (point) 'help-echo)))
       (if help (message "%s" help)))))

(add-hook 'post-command-hook 'my-flymake-show-help)

所有这些加在一起,使得Ruby在Emacs下的使用非常不错。

我正在努力让inf-ruby正常工作。我刚刚发现了ELPA并安装了inf-ruby,那我还需要做什么吗:;; 如果您正在手动安装,则需要执行以下操作: ;; * 在某个负载路径上放置文件(可能是~/.emacs.d) ;; * 将以下行添加到.emacs文件中: ;; (autoload 'inf-ruby "inf-ruby" "Run an inferior Ruby process" t) ;; (autoload 'inf-ruby-keys "inf-ruby" "" t) ;; (eval-after-load 'ruby-mode ;; '(add-hook 'ruby-mode-hook 'inf-ruby-keys)) 否则似乎我需要使用'C-c C-s'先加载inf-ruby以便使用'C-c C-l'。 - Paul L
它应该在你的加载路径中,只需在刮擦缓冲区中尝试一下,并查看ruby-mode-hook等内容,以查看是否仍然需要设置某些内容。 - Michael Kohl
IRB的性能会像Ruby在shell中一样好/慢或更慢吗? - Paul L
已安装inf-ruby,并且我仍在测试它。看起来很奇怪,在执行“inf-ruby-load-file”之后,我必须执行“ruby-switch-to-inf”才能看到irb结果? - Paul L

0

您可以通过 M-x compile 运行 Ruby 程序,并使用 "ruby -w your_program" 命令。

输出结果类似于编译输出,因此您可以单击错误以跳转到相应的行。

看起来 mode-compile 也支持 ruby-mode。


F12的效果甚至比'M-x compile'更好,但我正在寻找类似于mode-compile的功能。mode-compile的问题在于它似乎已经不再维护了。 - Paul L
抱歉,我刚才意识到 F12 是我自己定义的快捷键。但我的观点仍然是,我希望能够在不需要输入文件名的情况下运行/编译我的程序。我知道使用“M-x compile”实际上并不那么糟糕,因为它会自动完成大部分时间。我提出这些问题主要是为了考虑我的选择,并看看其他人在使用什么,所以感谢您的回答。这确实是一个有效的观点。我可以看到这种方法的简单性。 - Paul L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接