正如文档所述,RET将在shell模式下的任何地方comint-send-input。问题是,如果您错误地在任何行上按回车键,而您不在提示符处,它将执行整个随机文本,直到下一个提示符。如何防止这种情况发生?如果在提示中的任意位置点击Enter,将使您进入底部的新提示,那将是很好的。

最佳答案

像这样吗

(defun my-comint-send-input-maybe ()
  "Only `comint-send-input' when point is after the latest prompt.

Otherwise move to the end of the buffer."
  (interactive)
  (let ((proc (get-buffer-process (current-buffer))))
    (if (and proc (>= (point) (marker-position (process-mark proc))))
        (comint-send-input)
      (goto-char (point-max)))))

(with-eval-after-load "comint"
  (define-key shell-mode-map [remap comint-send-input] 'my-comint-send-input-maybe))


您可以将(goto-char (point-max))替换为(comint-copy-old-input)来插入,但不能在新的提示符下发送旧的输入。但这在插入的输入看起来像输出时仍然容易引起问题。

但是,还请注意C-hf comint-send-input中有关comint-get-old-input的注释和链接-这可用于实现自定义逻辑,以建立在调用该过程之前的点时调用comint-send-input时“旧输入”应该是什么标记。

关于emacs - Emacs shell模式:防止RET从任何地方发送输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52206246/

10-15 00:57