Eshell
- clear命令清屏,并且只保持屏幕顶端有一行提示符
- c-d直接退出,并且杀死buffer
以前在stackoverflow搜到过,现在找不到了,故来论坛求助,望大神们指点
Eshell
以前在stackoverflow搜到过,现在找不到了,故来论坛求助,望大神们指点
实现了第一个
第二个可以直接exit实现,但是不知道是绑定在哪个函数上,可否指教一下
eshell-delchar-or-maybe-eof这个?
我试试看是不是
没这个函数吧,大神
这个不是eshell自带的嘛(27.1)
(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
清屏/复位:
(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
试一下。
同样的,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))))))
完美解决了,感谢楼上所有帮忙给建议和代码的大神们