Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
- Индексация путей из переменных окружения
- Индексация директорий из `PATH`
- Пользовательские алиасы через `aliases.json`
- В индекс попадают только существующие директории (не файлы и не отдельные объекты)
- SQLite-хранилище индекса
- Поиск по `name`, `keywords`, `path`
- Преобразование абсолютного пути в псевдопуть (`$VAR/...`) по самому длинному префиксу
Expand All @@ -22,13 +23,45 @@ pip install -e .

## Установка через pipx (глобальная команда `pathi`)

< codex/fix-pip-install-e-installation-issue-omaxnc
Если нужно, чтобы `pathi` была доступна глобально (вне конкретного venv), используйте `pipx`.

На дистрибутивах с PEP 668 (например, Arch) команда
`python3 -m pip install --user pipx` может падать с `externally-managed-environment`.
В этом случае сначала установите `pipx` через пакетный менеджер:

```bash
# Arch
sudo pacman -S python-pipx

# Debian/Ubuntu
sudo apt install pipx

# Fedora
sudo dnf install pipx
```

После этого:

```bash
pipx ensurepath
# перезапустите терминал
pipx install /полный/путь/к/EnvPathShortcutTool
```

Если `pipx` всё ещё не установлен и у вас НЕ PEP668-окружение, можно использовать fallback:
=
Если нужно, чтобы `pathi` была доступна глобально (вне конкретного venv), используйте `pipx`:
> main

```bash
python3 -m pip install --user pipx
python3 -m pipx ensurepath
< codex/fix-pip-install-e-installation-issue-omaxnc
=
# перезапустите терминал
pipx install /полный/путь/к/EnvPathShortcutTool
> main
```

Пример для вашего случая:
Expand Down
3 changes: 3 additions & 0 deletions pathindex/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,9 @@ def cmd_alias_add(args: argparse.Namespace) -> int:
if not Path(p).is_absolute():
print("Alias path must be absolute")
return 2
if not Path(p).is_dir():
print("Alias path must point to an existing directory")
return 2
aliases[args.name] = p
save_aliases(alias_file, aliases)
print(f"Added alias {args.name} -> {p}")
Expand Down
4 changes: 2 additions & 2 deletions pathindex/collectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def path_like(value: str) -> bool:
if not value:
return False
p = Path(value).expanduser()
return p.is_absolute() and p.exists()
return p.is_absolute() and p.is_dir()


def keywords_for(path: str, name: str) -> str:
Expand Down Expand Up @@ -45,6 +45,6 @@ def collect_alias_entries(aliases: dict[str, str]) -> list[IndexEntry]:
entries: list[IndexEntry] = []
for name, raw in aliases.items():
p = str(Path(raw).expanduser())
if Path(p).is_absolute() and Path(p).exists():
if Path(p).is_absolute() and Path(p).is_dir():
entries.append(IndexEntry(name, str(Path(p).resolve()), keywords_for(p, name), "alias"))
return entries
Loading