原因
虽然该目录不存在, 但该目录在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 即可