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

echo "

Это должно автоматически расшириться в

echo ""

и поместите курсор в середину.

Это уже выполнимо в vim и многих других редакторах, я хотел бы иметь такую же функцию и в терминале.

3 ответа3

2

Предполагая, что ваша оболочка - bash, и вы используете режим редактирования emacs (set -o emacs), это ответит на ваш вопрос в скобках и двойных кавычках.

Чтобы объяснить, что там происходит, вот тот, который работает для {}:

bind '"{" "\C-v{}\e[D"'

Давайте прогуляемся по внутренней части. В первой паре ' мы имеем:

{

Это довольно просто, это просто означает заменить левую фигурную скобку следующим материалом.

Вторая пара " начинается с:

\C-v{}

Здесь мы вставляем открывающую и закрывающую скобку. Нам нужны оба, потому что мы заменяем то, что было первоначально напечатано, а не добавляем к нему. \C-v - это символ Control-v , который обозначает дословную вставку (краткая история ключей терминала). Это позволяет нам вставить { без повторного запуска этой привязки. Наконец, мы имеем:

\e[D

Это просто код перехода для клавиши со стрелкой влево, поэтому он перемещает курсор между фигурными скобками.

1

Лучший способ сделать это, если вы используете режим readline vi в bash:

set editing-mode vi
set keymap vi-insert
"\C-b": backward-char
"(": "\C-v()\C-b"
"[": "\C-v[]\C-b"
"{": "\C-v{}\C-b"
"\"": "\C-v\"\C-v\"\C-b"
"\'": "\C-v\'\C-v\'\C-b"
0

В итоге я сделал пять скриптов bash, как показано ниже:

# terminal_autocomplete_brackets.sh
#!/bin/bash

myw=$(xdotool getactivewindow)
if [[ \
    $(xprop -id ${myw} | egrep 'bash .* Konsole') || \
    $(xprop -id ${myw} | egrep 'WM_CLASS.*Navigator.*Firefox') || \
    $(xprop -id ${myw} | egrep 'WM_CLASS.*google-chrome') \
    ]]
then
    xvkbd -xsendevent -text "[]\[Left]" >/dev/null 2>&1
else
    xvkbd -xsendevent -text "["  >/dev/null 2>&1
fi



# terminal_autocomplete_curly.sh
#!/bin/bash

myw=$(xdotool getactivewindow)
if [[ \
    $(xprop -id ${myw} | egrep 'bash .* Konsole') || \
    $(xprop -id ${myw} | egrep 'WM_CLASS.*Navigator.*Firefox') || \
    $(xprop -id ${myw} | egrep 'WM_CLASS.*google-chrome') \
    ]]
then
    xvkbd -xsendevent -text "{}\[Left]" >/dev/null 2>&1
else
    xvkbd -xsendevent -text "{" >/dev/null 2>&1
fi



# terminal_autocomplete_parentheses.sh
#!/bin/bash

myw=$(xdotool getactivewindow)
if [[ \
    $(xprop -id ${myw} | egrep 'bash .* Konsole') || \
    $(xprop -id ${myw} | egrep 'WM_CLASS.*Navigator.*Firefox') || \
    $(xprop -id ${myw} | egrep 'WM_CLASS.*google-chrome') \
    ]]
then
    xvkbd -xsendevent -text "()\[Left]" >/dev/null 2>&1
else
    xvkbd -xsendevent -text "(" >/dev/null  2>&1
fi




# terminal_autocomplete_quotes.sh
#!/bin/bash

myw=$(xdotool getactivewindow)
if [[ \
    $(xprop -id ${myw} | egrep 'bash .* Konsole') || \
    $(xprop -id ${myw} | egrep 'WM_CLASS.*Navigator.*Firefox') || \
    $(xprop -id ${myw} | egrep 'WM_CLASS.*google-chrome') \
    ]]
then
    xvkbd -xsendevent -text "\"\"\[Left]" >/dev/null  2>&1
else
    xvkbd -xsendevent -text "\"" >/dev/null  2>&1
fi



# terminal_autocomplete_squotes.sh
#!/bin/bash

myw=$(xdotool getactivewindow)
if [[ \
    $(xprop -id ${myw} | egrep 'bash .* Konsole') || \
    $(xprop -id ${myw} | egrep 'WM_CLASS.*Navigator.*Firefox') || \
    $(xprop -id ${myw} | egrep 'WM_CLASS.*google-chrome') \
    ]]
then
    xvkbd -xsendevent -text "''\[Left]" >/dev/null 2>&1
else
    xvkbd -xsendevent -text "'"  >/dev/null 2>&1
fi

Затем вы можете использовать xbindkeys для привязки "'[{(к каждому из этих пяти сценариев это работает довольно хорошо.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .