自带的dired,在当前buffer打开目录的问题

dired,设置在当前buffer打开目录和文件,回车没问题,但是鼠标的话,因为鼠标位置和光标位置不在一起,所以鼠标点到的位置,打开的位置是错的,如图

dev_init 是 键盘光标,golang 是鼠标位置 从结果看,鼠标点击打开的目录是错的

代码如下

; 在当前窗口打开
(defun custom-dired-setting ()
  (put 'dired-find-alternate-file 'disabled nil)
  (define-key dired-mode-map (kbd "RET") 'dired-find-alternate-file)
  (define-key dired-mode-map (kbd "M-<left>") (lambda ()
    (interactive)
    (find-alternate-file "..")
  ))
  (local-set-key [down-mouse-1] 'dired-find-alternate-file)
)
(add-hook 'dired-mode-hook 'custom-dired-setting)

如果不改鼠标,默认的鼠标打开的文件,不需要键盘位置和鼠标位置一致,只是它会在新buffer打开

mouse需要通过点击的地方判断,不能简单的绑定[down-mouse-1]

我这试了一下,点击文件时会调用到 dired-mouse-find-file-other-window 方法,它调用了dired-mouse-find-file,入参是 find-file-other-windowdired-other-window,导致会新开一个buffer

那么advice 一下,传入 find-alternate-file 方法即可

不能使用 dired-find-alternate-file,它应该是自己获取光标处的文件,然后用 find-alternate-file 打开

代码如下:

(defun my/dired-mouse-find-file (event)
  (interactive "e")
  (dired-mouse-find-file event 'find-alternate-file 'find-alternate-file))
(advice-add 'dired-mouse-find-file-other-window :override 'my/dired-mouse-find-file)

请教一下,点击文件时候调用的方法和参数是怎么找到的?有没有什么比较好的调试方式?

解决路径如下(debug-on-entry 方法很好用):

  1. describe-key,然后点击鼠标,查看其绑定的方法,是 mouse-drag-region 方法,和 dired 没有关系,其他地方点击也是这个方法
  2. 猜测最终会调用dired中的一个方法,describe-symbol 然后用 dired mouse 搜索了一下,找到 dired-mouse-find-file 方法
  3. debug-on-entry设置断点,选择该方法,然后在dired中点击一个文件,发现确实会调用到,在debug窗口可以查看调用栈 (用cancel-debug-on-entry可以取消这个断点)
  4. 然后就是简单看看这些方法的源码
  5. 最后写个 advice 验证一下

学习,非常感谢您的帮助