Функция автозаполнения Bash не работает, когда я создаю функцию для Emacs

Подробная информация о моей системе: я использую Ubuntu 12.04.4 LTS в Oracle Virtual Box 4.3.6, из Windows 8.1, установленной на ноутбуке Asus. Я использую выпуск bash_completion версии 1.3 (я получил это из комментариев к файлу / etc / bash_completion)

Я думал, что bash всегда выполнял автозаполнение для файлов и каталогов после команды. Но после поиска в Google и прочтения дополнительной информации о bash_completion я понял, что это отличается для разных команд. Но я столкнулся с проблемой с этой функцией автозаполнения bash при использовании альтернативного способа вызова emacs -nw.

Я определил ee как функцию в моем файле ~/.bash_aliases. Я знаю, что это не псевдоним, но я просто использую функцию, чтобы сделать то, что сделал бы псевдоним:

function ee () {
    emacs -nw "$@"
}

export -f ee

Я думал, что я все еще мог бы использовать завершение tab с функцией ee, если бы набрал частичное имя файла. Это просто не похоже на работу. Принимая во внимание, что если бы я набрал emacs -nw, а затем частичное имя файла, завершение вкладки работает отлично. Я действительно не понимаю, чего здесь не хватает. Я проверил вывод команды complete -p и получаю следующее для emacs и ee:

eakangk@eakan-u-vbox:~$ complete -p | grep 'ee'
complete -F _filedir_xspec ee
eakangk@eakan-u-vbox:~$ complete -p | grep 'emacs'
complete -F _filedir_xspec emacs

Не означает ли это, что обе команды должны давать мне одинаковое поведение, когда пытаться автозаполнение? Изменить: я не видел строку ee в файле /etc/bash_completion при публикации вопроса. Но теперь я знаю, что это там. Но файл / etc / bash_completion имеет следующие строки:

complete -f -X '!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)' ee
complete -f -X '*.@(o|so|so.!(conf)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)' vi vim gvim rvim view rview rgvim rgview gview emacs xemacs sxemacs kate kwrite

Что я здесь не так делаю?

4
задан 07.05.2020, 06:48

1 ответ

Это связано с пакетом bash-complete . Он имеет некоторый пользовательский набор завершений для emacs, и, очевидно, такое же завершение завершается неудачно, когда имя команды отличается.

Я сам не использую bash-complete, но я быстро взглянул на источник и обнаружил следующее:

_install_xspec '*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)' vi vim gvim rvim view rview rgvim rgview gview emacs xemacs sxemacs kate kwrite

, который, вероятно, используется, чтобы сказать «для этих команд, не завершают файлы, оканчивающиеся на .gif, .mp3, .avi и т. д. ", и я предполагаю, что если для вашей команды ee нет строки _install_xspec, она ничего не завершит.

Глядя на функцию _install_xspec, она просто помещает эти значения в ассоциативный массив с именем _xspecs, используя имя команды в качестве ключа, поэтому, если вы запустите _xspecs[ee]=${_xspecs[emacs]}, команда ee должна получить те же завершения, что и emacs.

3
ответ дан 07.05.2020, 06:48
  • 1
    Ничего себе! geirha благодарит за подсказку. Но I' m любопытный, где Вы нашли тот бит кода. Я думал, что должен был просто посмотреть на пользовательские переопределения завершения. И вся пользовательская конфигурация завершения должна быть в /etc/bash_completion.d/. Но grep на /etc/bash_completion.d/ каталог didn' t помогают мне найти те строки. И прием didn' t работают:' (. – Community 07.05.2020, 06:49
  • 2
    @EakanGopalakrishnan, у меня был беглый взгляд снова, и я заметил, что у меня был typoed arrayname. It' s _xspecs, не _xspec. I' ve отредактировал ответ соответственно. – ccman 07.05.2020, 06:49
  • 3
    @EakanGopalakrishnan, в /etc/bash_completion – chuz 07.05.2020, 06:49
  • 4
    @saurav, конечно, я был бы, если он решил мою проблему. Но это не сделало. I' m все еще испытывающий альтернативы. – ceph3us 07.05.2020, 06:50
  • 5
    @EakanGopalakrishnan, да, поскольку я сказал, я don' t используют завершение удара самостоятельно и меня don' t хотят установить его снова в моей основной системе только для тестирования. Так или иначе, complete -r ee также хорошее решение. Это удаляет пользовательское завершение для команды ee, которая приведет к завершениям по умолчанию вместо этого, который достаточно хорош для большинства команд. – Lucas Holt 07.05.2020, 06:50

Теги

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