Вывести символ перед курсором и после курсора

Вопрос или проблема

Мне нужна функция 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

Выводит их как Message под приглашением.

Ответ или решение

Для реализации функции, которая будет печатать символ перед курсором и символ после курсора в 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

Объяснение кода:

  1. Получение символов перед и после курсора:

    • Мы используем LBUFFER для получения текста слева от курсора и RBUFFER для текста справа.
    • Если курсор не в начале строки, мы получаем последний символ из LBUFFER.
    • Если курсор не в конце строки, мы получаем первый символ из RBUFFER.
  2. Вывод символов:

    • Мы используем команду print -P, чтобы распечатать символы с цветом (в данном случае зеленым).
  3. Привязка к клавиатуре:

    • При помощи zle -N мы создаем новую Zsh функцию, а также связываем её с клавишами Ctrl+P.

Тестирование:

Данная функция должна корректно работать в следующих случаях:

  • Если курсор находится в начале строки:

    • Ввод: |This is a input
    • Вывод: T (символ после курсора)
  • Если курсор находится в конце строки:

    • Ввод: This is a input|
    • Вывод: t (символ перед курсором)
  • Если курсор находится в середине строки:

    • Ввод: This is a inp|ut
    • Вывод: pu (символы до и после курсора)

Таким образом, данное решение полностью решает вашу задачу, обеспечивая корректную обработку различных случаев расположения курсора.

Оцените материал
Добавить комментарий

Капча загружается...