emacs projectile project cannot be read

原因

虽然该目录不存在, 但该目录在cache 中还有残留

解决办法

清除在 lsp-session 的残留

手动修改 ~/.config/emacs/.local/cache/lsp-session 文件 或者可能在 ~/.emacs.d/.local/cache/lsp-session

直接删掉就行了

另外如果觉得projectile cache 过大, 影响了速度的话, 也可以清理一下cache

清除在 savehist 里的残留

手动修改 ~/.config/emacs/.local/cache/savehist 文件 或者可能在 ~/.emacs.d/.local/cache/savehist
把没用的目录删掉就行了

清除所有 session

1
2
cd ~/.config/emacs/.local/cache
rm session.*

清除 projectile cache 中没用的项目

使用 projectile-remove-known-project 可以把该目录从 projectile project list 里删除, 但是该目录仍然存在于cache 里

手动删除

由于 projectile-invalidate-cache 也无法解决, 所以只能手动去删除了
修改 ~/.eamcs.d/.local/cache/prjectile.cache 也有可能是 ~/.config/emacs/.local/cache/prjectile.cache
把对应的工程目录和后面括号内的内容一起删掉即可

👿 注意: 一定要关掉Emacs 再修改这个文件, 否则关闭Emacs 的时候会用cache 覆盖掉这个文件, 造成白改

写一个 emacs lisp 函数来自动化的做这些事情

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(defun my/check-projectile-cache-file ()
  " 检查 projectile-cache-file 里的工程目录和文件是否存在, 如果不存在则删掉 "
  (interactive)
  (projectile-serialize-cache)   ;; 把 cache 写到文件里
  (let* ((new-cache (with-temp-buffer
                      (insert-file projectile-cache-file)
                      (goto-char (point-min))
                      (while (re-search-forward ")\\s-+\"\\(.*?\\)\"\\s-+(" nil t)
                        ;; (message "prj : %S" (match-string 1))
                        (let* ((prj-name (match-string 1)))
                          (unless (file-exists-p prj-name)
                            (message "clearing not found prj : %S" prj-name)
                            (delete-region (- (point) (1- (length (match-string 0)))) (1- (point)))
                            (backward-char 1)
                            (when (re-search-forward "(\\(.*?\\))" nil nil)
                              ;; (message "files : %s" (match-string 1))
                              (delete-region (- (point) (length (match-string 0))) (point))
                              ))))
                      (buffer-string))))
    (f-write-text new-cache 'utf-8 projectile-cache-file)
    ;; 从文件更新到 cache 中, 这样在关闭emacs 后才不会使改动丢失
    (setq projectile-projects-cache
            (or (projectile-unserialize projectile-cache-file)
                (make-hash-table :test 'equal)))))

如果以上方法都试过了还解决不了, 那还有可能是lsp-mode 的root 目录没有设对, 导致lsp-mode 胡乱扫描文件夹

1
(setq lsp-auto-guess-root t)

把 lsp-auto-guess-root 设置为t 即可

Licensed under CC BY-NC-SA 4.0