如何仅覆盖eshell上的密钥绑定



我在emacs上使用evil-mode,最近我开始使用eshell,我真的很喜欢如何离开插入模式,在eshell缓冲区上移动以复制内容或其他好东西,但当再次进入插入模式时,它会在光标当前位置执行,我希望当我进入插入模式后,自动将光标移动到提示行(最后一行,行的末尾)。

我所做的是:

(add-hook 'eshell-mode-hook
      (lambda()
         (define-key evil-normal-state-map (kbd "i") (lambda () (interactive) (evil-goto-line) (evil-append-line nil)))))

然而,它在所有其他缓冲区中都应用了这种映射,我只想让它在eshell缓冲区中处于活动状态。

如何定义在eshell中以不同方式工作的密钥绑定

当前接受的答案满足规定的要求,但有两个主要限制:

  1. 它仅在使用i进入插入模式时触发。使用IA或任何自定义函数/键绑定跳到最后一行将需要额外的脚本编写
  2. 如果point已经在最后一行(例如,编辑当前命令时),则无法在当前位置进入插入模式;i有效地反弹到A

第一个限制可以通过先在eshell-mode上挂接,然后在evil-insert-state-entry上挂接来消除。

第二个限制可以通过设置point的位置来解决,首先基于行号,其次基于只读文本属性:

  1. 如果point还不在最后一行,那么它将移动到point-max(它总是读写的)
  2. 否则,如果point处的文本是只读的,则point将移动到当前行中只读文本属性更改的位置

以下代码否定了已接受答案的限制。

(defun move-point-to-writeable-last-line ()
  "Move the point to a non-read-only part of the last line.
If point is not on the last line, move point to the maximum position
in the buffer.  Otherwise if the point is in read-only text, move the
point forward out of the read-only sections."
  (interactive)
  (let* ((curline (line-number-at-pos))
         (endline (line-number-at-pos (point-max))))
    (if (= curline endline)
        (if (not (eobp))
            (let (
                  ;; Get text-properties at the current location
                  (plist (text-properties-at (point)))
                  ;; Record next change in text-properties
                  (next-change
                   (or (next-property-change (point) (current-buffer))
                       (point-max))))
              ;; If current text is read-only, go to where that property changes
              (if (plist-get plist 'read-only)
                  (goto-char next-change))))
      (goto-char (point-max)))))
(defun move-point-on-insert-to-writeable-last-line ()
  "Only edit the current command in insert mode."
  (add-hook 'evil-insert-state-entry-hook
        'move-point-to-writeable-last-line
        nil
        t))
(add-hook 'eshell-mode-hook
      'move-point-on-insert-to-writeable-last-line)

感谢@lawlist为我指明了正确的方向,解决方案就像一样简单

;; Insert at prompt only on eshell
(add-hook 'eshell-mode-hook
      '(lambda ()
         (define-key evil-normal-state-local-map (kbd "i") (lambda () (interactive) (evil-goto-line) (evil-append-line nil)))))

谢谢!

相关内容

  • 没有找到相关文章

最新更新