evaluate-snippets () {
BUFFER=$(mySnippetsTool <<< $BUFFER)
}
zle -N evaluate-snippets
bindkey '^Y' evaluate-snippets
Внутри виджетов (также называемых функциями привязок клавиш) содержимое буфера редактирования содержится в параметре BUFFER
. Буфер редактирования также можно изменить, записав в BUFFER
. Таким образом, сохранения вывода mySnippetsTool
в BUFFER
должно быть достаточно. Команда zle -N foo
создает виджет с именем foo
, который при вызове запускает функцию с тем же именем.
Поскольку вы можете манипулировать содержимым BUFFER
любым удобным для вас способом, можно также изменять только его части. Главное предостережение заключается в том, что выбор должен быть сделан из оболочки - например, visual-mode
( v ) с комбинациями клавиш vicmd или set-mark-command
( Control + @ ) с комбинациями клавиш emacs - и (возможно, ) нельзя сделать с помощью мыши. Например:
evaluate-snippets-selection () {
if [[ $CURSOR -gt $MARK ]]; then
start=$MARK
end=$(( CURSOR + 1 ))
else
start=$(( CURSOR + 1 ))
end=$MARK
fi
BUFFER="$BUFFER[0,start]$(mySnippetsTool <<< $BUFFER[start+1,end])$BUFFER[end+1,-1]"
}
zle -N evaluate-snippets-selection
bindkey '^Z' evaluate-snippets-selection
( Примечание: может потребоваться некоторая подстройка для индексов и диапазонов, чтобы соответствовать ожиданию того, что в данный момент выбрано. Например, является ли текущая позиция курсора частью выбора или нет .)
Возможно, вам даже не понадобятся отдельные команды. Пока вы не установили метку и курсор находится в самом конце строки, обе команды должны давать одинаковые результаты.