Отключить «умное» автозаполнение zsh для команды gem, но оставить обычное завершение пути

$ VBoxManage showvminfo 'Test Machine' --machinereadable | sed -n '/^UUID=/{ s///; s/"//gp; }'
1ce7ffef-8faa-4138-9b92-466698762f62

Вместо использования команды list vmssub -используется команда sub -showvminfo, которая получает всю информацию для конкретной машины (здесь VM с именемTest Machine). В --machinereadableэто выводит данные в форме, которую легко анализировать. UUID виртуальных машин будет выводиться как

UUID="1ce7ffef-8faa-4138-9b92-466698762f62"

, который обнаруживает команда sed. Он удаляет бит UUID=и все двойные кавычки, а затем печатает все, что осталось.

Команду sedможно записать несколькими способами. Вариант, например,

sed -n 's/^UUID="\(.*\)"$/\1/p'
1
12.11.2021, 19:52
1 ответ

Предположим, что вы используете «новую» (1990-е )систему завершения, т. е. вызов compinitесть в вашей.zshrc(или в структуре конфигурации zsh, если вы ее используете ). ], вы можете переопределить стандартные завершения двумя способами:

  • Вы можете переопределить функцию завершения, такую ​​как _gem(, для всех команд, которые ее используют ), поместив функцию с тем же именем в каталог, который идет первым в $fpath. Этот каталог должен присутствовать в $fpathперед вызовом compinit.
  • Вы можете позвонить по номеру compdef, чтобы отменить настройку compinit. Это нужно сделать после вызова compinit.

Таким образом, чтобы просто заполнить имена файлов после gem, запустите это после вызоваcompinit:

compdef _files gem

Впрочем, на столь радикальные меры идти не нужно. Есть способы выполнить завершение файла, даже если zsh считает, что контекст требует чего-то другого.

Концептуально самый простой, но не самый удобный способ — временно изменить контекст. Например, введите ;l , завершите имя файла, а затем удалите ;l . Или Home0End , введите имя файла, HomeDelEnd .

Вы можете привязать_bash_complete-wordк привязке клавиш, оканчивающейся на /, например ^X/. Затем нажмите ^X/в любом месте, чтобы завершить имя файла. В вашем случае это работает только в том случае, если вы ставите пробел после --with-pg_config, а не знак равенства, поскольку этот виджет не рассматривает =как разделитель.

Возможно, вы можете воспользоваться преимуществами _most_recent_file, привязанного к ^Xmпо умолчанию. Это завершает самое последнее имя файла, независимо от контекста. В вашем случае это работает только в том случае, если вы ставите пробел после --with-pg_config, а не знак равенства, поскольку этот виджет не рассматривает =как разделитель. Например:--with-pg_config /o^Xm/h^Xm/o^Xm/*pq^Xm

Вы можете определить свой собственный виджет завершения для завершения файлов и привязать его к клавише.

_complete_files () {
  if [[ $PREFIX == [-0-9A-Z_a-z]##=* ]]; then
    IPREFIX+=${PREFIX%%\=*}=
    PREFIX=${PREFIX#*=}
  fi
  _main_complete _files
}
zle -C _complete_files complete-word _complete_files
bindkey '\e^F' _complete_files

Затем вы можете нажать Ctrl+Alt+F в любом месте, чтобы завершить имя файла.Эта функция завершает текущее слово оболочки независимо от контекста, за исключением того, что она игнорирует префикс, например --option=.

1
12.11.2021, 21:50

Теги

Похожие вопросы