Kan jag göra projektilvalt projekt klibbigt och inte följa den aktuella bufferten
On februari 14, 2021 by adminÄr det möjligt att göra projektil bara att byta projekt när jag ringer projektil-switch-projekt, och följer du inte buffertarna?
När jag byter buffert i emacs kommer projektilen att byta projekt till det projekt som den aktuella bufferten tillhör (om någon).
Jag brukar jobba med ett projekt men har filer öppna från andra projekt också. Jag har en org-fil med mina arbetsobjekt och anteckningar öppna (som tillhör mitt organisationsprojekt) och några testskript (från mitt skriptprojekt) och sedan källan till projektet jag jobbar med.
Detta gör öppna filer med (helm) -projectile-find-file nästan meningslöst eftersom jag vanligtvis måste byta till en buffert från det projektet först, eller göra (helm) -projectile-switch-project. Och då kan jag (nästan) lika gärna använda helm-find-filer.
Jag vill fortfarande ha projektil globalt läge aktivt så jag kan alltid göra Cc pf för att öppna en projektfil.
Kommentarer
Svar
I allmänhet ringer projektilkommandon projectile-project-root
för att hitta det aktuella projektet, och att fungerar genom att titta på den aktuella default-directory
.
Du kan ge råd till projektets rotfunktion och låta den returnera ett fast värde istället:
(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)
Denna implementering kontrollerar om projectile-main-project
är inställt och returnerar det. Om du ställer in huvudprojektet på noll kommer du istället att få standardprojektilbeteendet.
Här är ett kommando för att ändra huvudprojektet. Observera att eftersom vi ”rekommenderat projectile-project-root
ovan, stänger detta tillfälligt av huvudprojektet så att projektilen kan räkna ut projektet för den aktuella bufferten och använder sedan det resultatet.
(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))))
UPPDATERING
Om du använder en version av Emacs som inte har advice-add
(äldre än Emacs 24.4) kan du uppnå samma resultat med defadvice
istället:
(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
- Underbart! Mycket trevligt! Tack så mycket. Kan jag använda defadvice eller något liknande istället? Jag ' m den 24.3. Men då skulle det vara trevligt att uppgradera =)
- Visst, du kan använda defadvice istället. I så fall har du inte ' det praktiska
:before-until
-alternativet, så du vill användaaround
råd och ring sedan uttryckligen genomprojectile-project-root
när det inte finns något huvudprojekt. - För mitt relaterade användningsfall är det vettigt att göra något liknande men att använda
:after-until
råd. Eftersomprojectile-project-root
returnerarnil
utanför projektet. Jag kan därför använda råden för att ställa in ett standard -projekt. Denna logik liknar mercond
, där vi programmerar i ett slutgiltigt standardalternativ.
projectile-find-file
, även i olika projekt, ska den alltid lista filen i " huvud " -projekt, stämmer jag? Om så är fallet är för närvarande ' inte implementerat men jag tror att det kan vara användbart att växla ett projekt till att vara " huvud ".