Eshell 如何实现清屏和退出?

Eshell

  1. clear命令清屏,并且只保持屏幕顶端有一行提示符
  2. c-d直接退出,并且杀死buffer

以前在stackoverflow搜到过,现在找不到了,故来论坛求助,望大神们指点

实现了第一个

第二个可以直接exit实现,但是不知道是绑定在哪个函数上,可否指教一下

eshell-delchar-or-maybe-eof这个?

我试试看是不是

没这个函数吧,大神

这个不是eshell自带的嘛(27.1) Screenshot from 2020-08-28 20-59-51

(define-key eshell-mode-map (kbd “C-d”) 'eshell-delchar-or-maybe-eof)

这个报错了

(define-key eshell-mode-map (kbd "C-d")
  #'(lambda () (interactive)
      (insert "exit")
      (eshell-send-input)))

建议用楼下的,我试了一下效果不错

从 doom 那边抄过来的

C-d 在有输入的时候行为是删除字符,而当输入为空的时候则是退出 shell

2 个赞

清屏/复位:

(defun clean-eshell-buffer ()
  "Clean the eshell buffer."
  (interactive)
  (when (eq major-mode 'eshell-mode)
    (let ((inhibit-read-only t))
      (erase-buffer)
      (eshell-reset))))

退出:kill-this-buffer

原来doom做么这么多工作。

报错(void-vareable eshell-mode-map)

我添加了(require 'eshell)也是一样

清屏复位里面要去掉when那一行,不然没有效果,不过去掉之后,使用clear屏幕最上方会出现两行提示符

emacs -Q 试一下。

1 个赞

同样的,clear之后停在最底端 27.1 for windows

我用的是假 Emacs ?

是不是,clear命令没有绑定到(defun clean-eshell-buffer这个函数

加上 with-eval-after-load 就行了,像下面这样

(with-eval-after-load 'esh-mode
  (define-key eshell-mode-map (kbd "C-d")
    #'(lambda (arg)
        "Delete a character or quit eshell if there's nothing to delete."
        (interactive "p")
        (if (and (eolp) (looking-back eshell-prompt-regexp nil))
            (eshell-life-is-too-much)
          (delete-char arg)))))

看着像 eshell-mode-map 被设置成了 nil 了,我特地查看了一下俩边的代码,运气比较好,代码正好是在 27.1 最新的 commit 被改了。代码位于 esh-mode.el 里,却必须在 eshell-mode 加载后才会生效,被设置成了一个 local 变量。

你可以试试下面这个,应该就没有问题了。

(add-hook 'eshell-mode-hook
          #'(lambda ()
              (define-key eshell-mode-map (kbd "C-d")
                #'(lambda (arg)
                    "Delete a character or quit eshell if there's nothing to delete."
                    (interactive "p")
                    (if (and (eolp) (looking-back eshell-prompt-regexp nil))
                        (eshell-life-is-too-much)
                      (delete-char arg))))))
1 个赞

完美解决了,感谢楼上所有帮忙给建议和代码的大神们