Posso obter o plug-in Vim Ctrlp para ignorar uma pasta específica em um projeto?


17

O plug - in Vim Ctrlp tem uma maneira de ignorar globalmente determinados nomes de pastas. Por exemplo:

let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'

No entanto, eu tenho uma regra de ignorar que é específica para um projeto. Eu gostaria de algo mais parecido com um .gitignorearquivo.

Existe uma maneira de ignorar uma pasta específica em um projeto específico sem modificar minha configuração global?


Você tentou o rastreador de problemas do plug-in?
romainl

Respostas:


20

Use um comando de listagem personalizado

Ctrlp permite dizer qual comando usar para obter uma lista de arquivos na pasta. Portanto, se você deseja excluir qualquer coisa chamada beets.txt, você pode fazer:

let g:ctrlp_user_command = 'find %s -type f | grep -v "beets.txt"'

Isso é global, mas começa a apontar para a resposta: forneça seu próprio comando shell.

Melhor ainda, o Ctrlp permite fornecer vários comandos do shell com marcadores, o que significa "se você vir esse marcador no diretório raiz, use este comando".

Encontrei isso :help ctrlpe modifiquei um pouco com base no comentário do autor sobre um problema.

let g:ctrlp_user_command = {
  \ 'types': {
    \ 1: ['.git', 'cd %s && git ls-files --cached --exclude-standard --others'],
    \ 2: ['.hg', 'hg --cwd %s locate -I .'],
    \ },
  \ 'fallback': 'find %s -type f'
  \ }

Isso significa: "Se você vir .gitna pasta, use git ls-files.... Caso contrário, se vir .hg, use hg --cwd..., caso contrário, use um regular find."

Portanto, para ignorar uma pasta específica em um projeto, crie um comando que a ignore e, em seguida, coloque um marcador exclusivo nesse projeto para permitir que Ctrlp que você deseja usar seu comando especial aqui .

(No meu caso, eu realmente queria ignorar os arquivos que estavam dentro .gitignore, então o git ls-filescomando acima funciona para mim.)


Isso é incrível, muito obrigado por esta resposta.
Denis

git -C% s arquivos-ls --cached --exclude-standard - outros devem funcionar para o git.
Arunprasad Rajkumar 29/11

11

Se você estiver usando o backend Silver Searcher para CtrlP (que é muito mais rápido), basta adicionar um .agignorearquivo ao diretório do projeto no mesmo formato de .gitignore:

.git/
.hg/
.svn/

Como alternativa, mantenha um ~/.agignorearquivo global .

Adicione o Silver Searcher como back-end com isso no seu .vimrc

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'

11
Obrigado por postar isso. Para adicionar outro ponto de dados: eu adaptei isso if executable("ag") let g:ctrlp_user_command = 'ag %s -l --nocolor --depth 8 -g ""' endif . O limite de profundidade é útil se eu pressionar acidentalmente ctrl-p ao editar um arquivo na minha pasta pessoal. Descobri que o sinalizador oculto incluiria arquivos em .git /
Eric Hu

6

Especifica arquivos não rastreados intencionalmente em um arquivo

Para resolver isso com um arquivo como .gitignore(baseado na solução Nathan grep), criei um arquivo nomeado .ctrlpignoree coloquei os padrões que devem ser ignorados, separados por linhas:

node_modules/
\.log$
...

E minha configuração ctrlp:

let g:ctrlp_user_command = 'find %s -type f | grep -v "`cat .ctrlpignore`"'

Talvez o .gitignorepróprio possa ser usado para ignorar os arquivos em ctrlp, não sendo necessário criar um novo arquivo para fazer quase a mesma coisa.


Adicionei esse trecho, mas ele interrompe o comportamento de ctrlp geral; se eu digitar orderscontroller, ele encontrará apenas arquivos _spec, nenhum arquivo orders_controller.rb real.
jedi

1

Como disse Wagner Andrade , usar uma máquina separada .ctrlpignoreseria uma boa ideia.

Uma configuração de vim mais robusta e conveniente é assim:

let g:ctrlp_user_command = 'cd %s;
  \ commonfilter="\.(jpg|bmp|png|jar|7z|zip|tar|gz|tgz|bz)$";
  \ if [ ! -r ".ctrlpignore" ]; then
  \   find . -type f | grep -Evi "$commonfilter";
  \ else
  \   find . -type f | grep -vF "$(cat .ctrlpignore)" | grep -Evi "$commonfilter";
  \ fi'

.ctrlpignorepode ser colocado em qualquer diretório que seria reconhecido como um diretório raiz pelo ctrlp. Aqui está um exemplo, cada linha está começando com./

vim ~/.ctrlpignore

./Desktop
./R
./.vim
./.local/lib
.....

Nota:

  1. grep -Finterpretará padrão, ex. './.tmp', como uma sequência fixa, se você não quiser que seu './ptmp' seja filtrado. Ainda existem alguns erros triviais: './.tmp' também filtrará './.tmp2'. Esqueça, eu não gosto\.

  2. g:ctrlp_custom_ignoreserá ignorado se g:ctrlp_user_commandestiver definido. Isso poderia ser feito de uma maneira mais complexag:ctrlp_user_command

  3. lista branca em vez de lista negra também é possível. Mais conveniente se implementado em um script separado

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.