Сами сочетания клавиш являются частью 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
bind
... - person anishsane   schedule 15.07.2013