回答:
シェルがbashであり、emacs編集モード(set -o emacs
)を使用していると仮定すると、これは括弧と二重引用符に関する質問に答えます。
そこで何が起こっているのかを説明するために、ここで機能するものを次に示します{}
。
bind '"{" "\C-v{}\e[D"'
の内部を散歩しましょう'
。最初のペアに"
は次のものがあります。
{
これは非常に簡単です。左中括弧を次のものに置き換えるだけです。
2番目のペアは次のもので"
始まります。
\C-v{}
ここで、開き括弧と閉じ括弧を挿入します。最初に入力したものを追加するのではなく置換するため、両方が必要です。\C-v
でControl-vそのまま挿入(の略文字、端末キーの簡単な歴史)。これにより、{
このバインディングを再度トリガーせずにを挿入できます。最後に、次のものがあります。
\e[D
これは左矢印キーのエスケープコードに過ぎないため、カーソルを中括弧の間に移動します。
私は最終的に以下の5つの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を使用して、「 '[{(これら5つのスクリプトのそれぞれにバインドします。これは非常にうまく機能します。
set editing-mode vi
、オートコンプリート後に挿入モードを終了します。これは非常に迷惑です。