Автодополнение команды в zsh сразу после установки
krigstask 11 июля, 2008 - 10:14
Перешёл на zsh, но имею пару мелких неприятных моментов, главный из которых состоит в следующем.
Команды/программы прекрасно дополняются по Tab, но только не свежеустановленные. Допустим, установил я какой-нибудь lsof, так сразу после # emerge lsof
zsh про него как бы и не знает, в числе вариантов после, например, $ ls,Tаb,Tаb
команды lsof нету. После перезагрузки (выхода/входа пользователя, перезапуска zsh — точно не проверял, но вроде выхода/входа достаточно) lsof мы уже знаем. В bash, как всем известно, всё в порядке.
Gentoo amd64, но наблюдалось то же самое и на ArchLinux i686. Стало быть, либо таракан zsh, либо я чего-то недоконфигурял...
Можно ли это побороть? Отзовитесь, гуру zsh (-:E
»
- Для комментирования войдите или зарегистрируйтесь
достаточно
достаточно запустить ещё один экземпляр шелла.
Если не достаточно, то нужно осваивать документацию zsh.
Zsh это не тот инструмент который идет со всеми фичами напоказ. Многие (все?) настройки в его дефолтной конфигурации либо закомментированы, либо отсутствуют.
ЗЫ при старте происходит чтение системных конфигов.
хэндбук рекомендует после установки пакета, обновить в шелле переменные среды:
env-update && . /etc/profile
С учетом, того, что портеджи сами выполняют env-update, то логично в каждом открытом интерактивном шелле выполнить source /etc/profile. Но для zsh этого недостаточно, надо ещё свои конфиги перечитать :)
:)
Ы
Это всё понятно, хотелось бы знать, в каком направлении рыть. Выгуглилось setopt HASH_CMDS, но эффекта не даёт. Видимо, не то там хэшируется... Или не тогда (-:Е
Пожалуйста, не описывайте своё железо в подписи
самое простое
самое простое
PATH="${PATH}"
:)
можно и так: ###
можно и так:
### Forcing the rehash
_force_rehash() {
(( CURRENT == 1 )) && rehash
return 1
}
### Loading the completion style
zstyle ‘:completion:*’ completer _oldlist _expand _force_rehash _complete
Пока не очень
Пока не очень понятно, что это всё значит, но спасибо. Будем пробовать (-%Е
Пожалуйста, не описывайте своё железо в подписи
Заработало,
Заработало, спасибо (-:Е
Пожалуйста, не описывайте своё железо в подписи
Я тут подумал и
Я тут подумал и решил, что дело вряд ли в особенности bash. Скорее всего, дело просто в том, что emerge после установки перезагружает bash'евы установки. Так что рыть, наверное, лучше в ту сторону... Может, есть у кого-нибудь идеи по такому поводу? (-:Е
Пожалуйста, не описывайте своё железо в подписи
это
это неверно.
согласно man bash:
"If the name is neither a shell function nor a builtin, and contains no slashes, bash searches each element of the PATH for a directory containing an executable file by that name. Bash uses a hash table to remember the full pathnames of executable files (see hash under SHELL BUILTIN COMMANDS below). A full search of the directories in PATH is performed only if the command is not found in the hash table. If the search is unsuccessful, the shell prints an error message and returns an exit status of 127."
Z-shell не выполняет "A full search of the directories in PATH is performed only if the command is not found in the hash table." Но делает: "When this (PATH) parameter is set, each directory is scanned and all files found are put in a hash table." Поэтому и возникает необходимость рехеширования новых файлов появившихся в директориях ${PATH}, либо переопределением данной переменной (параметра), либо принудительным рехешированием, как в приведенном выше примере.
:)
паыв
Это же в разделе "Command Execution"
Хотя...
Попробовал так:
VerkDatorn ~ # nano /usr/bin/tmp
#!/bin/bash
echo 1
VerkDatorn ~ # chmod +x /usr/bin/tmp
Набираю tm[Tab] — уже знает новую команду.
Хм
Это в .zshrc? Что-то я не понимаю, как это должно сработать (-:Е
Попробуем попробовать (-:Е
Пожалуйста, не описывайте своё железо в подписи
1) PATH="${PATH}" -
1) PATH="${PATH}" - выполняется в текущем шелле.
2) для тестов можете делать так:
открываете новый шелл и там sudo cp -p /usr/bin/tmp /usr/bin/tmp1
переходите в предыдущий шелл, и пытаетесь автодополнить до tmp1
:)
1. Ну это не
1. Ну это не решение совсем, мне проще ещё один zsh запустить (-:Е
2. Попробую (-:Е
Пожалуйста, не описывайте своё железо в подписи