Pot face proiectul ales proiectilului lipicios și să nu urmez buffer-ul actual
On februarie 14, 2021 by adminEste posibil să faci proiectilul să schimbe proiectele numai atunci când apelezi proiectil-comutare-proiect și nu urmează bufferele?
Când comut bufferele în emacs, proiectilul va comuta proiectul către proiectul la care aparține bufferul curent (dacă există).
De obicei lucrez la un proiect dar au fișiere deschise și din alte proiecte. Am un fișier org cu elementele și notele mele de lucru deschise (care aparține proiectului meu org) și câteva scripturi de testare (din proiectul meu de scripturi) și apoi sursa proiectului la care lucrez.
Acest lucru face ca deschiderea fișierelor folosind (helm) -projectile-find-file aproape fără sens, deoarece de obicei trebuie să trec mai întâi la un buffer din acel proiect sau să fac (helm) -projectile-switch-project. Și atunci pot (aproape) la fel de bine să folosesc helm-find-files.
Vreau totuși să fie activ modul global de proiectile, așa că pot face întotdeauna Cc pf pentru a deschide un fișier de proiect.
Comentarii
Răspuns
În general, comenzile proiectilului apelează projectile-project-root
pentru a găsi proiectul curent și că funcționează uitându-se la actualul default-directory
.
Puteți sfătui funcția rădăcină a proiectului și cereți-i să returneze o valoare fixă în schimb:
(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)
Această implementare va verifica dacă projectile-main-project
este setat și returnează-l. Dacă setați proiectul principal la zero, atunci veți obține comportamentul implicit al proiectilului.
Aici este o comandă pentru a schimba proiectul principal. Rețineți că, deoarece „am sfătuit projectile-project-root
mai sus, acest lucru dezactivează temporar proiectul principal pentru a permite proiectilului să descopere proiectul pentru bufferul curent, apoi folosește acel rezultat.
(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
Dacă utilizați o versiune a Emacs care nu are advice-add
(mai veche decât Emacs 24.4) puteți obține același rezultat folosind defadvice
în schimb:
(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))
Comentarii
- Minunat! Foarte frumos! Mulțumesc foarte mult. Pot folosi defadvice sau ceva similar? Am ' m pe 24.3. Dar, din nou, ar fi bine să faceți upgrade =)
- Sigur, ați putea folosi defadvice în loc. În acest caz, nu aveți ' opțiunea
:before-until
la îndemână, deci ați dori să utilizațiaround
sfaturi și apoi sunați în mod explicit prinprojectile-project-root
atunci când nu există un set de proiecte principale. - Pentru cazul meu de utilizare conex, are sens să facem ceva similar dar pentru a folosi sfaturi
:after-until
. Deoareceprojectile-project-root
returneazănil
atunci când se află în afara unui proiect. Prin urmare, pot folosi sfatul pentru a seta un proiect implicit . Această logică seamănă mai mult cucond
, unde programăm într-o opțiune prestabilită finală.
projectile-find-file
, chiar și în diferite proiecte, ar trebui să listeze întotdeauna fișierul în " principal " proiect, sunt corect? Dacă da, în prezent ' nu este implementat, dar cred că ar putea fi util să comutați un proiect pentru a fi " principal ".