3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ubuntu (Wayland) のgnome-terminalでキーボードだけでクリップボードにコピーしたい

3
Posted at

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(キルリング)と呼ばれます。

シンプルな例だと、以下のような操作です。

  1. ctrl + a # 行頭に
  2. ctrl + k # カーソル以降をkill(いわゆるカット)
  3. ctrl + y # killしたものをyank(いわゆるペースト)
bind -P

これを実行すると、bashが内部で使っているreadlineの編集コマンド一覧を見ることができます。killとあるものは、このキルリングに送る操作をしてくれます(例: alt + ctrl + hは、カーソルの前の単語をキルリングに送る)。

bashで選択範囲を作りたい

さきほどのbind -Pset-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です。

.bashrc
__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で

  1. Alt + [set-mark
  2. カーソルキーで移動して、Alt + ]でクリップボードに送る

ができるようになります。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?