Инструменты расширения текста для Linux?

0

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

echo "

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

echo ""

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

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

QED
источник

Ответы:

2

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

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

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

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

{

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

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

\C-v{}

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

\e[D

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

8bittree
источник
Это все хорошо, но если у меня есть set editing-mode vi, это выводит меня из режима вставки после автозаполнения, что довольно раздражает.
Qed
Справедливо, я добавлю заметку о том, что это единственный способ редактирования в emacs, к моему ответу и дам вам голос.
8bittree
1

Лучший способ сделать это, если вы используете режим чтения read 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"
QED
источник
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 для привязки "'[{(к каждому из этих пяти сценариев это работает довольно хорошо.

QED
источник