¿Puedo hacer que el complemento Vim Ctrlp ignore una carpeta específica en un proyecto?

17

El complemento Vim Ctrlp tiene una forma de ignorar globalmente ciertos nombres de carpetas. P.ej:

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

Sin embargo, tengo una regla de ignorar que es específica de un proyecto. Me gustaría algo más como un .gitignorearchivo.

¿Hay alguna manera de ignorar una carpeta específica en un proyecto específico sin modificar mi configuración global?

Nathan Long
fuente
¿Probaste el rastreador de problemas del complemento?
romainl

Respuestas:

20

Use un comando de listado personalizado

Ctrlp le permite decirle qué comando usar para obtener una lista de archivos en la carpeta. Entonces, si desea excluir cualquier cosa nombrada beets.txt, puede hacer:

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

Eso es global, pero comienza a apuntar hacia la respuesta: proporcione su propio comando de shell.

Aún mejor, Ctrlp le permite suministrar múltiples comandos de shell con marcadores, lo que significa "si ve este marcador en el directorio raíz, use este comando".

Encontré esto :help ctrlpy lo modifiqué ligeramente en función del comentario del autor sobre un 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'
  \ }

Esto significa: "Si ve .giten la carpeta, use git ls-files.... De lo contrario, si ve .hg, use hg --cwd..., de lo contrario use un regular find".

Entonces, para ignorar una carpeta específica en un proyecto, diseñe un comando que ignore esa carpeta, luego coloque un marcador único en ese proyecto para permitir que Ctrlp desee usar su comando especial aquí .

(En mi caso, en realidad quería ignorar los archivos que estaban allí .gitignore, por lo que el git ls-filescomando anterior funciona para mí).

Nathan Long
fuente
Eso es increíble, muchas gracias por esta respuesta.
Denis
git -C% s ls-files --cached --exclude-standard --otros deberían trabajar para git.
Arunprasad Rajkumar
11

Si está utilizando el backend de Silver Searcher para CtrlP (que es mucho más rápido), simplemente agregue un .agignorearchivo al directorio de su proyecto en el mismo formato que .gitignore:

.git/
.hg/
.svn/

Alternativamente, mantenga un ~/.agignorearchivo global .

Agregue el buscador de plata como backend con esto en su .vimrc

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'
fuerte
fuente
1
Gracias por publicar esto. Para agregar otro punto de datos: adapté esto if executable("ag") let g:ctrlp_user_command = 'ag %s -l --nocolor --depth 8 -g ""' endif . El límite de profundidad es útil si accidentalmente presiono ctrl-p mientras edito un archivo en mi carpeta de inicio. Descubrí que la bandera oculta incluiría archivos en .git /
Eric Hu
6

Especifica archivos intencionalmente no rastreados en un archivo

Para resolver esto con un archivo como .gitignore(basado en la solución grep de Nathan), creé un archivo llamado .ctrlpignorey puse los patrones que deberían ignorarse, separados por líneas:

node_modules/
\.log$
...

Y mi configuración ctrlp:

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

Quizás el .gitignoremismo se pueda usar para ignorar los archivos en ctrlp, sin necesidad de crear un nuevo archivo para hacer casi lo mismo.

19WAS85
fuente
Agregué este fragmento, pero rompe el comportamiento general de Ctrlp, si escribo orderscontroller solo encuentra archivos _spec, no hay un archivo orders_controller.rb real.
jedi
1

Como dijo Wagner Andrade , usar una separación .ctrlpignoresería una buena idea.

Una configuración de vim más robusta y conveniente es la siguiente:

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'

.ctrlpignorese puede poner en cualquier directorio que ctrlp reconozca como directorio raíz. Aquí hay un ejemplo, cada línea comienza con./

vim ~/.ctrlpignore

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

Nota:

  1. grep -Finterpretará el patrón, ej. './.tmp', como una cadena fija si no desea que su './ptmp' se filtre. Todavía hay algunos errores triviales: './.tmp' también filtrará './.tmp2'. Olvídalo, no me gusta\.

  2. g:ctrlp_custom_ignoreserá ignorado si g:ctrlp_user_commandestá configurado. Esos podrían hacerse de una manera más compleja.g:ctrlp_user_command

  3. También es posible la lista blanca en lugar de la lista negra. Más conveniente si se implementa en un script separado

zhazha
fuente