Kan ik het projectiel gekozen project plakkerig maken en niet de huidige buffer volgen
Geplaatst op februari 14, 2021 door adminIs het mogelijk om projectiel alleen projecten te laten wisselen wanneer projectile-switch-project wordt aangeroepen, en de buffers niet volgen?
Wanneer ik van buffer verander in emacs, zal projectile van project wisselen naar het project waartoe de huidige buffer behoort (indien aanwezig).
Ik werk meestal aan een project maar open ook bestanden van andere projecten. Ik heb een org-bestand met mijn werkitems en notities open (dat bij mijn org-project hoort) en enkele testscripts (van mijn scriptproject) en dan de bron van het project waaraan ik werk.
Dit maakt het openen van bestanden met (helm) -projectile-find-file is bijna zinloos, aangezien ik meestal eerst naar een buffer van dat project moet overschakelen, of (helm) -projectile-switch-project moet doen. En dan kan ik (bijna) net zo goed helm-find-files gebruiken.
Ik wil echter nog steeds de globale projectielmodus actief, dus ik kan altijd Cc pf doen om een projectbestand te openen.
Reacties
Answer
In het algemeen roepen projectielopdrachten projectile-project-root
op om het huidige project te vinden, en dat werkt door te kijken naar de huidige default-directory
.
U kunt de root-functie van het project adviseren en deze in plaats daarvan een vaste waarde laten retourneren:
(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)
Deze implementatie zal controleren of projectile-main-project
is ingesteld en retourneert dat. Als je het hoofdproject op nul zet, krijg je in plaats daarvan het standaard projectielgedrag.
Hier is een commando om het hoofdproject te veranderen. Merk op dat omdat we “projectile-project-root
hierboven hebben geadviseerd, dit tijdelijk het hoofdproject uitschakelt zodat het projectiel het project voor de huidige buffer kan achterhalen, en vervolgens dat resultaat gebruikt.
(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
Als u een versie van Emacs die niet “t heeft advice-add
(ouder dan Emacs 24.4) je kunt hetzelfde resultaat bereiken met defadvice
in plaats daarvan:
(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))
Reacties
- Geweldig! Heel fijn! Hartelijk bedankt. Kan ik in plaats daarvan defadvies of iets dergelijks gebruiken? Ik ' m op 24.3. Maar nogmaals, het zou leuk zijn om te upgraden =)
- Natuurlijk zou je in plaats daarvan defadvice kunnen gebruiken. In dat geval heeft u ' niet de handige
:before-until
optie, dus u zouaround
advies en dan expliciet deprojectile-project-root
aanroepen wanneer er geen hoofdprojectset is. - Voor mijn gerelateerde use-case is het logisch om iets soortgelijks te doen maar om
:after-until
advies te gebruiken. Omdatprojectile-project-root
retourneertnil
buiten een project. Ik kan het advies daarom gebruiken om een default project in te stellen. Deze logica lijkt meer opcond
, waar we een laatste standaardoptie programmeren.
projectile-find-file
wordt uitgevoerd, zelfs in verschillende projecten, moet het bestand altijd in de " main " project, heb ik gelijk? Als dit het geval is, is het momenteel ' niet geïmplementeerd, maar ik denk dat het nuttig kan zijn om een project in te stellen als " hoofd ".