LINUX.ORG.RU

допилить bash_completion под себя


0

0

Итак, по результатам обсуждений на этом форуме, я понял, что мне нужно фиксить bash_completion самому.

проблема выглядит так. Есть каталог, в названии которого есть русские буквы. Автодополнение путей с этим каталогом не работает.

демонстрация:

combine@mediacenter /tmp $ shopt -u progcomp
combine@mediacenter /tmp $ cd ./dir\ with\ spaces/Русские\ буквы/<TAB>subdir/^C
combine@mediacenter /tmp $ shopt -s progcomp
combine@mediacenter /tmp $ cd ./dir\\\\\\\ with\\\\\\\ spaces/Русские\\\\\\\ буквы/<TAB><TAB>^C
combine@mediacenter /tmp $ cd ./dir\ with\ spaces/dir_with\'symbol/<TAB>just_dir/

при включенном bash-completion при каждом <TAB> добавляются лишние обратные слэши, только если в пути есть русские буквы. Красивое название каталога с символом ' к проблеме отношения не имеет.

Вот код, который это делает:

 710 _cd()
 711 {
 712     local IFS=$'\t\n' cur="$(_get_cword)" i j k
 713     # Enable -o filenames option, see Debian bug #272660
 714     compgen -f /non-existing-dir/ >/dev/null
 715     COMPREPLY=( $( compgen -o default  "$cur" ) )
 716     return 0
 717 }

 760 if shopt -q cdable_vars; then
 761     complete -v -F _cd $nospace cd
 762 else
 763     complete -F _cd $nospace cd
 764 fi
Я убрал из листинга то, что на воспроизведение проблемы не влияет. Если выключить комплишен - теряется функционал. Если отрубить конкретно эту функцию, то для cd проблема выпрямляется. Но:

  • нельзя отказаться от функции _cd, в ней делается дополнение для каталогов из CDPATH (в листинге поскипано).
  • та же проблема наблюдается при дополнении путей файлов для vim или даже ls, а значит, проблему нужно решить как можно более глобально.

Помогите придумать, что сделать, чтобы ошибка пропала.

Спасибо.

>Помогите придумать, что сделать, чтобы ошибка пропала.

Называть файлы и директории только в ASCII без пробелов, я как снес из-за пробелов пол хомяка зарекся от всяких не ascii с пробелами имен.

anonymous ()
Ответ на: комментарий от xintrea

> Разумный компромис - русские имена без пробелов (пользуй подчеркивание).

это не компромисс, это поражение. Я хочу, чтоб completion работал.

name_no ★★ ()
Ответ на: комментарий от mydoom

> что только не делают, чтоб не использовать zsh.

что называется «йоб вашу мать!»: я заводил тему, где все после обсуждения сказали, что zsh не нужен и лучше пофиксить bash-completion. Где спросить совета, которому можно доверять?

name_no ★★ ()
Ответ на: комментарий от mydoom

> может таки попробовать оба шелла и понять, что больше нравится?

новый шелл с налёту полюбить не получится. Он мне показывает уродский PS1 и у него не работает редактирование только что введённой команды (набираю sah, хочу исправить, left, left, delete, а кнопка delete не работает)

name_no ★★ ()
Ответ на: комментарий от mydoom

> enterом.

плохой вариант.

проще всего будет взять чей-нибудь рабочий конфиг и разобраться в нем. ну и man, конечно.

так вот, на самом деле, проще всего сидеть на bash, к которому давно привык и который давно настроен. Например, на работе у меня в баше алиасов прописано больше, чем я консольных команд знаю. Я в баше уже третий год почти каждый день использую «комбинацию клавиш» Alt+. - есть ли у неё аналог в zsh? (этот «хоткей» вставляет в набираемую команду последний аргумент предыдущей команды)

name_no ★★ ()
Ответ на: комментарий от mydoom

> enterом.

проще всего будет взять чей-нибудь рабочий конфиг и разобраться в нем. ну и man, конечно.


Прощще баш пофиксить.

xintrea ()
Ответ на: комментарий от name_no

>так вот, на самом деле, проще всего сидеть на bash, к которому давно привык и который давно настроен.

возможно. но судя по этому треду, настроен он не до конца.

Например, на работе у меня в баше алиасов прописано больше, чем я консольных команд знаю.


алиасы прекрасно переносятся.

«комбинацию клавиш» Alt+. - есть ли у неё аналог в zsh?


есть. та же самая комбинация.

mydoom ★★★ ()
Ответ на: комментарий от mydoom

>>«комбинацию клавиш» Alt+. - есть ли у неё аналог в zsh?

есть. та же самая комбинация.

та же самая комбинация не работает, как и клавиши home и end. а ещё history не сохраняется. Я понимаю, звучит будто я всё поломал, но я только лишь запустил и смотрю, что вообще работает, а что нет.

name_no ★★ ()
Ответ на: комментарий от name_no

да, из коробки там мало что работает. для home-end-del-etc:

bindkey «\e[1~» beginning-of-line
bindkey «\e[4~» end-of-line
bindkey «\e[5~» beginning-of-history
bindkey «\e[6~» end-of-history
bindkey «\e[3~» delete-char
bindkey «\e[2~» quoted-insert
bindkey «\e[5C» forward-word
bindkey «\eOc» emacs-forward-word
bindkey «\e[5D» backward-word
bindkey «\eOd» emacs-backward-word
bindkey «\ee[C» forward-word
bindkey «\ee[D» backward-word
bindkey «^H» backward-delete-word
# for rxvt
bindkey «\e[8~» end-of-line
bindkey «\e[7~» beginning-of-line
# completion in the middle of a line
bindkey '^i' expand-or-complete-prefix

для history:
HISTFILE=~/.zsh/.histfile
HISTSIZE=1000
SAVEHIST=1000

что-то включает Alt-., но этого я не нашел.
а при первом запуске должен был запуститься помощник настройки.

mydoom ★★★ ()
Ответ на: комментарий от mydoom

> а при первом запуске должен был запуститься помощник настройки.

он и запустился. я настроил, что понял. только он не сохранил настройки и home-end там не настраивалось.

для home-end-del-etc:

как узнать, какая клавиша как называется и какое действие на неё вешать? хочу настроить больше, да и как ни странно home-end так и не заработали, зато заработал delete

name_no ★★ ()
Ответ на: комментарий от mydoom

и что, если нажал влево-вправо, то кнопки вверх-вниз перестают работать? Я нажал вверх, влево - и всё, вверх уже не ищет предыдущую команду.

name_no ★★ ()
Ответ на: комментарий от name_no

действия с описаниями есть в man zshzle. код можно узнать при помощи showkey (у меня оно заработало только в консоли).

mydoom ★★★ ()
Ответ на: комментарий от mydoom

>>и что, если нажал влево-вправо, то кнопки вверх-вниз перестают работать?

у меня работает.

да, работает, но поиск сужается до команды, которая в начале строки стоит.

name_no ★★ ()
Ответ на: комментарий от mydoom

В общем, спасибо за помощь. Довёл zsh до состояния, когда им можно начинать пробовать пользоваться, чем завтра и займусь. Попробую промпт нарисовать или комплишен «волшебно» настроить

name_no ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.