RET在下面添加一行,但在Emacs上没有以Matlab模式跳转到它

时间:2015-06-25 02:25:52

标签: emacs elisp

当我在Emacs上使用matlab模式(我使用Aquamacs)时,RET会在下面添加一行,但不会跳转到该行(即,它应该充当C-o)。 RET在其他模式下不会发生这种行为,即在预期的行为,即在下面添加一行并将光标移动到它。

当我在matlab模式下按RET时,我收到此消息

  

错误的类型参数" wholenump -1"

我不知道这是从哪里来的。我已将所有与matlab相关的文件重新安装到.emacs,我查看了.emacs,Preferences.el,customizations.el,并查看了custom-apropos' matlab'的所有选项。我还没找到能给我一些线索的东西。虽然我已经使用emacs几年了,但我不知道任何口齿不清并且可以被认为是菜鸟。有人可以帮我跟踪问题吗?

我使用的是Aquatics 3.2 GNU Emacs 24.4.51.2。我几年前最初运行matlab-mode未知来源,但在尝试解决此问题时,我通过运行https://github.com/pronobis/matlab-modeupdate script升级到最新版本。这对我来说没有解决问题。

正如在this SO chat中发现的那样,某些内容正在将fill-column设置为值-1

fill-column is a variable defined in `C source code'. 
Its value is -1 
Original value was 70 
Local in buffer funfzero.m; global value is the same.

手动将其重新设置为70可以暂时解决问题。但究竟是什么导致它被设置为虚假价值呢?我怎样才能知道这个设置在哪里?

这是调试输出

Debugger entered--Lisp error: (wrong-type-argument wholenump -1)
  move-to-column(-1)
  (save-excursion (move-to-column fill-column) (if (not (bobp)) (forward-char -1)) (if (matlab-cursor-in-string (quote incomplete)) 4 3))
  (if matlab-fill-count-ellipsis-flag (save-excursion (move-to-column fill-column) (if (not (bobp)) (forward-char -1)) (if (matlab-cursor-in-string (quote incomplete)) 4 3)) 0)
  (- fill-column (if matlab-fill-count-ellipsis-flag (save-excursion (move-to-column fill-column) (if (not (bobp)) (forward-char -1)) (if (matlab-cursor-in-string (quote incomplete)) 4 3)) 0))
  (let ((fill-prefix fill-prefix) (fill-column (- fill-column (if matlab-fill-count-ellipsis-flag (save-excursion (move-to-column fill-column) (if (not ...) (forward-char -1)) (if (matlab-cursor-in-string ...) 4 3)) 0)))) (if (> (current-column) fill-column) (cond ((matlab-ltype-comm-ignore) nil) ((or (matlab-ltype-comm) (and (save-excursion (move-to-column fill-column) (matlab-cursor-in-comment)) (matlab-lattr-comm))) (matlab-set-comm-fill-prefix) (do-auto-fill) (matlab-reset-fill-prefix)) ((and (matlab-ltype-code) (not (matlab-lattr-cont)) matlab-fill-code) (let ((m (make-marker))) (move-marker m (point)) (set-marker-insertion-type m t) (if (not (matlab-find-convenient-line-break)) nil (if (not ...) (progn ... ... ...) (if matlab-fill-strings-flag ...))) (goto-char m))))))
  matlab-auto-fill()
  self-insert-command(1)
  newline()
  matlab-plain-ret()
  funcall(matlab-plain-ret)
  matlab-return()
  call-interactively(matlab-return nil nil)
  command-execute(matlab-return)

2 个答案:

答案 0 :(得分:1)

虽然这可能无法找到导致fill-column设置为-1的任何内容的根,但一个简单的解决方法是将set-fill-column的调用添加到matlab-mode-hook:< / p>

(add-hook 'matlab-mode-hook
          (lambda ()
            (set-fill-column 70)))

将此添加到init.elfill-column后,matlab-mode将自动设为70。

答案 1 :(得分:1)

总是这样吗?

从你的调试器日志中,看起来像matlab-mode将RET绑定到它自己的matlab-return,其目的看起来像auto-pretty-indent。

在该代码中设置了填充列。在(let ...)行。

所以,看起来,它是代码的逻辑错误。

一个简单的解决方法就是将换行符绑定到RET,如

(defun my-matlab-mode-stuff ()
  (local-set-key (kbd "RET") 'newline))
(add-hook 'matlab-mode-hook 'my-matlab-mode-stuff)

您可能会将&#39;换行符更改为&mat; -lab-ret,因为这似乎只是插入返回的方法。