Emacs Dired进入git管理的目录中报错

按键C-x d进入git管理的目录时,出现以下错误:

Debugger entered--Lisp error: (file-missing "Searching for program" "No such file or directory" "git")
  make-process(:name "git" :buffer #<buffer  *diff-hl-dired* tmp status-77442> :command ("git" "--no-pager" "add" "--refresh" "--" "auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org"))
  apply(make-process (:name "git" :buffer #<buffer  *diff-hl-dired* tmp status-77442> :command ("git" "--no-pager" "add" "--refresh" "--" "auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org")))
  start-process("git" #<buffer  *diff-hl-dired* tmp status-77442> "git" "--no-pager" "add" "--refresh" "--" "auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org")
  apply(start-process "git" #<buffer  *diff-hl-dired* tmp status-77442> "git" ("--no-pager" "add" "--refresh" "--" "auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org"))
  start-file-process("git" #<buffer  *diff-hl-dired* tmp status-77442> "git" "--no-pager" "add" "--refresh" "--" "auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org")
  apply(start-file-process "git" #<buffer  *diff-hl-dired* tmp status-77442> "git" ("--no-pager" "add" "--refresh" "--" "auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org"))
  vc-do-command(#<buffer  *diff-hl-dired* tmp status-77442> async "git" ("auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org") "--no-pager" "add" "--refresh" "--")
  apply(vc-do-command #<buffer  *diff-hl-dired* tmp status-77442> async "git" ("auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org") ("--no-pager" "add" "--refresh" "--"))
  vc-git-command(#<buffer  *diff-hl-dired* tmp status-77442> async ("auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org") "add" "--refresh" "--")
  vc-git-dir-status-goto-stage(#s(vc-git-dir-status-state :stage update-index :files ("auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org") :update-function (closure ((files-alist) (dirs-alist) (buffer . #<buffer 软件使用速查>) (def-dir . "c:/cygwin64/home/HP/documents/knowledge/1-note/软件使...") (backend . Git) t) (entries &optional more-to-come) (if (buffer-live-p buffer) (progn (save-current-buffer (set-buffer buffer) (let (...) (while --dolist-tail-- ...)) (if more-to-come nil (diff-hl-dired-highlight-items ...))) (if more-to-come nil (kill-buffer diff-hl-dired-process-buffer))))) :hash #<hash-table equal 0/65 0x215f2cd>))
  vc-git-dir-status-files("c:/cygwin64/home/HP/documents/knowledge/1-note/软件使..." ("auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org") (closure ((files-alist) (dirs-alist) (buffer . #<buffer 软件使用速查>) (def-dir . "c:/cygwin64/home/HP/documents/knowledge/1-note/软件使...") (backend . Git) t) (entries &optional more-to-come) (if (buffer-live-p buffer) (progn (save-current-buffer (set-buffer buffer) (let ((--dolist-tail-- entries)) (while --dolist-tail-- (let ... ... ...))) (if more-to-come nil (diff-hl-dired-highlight-items (append dirs-alist files-alist)))) (if more-to-come nil (kill-buffer diff-hl-dired-process-buffer))))))
  apply(vc-git-dir-status-files ("c:/cygwin64/home/HP/documents/knowledge/1-note/软件使..." ("auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org") (closure ((files-alist) (dirs-alist) (buffer . #<buffer 软件使用速查>) (def-dir . "c:/cygwin64/home/HP/documents/knowledge/1-note/软件使...") (backend . Git) t) (entries &optional more-to-come) (if (buffer-live-p buffer) (progn (save-current-buffer (set-buffer buffer) (let (...) (while --dolist-tail-- ...)) (if more-to-come nil (diff-hl-dired-highlight-items ...))) (if more-to-come nil (kill-buffer diff-hl-dired-process-buffer)))))))
  vc-call-backend(Git dir-status-files "c:/cygwin64/home/HP/documents/knowledge/1-note/软件使..." ("auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org") (closure ((files-alist) (dirs-alist) (buffer . #<buffer 软件使用速查>) (def-dir . "c:/cygwin64/home/HP/documents/knowledge/1-note/软件使...") (backend . Git) t) (entries &optional more-to-come) (if (buffer-live-p buffer) (progn (save-current-buffer (set-buffer buffer) (let ((--dolist-tail-- entries)) (while --dolist-tail-- (let ... ... ...))) (if more-to-come nil (diff-hl-dired-highlight-items (append dirs-alist files-alist)))) (if more-to-come nil (kill-buffer diff-hl-dired-process-buffer))))))
  (if (version< "25" emacs-version) (vc-call-backend backend 'dir-status-files dir files update-function) (vc-call-backend backend 'dir-status-files dir files nil update-function))
  diff-hl-dired-status-files(Git "c:/cygwin64/home/HP/documents/knowledge/1-note/软件使..." ("auto" "bibtex4word.org" "debian.org" "emacs.org" "git.org" "index.org" "index.pdf" "index.tex" "latex.org" "org.org" "qgis.org" "win7.org" "文献管理.org" "正则表达式.org") (closure ((files-alist) (dirs-alist) (buffer . #<buffer 软件使用速查>) (def-dir . "c:/cygwin64/home/HP/documents/knowledge/1-note/软件使...") (backend . Git) t) (entries &optional more-to-come) (if (buffer-live-p buffer) (progn (save-current-buffer (set-buffer buffer) (let ((--dolist-tail-- entries)) (while --dolist-tail-- (let ... ... ...))) (if more-to-come nil (diff-hl-dired-highlight-items (append dirs-alist files-alist)))) (if more-to-come nil (kill-buffer diff-hl-dired-process-buffer))))))
  (save-current-buffer (set-buffer diff-hl-dired-process-buffer) (setq default-directory (expand-file-name def-dir)) (erase-buffer) (diff-hl-dired-status-files backend def-dir (if diff-hl-dired-extra-indicators (progn (let* ((--cl-var-- (directory-files def-dir)) (file nil) (--cl-var-- nil)) (while (consp --cl-var--) (setq file (car --cl-var--)) (if (member file ...) (progn) (setq --cl-var-- ...)) (setq --cl-var-- (cdr --cl-var--))) (nreverse --cl-var--)))) #'(lambda (entries &optional more-to-come) (if (buffer-live-p buffer) (progn (save-current-buffer (set-buffer buffer) (let ... ...) (if more-to-come nil ...)) (if more-to-come nil (kill-buffer diff-hl-dired-process-buffer)))))))
  (progn (diff-hl-dired-clear) (if (buffer-live-p diff-hl-dired-process-buffer) (let ((proc (get-buffer-process diff-hl-dired-process-buffer))) (if proc (progn (kill-process proc)))) (setq diff-hl-dired-process-buffer (generate-new-buffer " *diff-hl-dired* tmp status"))) (save-current-buffer (set-buffer diff-hl-dired-process-buffer) (setq default-directory (expand-file-name def-dir)) (erase-buffer) (diff-hl-dired-status-files backend def-dir (if diff-hl-dired-extra-indicators (progn (let* ((--cl-var-- ...) (file nil) (--cl-var-- nil)) (while (consp --cl-var--) (setq file ...) (if ... ... ...) (setq --cl-var-- ...)) (nreverse --cl-var--)))) #'(lambda (entries &optional more-to-come) (if (buffer-live-p buffer) (progn (save-current-buffer ... ... ...) (if more-to-come nil ...)))))))
  (if (and backend (not (memq backend diff-hl-dired-ignored-backends))) (progn (diff-hl-dired-clear) (if (buffer-live-p diff-hl-dired-process-buffer) (let ((proc (get-buffer-process diff-hl-dired-process-buffer))) (if proc (progn (kill-process proc)))) (setq diff-hl-dired-process-buffer (generate-new-buffer " *diff-hl-dired* tmp status"))) (save-current-buffer (set-buffer diff-hl-dired-process-buffer) (setq default-directory (expand-file-name def-dir)) (erase-buffer) (diff-hl-dired-status-files backend def-dir (if diff-hl-dired-extra-indicators (progn (let* (... ... ...) (while ... ... ... ...) (nreverse --cl-var--)))) #'(lambda (entries &optional more-to-come) (if (buffer-live-p buffer) (progn ... ...)))))))
  (let ((backend (condition-case nil (progn (vc-responsible-backend default-directory)) (error nil))) (def-dir default-directory) (buffer (current-buffer)) dirs-alist files-alist) (if (and backend (not (memq backend diff-hl-dired-ignored-backends))) (progn (diff-hl-dired-clear) (if (buffer-live-p diff-hl-dired-process-buffer) (let ((proc (get-buffer-process diff-hl-dired-process-buffer))) (if proc (progn (kill-process proc)))) (setq diff-hl-dired-process-buffer (generate-new-buffer " *diff-hl-dired* tmp status"))) (save-current-buffer (set-buffer diff-hl-dired-process-buffer) (setq default-directory (expand-file-name def-dir)) (erase-buffer) (diff-hl-dired-status-files backend def-dir (if diff-hl-dired-extra-indicators (progn (let* ... ... ...))) #'(lambda (entries &optional more-to-come) (if ... ...)))))))
  diff-hl-dired-update()
  run-hooks(dired-after-readin-hook)
  dired-readin()
  dired-internal-noselect("c:/cygwin64/home/HP/documents/knowledge/1-note/软件使..." nil)
  dired-noselect("c:/cygwin64/home/HP/documents/knowledge/1-note/软件使..." nil)
  #f(compiled-function (dirname &optional switches) "\"Edit\" directory DIRNAME--delete, rename, print, etc. some files in it.\nOptional second argument SWITCHES specifies the `ls' options used.\n(Interactively, use a prefix argument to be able to specify SWITCHES.)\n\nIf DIRNAME is a string, Dired displays a list of files in DIRNAME (which\nmay also have shell wildcards appended to select certain files).\n\nIf DIRNAME is a cons, its first element is taken as the directory name\nand the rest as an explicit list of files to make directory entries for.\nIn this case, SWITCHES are applied to each of the files separately, and\ntherefore switches that control the order of the files in the produced\nlisting have no effect.\n\n\\<dired-mode-map>You can flag files for deletion with \\[dired-flag-file-deletion] and then\ndelete them by typing \\[dired-do-flagged-delete].\nType \\[describe-mode] after entering Dired for more info.\n\nIf DIRNAME is already in a Dired buffer, that buffer is used without refresh." (interactive (dired-read-dir-and-switches "")) #<bytecode 0x24ee1f5>)("c:/cygwin64/home/HP/documents/knowledge/1-note/软件使..." nil)
  ls-lisp--dired(#f(compiled-function (dirname &optional switches) "\"Edit\" directory DIRNAME--delete, rename, print, etc. some files in it.\nOptional second argument SWITCHES specifies the `ls' options used.\n(Interactively, use a prefix argument to be able to specify SWITCHES.)\n\nIf DIRNAME is a string, Dired displays a list of files in DIRNAME (which\nmay also have shell wildcards appended to select certain files).\n\nIf DIRNAME is a cons, its first element is taken as the directory name\nand the rest as an explicit list of files to make directory entries for.\nIn this case, SWITCHES are applied to each of the files separately, and\ntherefore switches that control the order of the files in the produced\nlisting have no effect.\n\n\\<dired-mode-map>You can flag files for deletion with \\[dired-flag-file-deletion] and then\ndelete them by typing \\[dired-do-flagged-delete].\nType \\[describe-mode] after entering Dired for more info.\n\nIf DIRNAME is already in a Dired buffer, that buffer is used without refresh." (interactive (dired-read-dir-and-switches "")) #<bytecode 0x24ee1f5>) "c:/cygwin64/home/HP/documents/knowledge/1-note/软件使..." nil)
  apply(ls-lisp--dired #f(compiled-function (dirname &optional switches) "\"Edit\" directory DIRNAME--delete, rename, print, etc. some files in it.\nOptional second argument SWITCHES specifies the `ls' options used.\n(Interactively, use a prefix argument to be able to specify SWITCHES.)\n\nIf DIRNAME is a string, Dired displays a list of files in DIRNAME (which\nmay also have shell wildcards appended to select certain files).\n\nIf DIRNAME is a cons, its first element is taken as the directory name\nand the rest as an explicit list of files to make directory entries for.\nIn this case, SWITCHES are applied to each of the files separately, and\ntherefore switches that control the order of the files in the produced\nlisting have no effect.\n\n\\<dired-mode-map>You can flag files for deletion with \\[dired-flag-file-deletion] and then\ndelete them by typing \\[dired-do-flagged-delete].\nType \\[describe-mode] after entering Dired for more info.\n\nIf DIRNAME is already in a Dired buffer, that buffer is used without refresh." (interactive (dired-read-dir-and-switches "")) #<bytecode 0x24ee1f5>) ("c:/cygwin64/home/HP/documents/knowledge/1-note/软件使..." nil))
  dired("c:/cygwin64/home/HP/documents/knowledge/1-note/软件使..." nil)
  funcall-interactively(dired "c:/cygwin64/home/HP/documents/knowledge/1-note/软件使..." nil)
  call-interactively(dired nil nil)
  command-execute(dired)

从报错信息中看,我觉得应该和diff-hl、diredfl两个插件有关,没找到git程序导致的。但我不知道如何设置可以解决这个问题。 :sob:

能正常进入非git管理的目录中。

相关信息:

  • Win7操作系统
  • Emacs版本为27.0
  • 使用的是Steve Purcell的设置,但禁用了flycheck、projectile、magit、paredit等功能,并将其他中配置文件中与其相关的语句都禁用了。

g似乎是你没安装过git 或者是 git不在 path 路径里面吧

安装了git for windows。那这个需要怎么设置git的路径?

设置了

(setq magit-git-executable "c:/Program Files/Git/mingw64/bin/git.exe")

但发现不管用。

其实在Windows 上使用,把要用的命令直接加入到环境变量就行了。然后你打开命令窗口试试能否识别就可以了。比如你可以打开CMD,试试 git --version 如果能识别到,那么Emacs 也就能识别了

右键“计算机”->属性->高级系统设置->环境变量->在用户变量中选择Path->编辑,加入git的路径。注销后重新登录,即可解决。感谢aqua0210

如果只是在emacs内部调用,可以这样:

(add-to-list 'exec-path “path of command dir”)

保险起见在上一句前面可以再加一句:

(setenv “PATH” (concat (getenv “PATH”) “path of command dir”))

这样的好处是不需要修改windows本身的环境变量,方便跨机器使用

1 个赞

@CTMDoctor 感谢感谢 :+1:,对我来说简直是大牛了。你的解答完美了地解决了我的问题,亲测有用。