Вопрос или проблема
Мне нужна функция zle, которая будет выводить символ перед и после курсора.
print-char-before-after() {
# Получить позицию курсора
local cursor_pos=$CURSOR
# Получить текст в текущей строке
local line_text=${BUFFER}
}
# Привязать функцию к комбинации клавиш (например, Ctrl+P)
zle -N print-char-before-after
bindkey '^P' print-char-before-after
Учитывая, что вертикальная черта — это курсор, если ввод:
Это ввод|
Вывод будет pu
Она должна работать в начале и в конце строки, а также на многостренном буфере.
Если ввод:
|Это ввод
Вывод будет T
Если ввод:
Это ввод|
Вывод будет t
Как я могу это сделать?
ОБНОВЛЕНИЕ 1:
Код, который частично решает мою проблему:
print-char-before-after() {
# Получить символы из левого и правого буферов
local before_char=""
local after_char=""
# Проверить, если курсор не в начале строки
if [[ -n "$LBUFFER" ]]; then
before_char=${LBUFFER[-1]} # Последний символ LBUFFER
fi
# Проверить, если курсор не в конце строки
if [[ -n "$RBUFFER" ]]; then
after_char=${RBUFFER[1]} # Первый символ RBUFFER
fi
# Вывести символы перед и после
echo "${before_char}${after_char}"
}
# Привязать функцию к комбинации клавиш (например, Ctrl+P)
zle -N print-char-before-after
bindkey '^P' print-char-before-after
print-char-before-after() zle -M -- $BUFFER[CURSOR,CURSOR+1]
zle -N print-char-before-after
bindkey '^P' print-char-before-after
Выводит их как M
essage под приглашением.
Ответ или решение
Для реализации функции, которая будет печатать символ перед курсором и символ после курсора в Zsh, можно воспользоваться следующей реализацией. Данная функция будет корректно обрабатывать случаи, когда курсор находится в начале строки, в конце строки, а также при многострочном вводе.
Вот полное решение:
print-char-before-after() {
# Получаем символ перед и после курсора
local before_char=""
local after_char=""
# Проверяем, если курсор не в начале строки
if [[ $CURSOR -gt 0 ]]; then
# Извлекаем последний символ LBUFFER (текст перед курсором)
before_char=${LBUFFER: -1}
fi
# Проверяем, если курсор не в конце строки
if [[ $CURSOR -lt ${#BUFFER} ]]; then
# Извлекаем первый символ RBUFFER (текст после курсора)
after_char=${RBUFFER:0:1}
fi
# Печатаем символы в формате "символ перед курсором + символ после курсора"
# Если символа не существует, то вместо него будет пустая строка
print -P "%F{green}${before_char}${after_char}%f"
}
# Привязываем функцию к комбинации клавиш (например, Ctrl+P)
zle -N print-char-before-after
bindkey '^P' print-char-before-after
Объяснение кода:
-
Получение символов перед и после курсора:
- Мы используем
LBUFFER
для получения текста слева от курсора иRBUFFER
для текста справа. - Если курсор не в начале строки, мы получаем последний символ из
LBUFFER
. - Если курсор не в конце строки, мы получаем первый символ из
RBUFFER
.
- Мы используем
-
Вывод символов:
- Мы используем команду
print -P
, чтобы распечатать символы с цветом (в данном случае зеленым).
- Мы используем команду
-
Привязка к клавиатуре:
- При помощи
zle -N
мы создаем новую Zsh функцию, а также связываем её с клавишами Ctrl+P.
- При помощи
Тестирование:
Данная функция должна корректно работать в следующих случаях:
-
Если курсор находится в начале строки:
- Ввод:
|This is a input
- Вывод:
T
(символ после курсора)
- Ввод:
-
Если курсор находится в конце строки:
- Ввод:
This is a input|
- Вывод:
t
(символ перед курсором)
- Ввод:
-
Если курсор находится в середине строки:
- Ввод:
This is a inp|ut
- Вывод:
pu
(символы до и после курсора)
- Ввод:
Таким образом, данное решение полностью решает вашу задачу, обеспечивая корректную обработку различных случаев расположения курсора.