Posso tornar o projeto do projétil escolhido aderente e não seguir o buffer atual
On Fevereiro 14, 2021 by adminÉ possível fazer com que o projétil apenas troque de projeto ao chamar projétil-switch-projeto, e não segue os buffers?
Quando eu troco os buffers no emacs, o projétil muda o projeto para o projeto ao qual o buffer atual pertence (se houver).
Eu geralmente trabalho em um projeto mas tem arquivos abertos de outros projetos também. Eu tenho um arquivo org com meus itens de trabalho e notas abertos (que pertence ao meu projeto org) e alguns scripts de teste (do meu projeto de scripts) e a fonte do projeto no qual estou trabalhando.
Isso torna abrir arquivos usando (helm) -projectile-find-file quase sem sentido, já que normalmente tenho que mudar para um buffer desse projeto primeiro, ou fazer (helm) -projectile-switch-project. E então eu posso (quase) tão bem usar helm-find-files.
Ainda quero o modo global de projétil ativo, então posso sempre fazer Cc pf para abrir um arquivo de projeto.
Comentários
Resposta
Em geral, os comandos do projétil chamam projectile-project-root
para encontrar o projeto atual, e que funciona olhando para o default-directory
atual.
Você pode aconselhar a função raiz do projeto e fazer com que ela retorne um valor fixo:
(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)
Esta implementação verificará se projectile-main-project
é definido e retorna isso. Se você definir o projeto principal como nulo, então obterá o comportamento de projétil padrão.
Aqui está um comando para alterar o projeto principal. Observe que, como aconselhamos projectile-project-root
acima, isso temporariamente desativa o projeto principal para permitir que o projétil descubra o projeto para o buffer atual e, em seguida, use esse resultado.
(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))))
ATUALIZAÇÃO
Se você estiver usando uma versão do Emacs que não “tem advice-add
(mais antigo que o Emacs 24.4), você pode obter o mesmo resultado usando defadvice
em vez disso:
(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))
Comentários
- Maravilhoso! Muito agradável! Muito obrigado. Posso usar defadvice ou algo semelhante em vez disso? Eu ' m em 24,3. Mas seria bom atualizar =)
- Claro, você poderia usar o defadvice. Nesse caso, você não ' não tem a opção
:before-until
útil, portanto, convém usararound
e, em seguida, chame explicitamente oprojectile-project-root
quando não houver um conjunto de projeto principal. - Para meu caso de uso relacionado, faz sentido fazer algo semelhante mas para usar o conselho
:after-until
. Uma vez queprojectile-project-root
retornanil
quando fora de um projeto. Portanto, posso usar o conselho para definir um projeto padrão . Essa lógica é mais parecida comcond
, onde programamos uma opção padrão final.
projectile-find-file
, mesmo em projetos diferentes, deve sempre listar o arquivo no " principal " projeto, estou correto? Nesse caso, atualmente ele ' não está implementado, mas acho que pode ser útil alternar um projeto para ser " principal ".