Несколько подпрограмм завершения табуляции в терминале Bash

Возможно ли иметь несколько процедур завершения табуляции, запускаемых разными комбинациями клавиш?

Например, у меня есть пользовательская функция завершения табуляции, которая анализирует вывод myprog -help для вариантов завершения табуляции. Можно ли каким-то образом сохранить стандартное поведение завершения табуляции на Tab нетронутым и привязать свое пользовательское завершение к чему-то вроде Shift+Tab?


person ajwood    schedule 12.07.2013    source источник
comment
Я думаю, вы можете добиться этого, используя bind...   -  person anishsane    schedule 15.07.2013


Ответы (1)


Сами сочетания клавиш являются частью readline, и их можно изменить в ~/.inputrc или использовать команду bind в .bashrc (и т. д.), но они не привязываются напрямую к пользовательским функциям, а только косвенно. как макросы, которые могут вызывать эти функции.

"\C-xhf": dump-functions        # for ~/.inputrc
bind '"\C-xhf":dump-functions'  # in .bashrc (etc.)

bind -l покажет вам встроенные функции, к которым вы можете привязаться. Вы можете добавить макросы таким образом, что позволит вам запускать любую функцию bash, которую вы хотите, хотя и не в контексте завершения, чтобы результаты не возвращались обратно в командную строку. Пример:

"\C-xc":  "echo hi\n"       # note it's a just macro, not a direct binding.

Я предполагаю, что вы уже знаете, что вы можете переопределить завершение с помощью встроенной команды complete слева в командной строке. Обычно я бы просто предложил создать ваши собственные процедуры завершения таким образом и использовать их вместо того, чтобы разрабатывать способ вызова альтернативного набора. Пример:

_complete_ssh ()
{
    local ssharg="${COMP_WORDS[COMP_CWORD]}"
    local filter=cat
    case "$ssharg" in *@*) filter="sed s/^/${ssharg%@*}@/" ;; esac
    local host=${ssharg##*@}
    COMPREPLY=( $(compgen -W "`
        sed 's/[, ].*//'  ~/.ssh*/known_hosts{,2} | sort | uniq
    `" $host | $filter ))
    return 0
}
complete -F _complete_ssh ssh          # for any command starting with "ssh "...

Я экспериментировал с привязкой universal-argument, чтобы посмотреть, повлияет ли это на запуск функции через макрос ("C-xu" для префикса UA, затем "C-xf" для запуска функции), но я не заметил ничего, что указывало бы на функцию. может обнаружить UA. Вы могли бы подумать, что у bind будет возможность повторить то, что было UA для предыдущей команды, или $-что-то, что могло бы позволить определяемой пользователем подфункции завершения обнаруживать UA изнутри complete и, таким образом, вести себя по-другому, но я не вижу никаких признаков идеи в исходном коде readline. Не существует очевидного способа увидеть, какая привязка клавиш вызвала функцию или макрос (я этого не ожидал), чтобы разрешить сопоставление двух привязок клавиш с одной и той же встроенной функцией complete, а затем вернуться назад, чтобы увидеть, какая привязка клавиш вызвала ее.

Обратите внимание, что Shift-TAB в любом случае было бы сложно связать, и его невозможно было бы ввести с терминала старой школы. bash не использует библиотеки X и не может видеть Shift напрямую как модификатор, вместо этого полагаясь на терминалы или эмуляторы терминалов для ввода в некотором наборе символов, которые не имеют применимой концепции модификаторов.

person Alex North-Keys    schedule 19.07.2013