Kan jeg gjøre det valgte prosjektilet klebrig og ikke følge gjeldende buffer
On februar 14, 2021 by adminEr det mulig å lage prosjektil bare bytte prosjekter når jeg ringer prosjektil-bytte-prosjekt, og ikke følge bufferne?
Når jeg bytter buffere i emacs, vil prosjektil bytte prosjekt til prosjektet som den nåværende bufferen tilhører (hvis noen).
Jeg jobber vanligvis med et prosjekt men har filer åpne fra andre prosjekter også. Jeg har en org-fil med arbeidsemnene mine og notatene åpne (som tilhører org-prosjektet mitt) og noen testskripter (fra skriptprosjektet mitt) og deretter kilden til prosjektet jeg jobber med.
Dette gjør åpne filer ved hjelp av (helm) -projectile-find-file nesten meningsløs siden jeg vanligvis må bytte til en buffer fra det prosjektet først, eller gjøre (helm) -projectile-switch-project. Og så kan jeg (nesten) like godt bruke helm-find-filer.
Jeg vil fortsatt ha prosjektil global modus aktiv, så jeg kan alltid gjøre Cc pf for å åpne en prosjektfil.
Kommentarer
Svar
Generelt kaller prosjektilkommandoer projectile-project-root
for å finne det aktuelle prosjektet, og at fungerer ved å se på gjeldende default-directory
.
Du kan gi råd til prosjektets rotfunksjon og få den til å returnere en fast verdi 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 implementeringen vil sjekke om projectile-main-project
er satt og returnerer det. Hvis du setter hovedprosjektet til null, vil du i stedet få standard prosjektilatferd.
Her er en kommando for å endre hovedprosjektet. Vær oppmerksom på at fordi vi har anbefalt projectile-project-root
ovenfor, slår dette hovedprosjektet midlertidig av for å la prosjektilet finne ut prosjektet for den nåværende bufferen, og bruker deretter 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))))
OPPDATERING
Hvis du bruker en versjon av Emacs som ikke har advice-add
(eldre enn Emacs 24.4), kan du oppnå det samme resultatet ved å bruke 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
- Fantastisk! Veldig fint! Tusen takk. Kan jeg bruke defadvice eller noe lignende i stedet? I ' m den 24.3. Men igjen, det ville være fint å oppgradere =)
- Jo, du kan bruke defadvice i stedet. I så fall har du ikke ' det praktiske
:before-until
-alternativet, så du vil brukearound
råd, og ring deretter eksplisitt gjennomprojectile-project-root
når det ikke er noe hovedprosjekt satt. - For min relaterte brukssak er det fornuftig å gjøre noe lignende men å bruke
:after-until
råd. Sidenprojectile-project-root
returnerernil
når det er utenfor et prosjekt. Jeg kan derfor bruke rådene til å sette et standard prosjekt. Denne logikken ligner mer påcond
, hvor vi programmerer i et endelig standardalternativ.
projectile-find-file
, selv i forskjellige prosjekter, bør den alltid liste opp filen i " hoved " prosjekt, stemmer jeg? I så fall er det ' for øyeblikket ikke implementert, men jeg tror det kan være nyttig å bytte et prosjekt til å være " hoved ".