gnome-terminal(bash)でのコピーアンドペースト
gnome-terminal(bash)上では、ほかアプリケーションで当たり前のようにできるShift + left / rightといった選択範囲の作成が出来ません。コマンドプロンプトでShift + leftすると、だいたいDが出力されることが多いです。
でも、OSのクリップボードからのコピーアンドペーストは受け付けてくれます。
マウスで操作したら、選択範囲は作れるので、普通にコマンドプロンプトの文字列や標準出力をCtrl + Shift + cでコピーし、Ctrl + Shift + vでペーストは出来ます。
OSのクリップボードとは別に存在するクリップボード(kill ring)
シェルにはOSのクリップボードとは別のクリップボードが存在します。これはkill ring(キルリング)と呼ばれます。
シンプルな例だと、以下のような操作です。
-
ctrl + a# 行頭に -
ctrl + k# カーソル以降をkill(いわゆるカット) -
ctrl + y# killしたものをyank(いわゆるペースト)
bind -P
これを実行すると、bashが内部で使っているreadlineの編集コマンド一覧を見ることができます。killとあるものは、このキルリングに送る操作をしてくれます(例: alt + ctrl + hは、カーソルの前の単語をキルリングに送る)。
bashで選択範囲を作りたい
さきほどのbind -Pでset-markとあるのが、選択範囲を作成する操作です。デフォルトではCtrl + Space(あるいはAlt + Space)になっているのですが、たぶんUbuntuが使ってるのかしら、多くの環境で無反応だと思います。GUIとTerminalが共存してなかった時代の名残なのでしょう。
せっかくなので、キーボードだけで選択範囲を作る体験をしてみたいと思います。以下を実行します。
bind '"\e[": set-mark' && bind '"\e]": kill-region'
コマンドラインの任意の場所で、Alt + [を打鍵します。見た目は何も変わりませんが、set-markされています。カーソルキーやalt + f /bなどで移動をして、Alt + ]を打鍵します。これで選択範囲がキルリングに送られるので、ctrl + yで貼付できます。
OSのクリップボードを操作できるwl-clipboard
これでterminalのなかで、わりと自在にコピペ生活ができるようになるのですが、kill ring は OS のクリップボードとは完全に別物です。ぜひともterminalとそれ以外の壁を超えてクリップボードを共有したくなります。そのための機能がwl-clipboardで提供されています。
sudo apt install wl-clipboard
でインストールできます。使い方は、wl-clipboard: Wayland clipboard utilitiesに詳しく書いてありますが、このパッケージを入れると、コマンドラインで
echo "foo" | wl-copy
としたら、fooがクリップボードに入ってくれるので、terminalの外で使うことができるようになります。ほかにも標準出力をパイプで受け取れるので、そうとういろんなことが出来ます。
bashの選択範囲をwl-copyでコピーする
ここまできたら、キーボードだけでterminalから文字列をクリップボードにもらう準備が出来ます。
以下、ChatGPTに書いてもらったShellscriptです。
__copy_region_to_clipboard__() {
local line="$READLINE_LINE"
local p="$READLINE_POINT"
local m="$READLINE_MARK"
# Do nothing if mark is not set
if [[ -z "$m" ]]; then
return
fi
# Normalize region boundaries
local start end
if (( p < m )); then
start="$p"
end="$m"
else
start="$m"
end="$p"
fi
# Extract the selected region
local copy="${line:start:end-start}"
# Send the region to the Wayland clipboard
printf '%s' "$copy" | wl-copy
}
# Start region selection (set-mark)
bind '"\e[": set-mark'
# Copy selected region to clipboard
bind -x '"\e]": __copy_region_to_clipboard__'
.bashrcに入れると、terminalで
-
Alt + [でset-mark - カーソルキーで移動して、
Alt + ]でクリップボードに送る
ができるようになります。