
Я хочу использоватьрипгрепна моей машине Ubuntu 20. Я установил его из разных репозиториев (apt, щелк, груз) и даже построил его сам, но всегда сталкивался с одной и той же проблемой:
Согласно руководству, можно просто запустить
rg 'pattern'
и ripgrep просто будет рекурсивно искать в текущем рабочем каталоге. Однако мне кажется, что он всегда ожидает также спецификатор пути, что подтверждается тем фактом, что он не найдет совпадений, даже если файл с шаблоном присутствует на верхнем уровне текущего каталога.
Ripgrep сработает только если я сделаю что-то вроде:
rg 'pattern' *
Это не было бы большой проблемой, но я собираюсь использовать ripgrep в vim-addon, который ожидает поведения из руководства. Поэтому вопрос: почему ripgrep ведет себя так странно и как мне исправить это поведение?
Редактировать:
Выполнение команды с --debug
флагом дает следующий вывод:
DEBUG|grep_regex::literal|grep-regex/src/literal.rs:59: literal prefixes detected: Literals { lits: [Complete(test)], limit_size: 250, limit_class: 10 }
DEBUG|globset|globset/src/lib.rs:435: built glob set; 0 literals, 0 basenames, 11 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 0 regexes
DEBUG|globset|globset/src/lib.rs:435: built glob set; 0 literals, 0 basenames, 11 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 0 regexes
DEBUG|globset|globset/src/lib.rs:435: built glob set; 0 literals, 0 basenames, 11 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 0 regexes
DEBUG|globset|globset/src/lib.rs:435: built glob set; 0 literals, 0 basenames, 11 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 0 regexes
DEBUG|globset|globset/src/lib.rs:430: glob converted to regex: Glob { glob: "**/*", re: "(?-u)^(?:/?|.*/)[^/]*$", opts: GlobOptions { case_insensitive: false, literal_separator: true, backslash_escape: true }, tokens: Tokens([RecursivePrefix, ZeroOrMore]) }
DEBUG|globset|globset/src/lib.rs:435: built glob set; 0 literals, 0 basenames, 0 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 1 regexes
DEBUG|globset|globset/src/lib.rs:435: built glob set; 0 literals, 0 basenames, 11 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 0 regexes
DEBUG|ignore::walk|ignore/src/walk.rs:1639: ignoring ./.cache: Ignore(IgnoreMatch(Gitignore(Glob { from: Some("./.gitignore"), original: "*", actual: "**/*", is_whitelist: false, is_only_dir: false })))
...
и затем он совпадает с последней строкой для каждой подпапки моего домашнего каталога.
решение1
Хорошо, спасибо @Brian, я решил проблему.
ripgrep
имеет встроенную логику игнорирования, автоматически игнорируя файлы, которые он находит в формате .gitignore
.
Чтобы сохранить мои dotfiles через git, я настроил репозиторий в своем домашнем каталоге, который по умолчанию игнорирует все файлы, кроме тех, которые я добавляю с помощью git add -f ...
. То есть в своем .gitignore
файле в домашнем каталоге я игнорирую все ( *
) файлы, что в свою очередь заставило ripgrep также игнорировать их. Я не думаю, что слишком много людей столкнутся с той же проблемой, но, возможно, это когда-нибудь кому-то поможет.