Kan jeg gøre det valgte projektils klæbrige og ikke følge den aktuelle buffer
On februar 14, 2021 by adminEr det muligt at få projektil til kun at skifte projekter, når jeg kalder projektil-switch-projekt, og ikke følge bufferne?
Når jeg skifter buffere i emacs, skifter projektil projekt til projektet, som den aktuelle buffer tilhører (hvis nogen).
Jeg arbejder normalt på et projekt men har også filer åbne fra andre projekter. Jeg har en org-fil med mine åbne emner og noter (som hører til mit org-projekt) og nogle testskripter (fra mit scripts-projekt) og derefter kilden til det projekt, jeg arbejder på.
Dette gør åbning af filer ved hjælp af (helm) -projektil-find-fil næsten meningsløs, da jeg normalt skal skifte til en buffer fra dette projekt først eller gøre (helm) -projektil-switch-projekt. Og så kan jeg (næsten) lige så godt bruge helm-find-filer.
Jeg vil dog stadig have projektil global tilstand aktiv, så jeg kan altid gøre Cc pf for at åbne en projektfil.
Kommentarer
Svar
Generelt kalder projektilkommandoer projectile-project-root
for at finde det aktuelle projekt, og at fungerer ved at se på den aktuelle default-directory
.
Du kan rådgive projektets rodfunktion og få den til at returnere en fast værdi i stedet:
(defvar projectile-main-project "~/projects/foo") (defun use-main-project (&rest args) "Skip calling `projectile-project-root" when there is a main project defined." (when projectile-main-project projectile-main-project)) (advice-add #"projectile-project-root :before-until #"use-main-project)
Denne implementering kontrollerer, om projectile-main-project
er indstillet og returnerer det. Hvis du indstiller hovedprojektet til nul, får du i stedet standardprojektiladfærd.
Her er en kommando til at ændre hovedprojektet. Bemærk, at fordi vi “har rådgivet projectile-project-root
ovenfor, frakobles dette midlertidigt hovedprojektet for at tillade projektil at finde ud af projektet for den aktuelle buffer, og derefter bruge dette resultat.
(defun set-main-project (&optional dir) "Set the projectile main project based on the current buffer. When called with argument DIR, make that main project instead." (interactive) (if dir (setq projectile-main-project dir) (let ((current-project)) (let ((projectile-main-project nil)) (setq current-project (projectile-project-root))) (setq projectile-main-project current-project))))
UPDATE
Hvis du bruger en version af Emacs, der ikke har advice-add
(ældre end Emacs 24.4), kan du opnå det samme resultat ved hjælp af defadvice
i stedet:
(defadvice projectile-project-root ( around use-main-project activate) "Use the current main project, if any." (if projectile-main-project (setq ad-return-value projectile-main-project) ad-do-it))
Kommentarer
- Vidunderligt! Meget fint! Mange tak. Kan jeg bruge defadvice eller lignende i stedet? I ' m den 24.3. Men så igen, det ville være rart at opgradere =)
- Sikker på, du kunne bruge defadvice i stedet. I så fald har du ' ikke den praktiske
:before-until
mulighed, så du vil brugearound
rådgivning og ring derefter eksplicit gennemprojectile-project-root
når der ikke er noget hovedprojekt indstillet. - For min relaterede brugssag er det fornuftigt at gøre noget lignende men at bruge
:after-until
råd. Daprojectile-project-root
returnerernil
uden for et projekt. Jeg kan derfor bruge rådene til at indstille et standard -projekt. Denne logik ligner merecond
, hvor vi programmerer i en endelig standardindstilling.
projectile-find-file
, selv i forskellige projekter, skal det altid angive en fil i " main " projekt, er jeg korrekt? Hvis ja, i øjeblikket er det ' ikke implementeret, men jeg tror, det kan være nyttigt at skifte et projekt til at være " main ".