Mohu vybrat projektil vybraného projektu jako lepkavý a neřídit se aktuální vyrovnávací pamětí
On 14 února, 2021 by adminJe možné vytvořit projekt pouze při přepínání projektů při volání projectile-switch-project a nesledovat vyrovnávací paměti?
Když přepnu vyrovnávací paměti v emacsu, projektil přepne projekt na projekt, do kterého aktuální vyrovnávací paměť patří (pokud existuje).
Obvykle pracuji na projektu ale nechte si otevřít soubory i z jiných projektů. Mám soubor org s otevřenými pracovními položkami a poznámkami (který patří k mému org projektu) a některé testovací skripty (z mého projektu skriptů) a poté zdroj projektu, na kterém pracuji.
To dělá otevírání souborů pomocí (helm) -projectile-find-file téměř nesmyslné, protože obvykle nejprve musím přepnout na vyrovnávací paměť z tohoto projektu, nebo udělat (helm) -projectile-switch-project. A pak mohu (téměř) stejně dobře používat soubory helm-find-files.
Stále chci aktivní globální režim projektilu, takže mohu vždy otevřít Cc pf a otevřít soubor projektu.
Komentáře
Odpověď
Příkazy projektilu obecně volají projectile-project-root
k vyhledání aktuálního projektu a ten funguje při pohledu na aktuální default-directory
.
Můžete doporučit funkci root projektu a nechat ji místo toho vrátit pevnou hodnotu:
(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)
Tato implementace zkontroluje, zda projectile-main-project
je nastaven a vrátí to. Pokud nastavíte hlavní projekt na nulu, pak místo toho získáte výchozí chování projektilu.
Zde je příkaz ke změně hlavního projektu. Protože jsme „doporučili projectile-project-root
výše, dočasně to zruší hlavní projekt, aby projektil mohl zjistit projekt pro aktuální vyrovnávací paměť, a pak použije tento výsledek.
(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
Pokud používáte verze Emacsu, která nemá advice-add
(starší než Emacs 24.4), můžete stejného výsledku dosáhnout použitím defadvice
:
(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))
Komentáře
- Skvělé! Velmi hezké! Děkuji mnohokrát. Mohu místo toho použít defadvice nebo něco podobného? Jsem ' m dne 24.3. Ale zase by bylo fajn upgradovat =)
- Jistě, místo toho můžete použít defadvice. V takovém případě nemáte ' praktickou možnost
:before-until
, takže byste chtěli použítaround
radu a poté explicitně zavolatprojectile-project-root
, pokud neexistuje žádná hlavní sada projektu. - Pro můj související případ použití má smysl udělat něco podobného ale použít
:after-until
radu. Protožeprojectile-project-root
vracínil
mimo projekt. Mohu tedy použít radu k nastavení výchozí projektu. Tato logika se podobá spíšecond
, kde programujeme finální výchozí možnost.
projectile-find-file
i v různých projektech by měl vždy vypsat soubor v " main " projekt, mám pravdu? Pokud ano, aktuálně to ' není implementováno, ale myslím si, že by mohlo být užitečné přepnout projekt na " main ".