Отправьте zsh приглашение в программу и замените контент результатом - PullRequest
0 голосов
/ 01 мая 2018

Я хотел бы отправить свое приглашение в мое приложение сниппетов и заменить строку результатом:

Пример начальной подсказки:

$ while foo bar

Пример замененного приглашения:

$ while foo ; do bar ; done

Получив первое приглашение, я бы запустил ярлык и заменил строку значением, возвращаемым программой.

Я думаю, что решение будет примерно таким:

bindkey "^y" evaluateSnippets
evaluateSnippets() {
    return mySnippetsTool <<< "$promptLine"
}

Как мне это сделать в zsh?

Еще один коррелированный вопрос: возможно ли заменить только выбранную часть приглашения в другом ярлыке.

1 Ответ

0 голосов
/ 02 мая 2018
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

( Примечание: может потребоваться некоторая подстройка для индексов и диапазонов, чтобы соответствовать ожиданию того, что в данный момент выбрано. Например, является ли текущая позиция курсора частью выбора или нет .)

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

...