Выберите из меню завершения Zsh по номеру - PullRequest
0 голосов
/ 31 октября 2018

На днях я обнаружил эту маленькую хитрость навигации, которая позволяет мне запускать меню по номеру при вводе 'cd -'

~ cd -
0 -- ~/home
1 -- ~/home/stuff
2 -- ~/downloads
3 -- ~/wallpaper

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

DIRSTACKSIZE=9
DIRSTACKFILE=~/.zdirs

if [[ -f $DIRSTACKFILE ]] && [[ $#dirstack -eq 0 ]]; 
   then dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
   [[ -d $dirstack[1] ]] && cd $dirstack[1] && cd $OLDPWD
fi
  chpwd() {
  print -l $PWD ${(u)dirstack} >$DIRSTACKFILE

}

Волшебную часть можно выбирать из списка по номеру, но я узнал, что это, вероятно, потому что функциональность для навигации по номеру встроена в команду 'cd -'. Тем не менее, я хотел бы использовать это везде.

Любые подсказки, пишущие функцию-обертку (или что-то подобное, я полагаю) для меню завершения, которое отправляет завершения из меню при его запуске и отображает их в нумерованном списке, где эти цифры выбирают соответствующий элемент?

Я начал читать руководство, а что нет, но все остается довольно непрозрачным. Спасибо!

1 Ответ

0 голосов
/ 01 ноября 2018

Во-первых, фрагмент кода, который вы показываете, не имеет никакого отношения к завершению. Вместо этого он записывает стек каталогов в файл, чтобы сохранить его между сеансами zsh. (Лично я даже не уверен, что это хорошая идея.)

Хорошим местом для начала изучения zsh-завершений является виджет _complete_help ZLE. По умолчанию она привязана к ^Xh в карте клавиатуры zsh viins (vi insert), но не привязана по умолчанию в таблице клавиш emacs. Если вы хотите использовать его в emacs раскладке клавиатуры (по умолчанию для многих людей), вы должны связать его:

bindkey -M emacs "^Xh" _complete_help

Теперь вы можете ввести cd - (или cd +) и следовать за ним, набрав CTRL-X h вместо TAB . Вы должны увидеть следующий вывод:

tags in context :completion::complete:cd::
    directory-stack  (_directory_stack _cd)

(На данный момент я признаю, что мы приближаемся к пределам моих знаний о системе завершения zsh.)

Теперь вы можете увидеть завершающие функции для тега directory-stack в этом конкретном контексте. Вероятно, вас интересует _directory_stack, и вы можете увидеть содержимое этой функции с помощью:

functions _directory_stack

… вот где на самом деле генерируются эти первые числа.

Возможно, возможно написать аналогичные функции завершения для других контекстов завершения и применить использование zstyle. Тем не менее, это нетривиальная магия завершения, и помимо всего, что я пытался

...