15

私の.zshrcでは、次のスニペットを使用して、シェルのクリップボードとプライマリ X11 クリップボードを統合しています。この統合のおかげで、マウスを使用せずに emacs、firefox、ターミナルとの間でテキストをカット アンド ペーストできます。

kill-line() { zle .kill-line ; echo -n $CUTBUFFER | xclip -i }
zle -N kill-line # bound on C-k

yank() { LBUFFER=$LBUFFER$(xclip -o) }
zle -N yank # bound on C-y

注: 私はこのトリックを mac os x でも使用しています (xclip の代わりに pbcopy/pbpaste を使用)。Synergy のおかげで私の 2 台のコンピューターは 1 つのクリップボードを共有しています。きちんとした。しかし、readline では動作しません。そして、(i)python、gdb、ncftp などで、readline を頻繁に使用していることに気づきました...

ここで私の質問が来ます: readline のクリップボードを the-rest-of-the-world と統合する方法はありますか?

もちろん、私は.inputrcここでいくつかの魔法について考えていますが、洞察/アイデアは大歓迎です.

4

4 に答える 4

15

Bash 4.0 では、いくつかの新しい機能が導入されています。

ニュース

` ' でキー シーケンスに割り当てられたコマンドbind -xは、実行されたコマンドの環境に 2 つの新しい変数を設定するようになりました: READLINE_LINE_BUFFERREADLINE_POINT. このコマンドは、現在の readline 行とカーソル位置を、それぞれREADLINE_LINE_BUFFERとを変更することで変更できます。READLINE_POINT

NEWSファイルが不正確なようです。READLINE_LINE(no _BUFFER) は、他の場所で文書化されており、実際に機能するものです。

Ctrl以下は、Bash の既存の+( U| K| )の動作をシミュレートしますが、既存の機能を上書きしたくないので/Yを使用しますが、X の選択に影響を与えます。MetaEsc

_xdiscard() {
    echo -n "${READLINE_LINE:0:$READLINE_POINT}" | xclip
    READLINE_LINE="${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=0
}
_xkill() {
    echo -n "${READLINE_LINE:$READLINE_POINT}" | xclip
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}"
}
_xyank() {
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$(xclip -o)${READLINE_LINE:$READLINE_POINT}"
}
bind -m emacs -x '"\eu": _xdiscard'
bind -m emacs -x '"\ek": _xkill'
bind -m emacs -x '"\ey": _xyank'

私はまだscreenもっと好きですが、これはあなたの質問へのより良い答えです — あなたが関心のある唯一の readline アプリケーションが Bash である限り.

于 2009-07-06T19:16:57.940 に答える
5

_xyank()ephemient の回答に基づいて、次の関数を提案したいと思います。

_xyank() {
    CLIP=$(xclip -o)
    COUNT=$(echo -n "$CLIP" | wc -c)
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${CLIP}${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=$(($READLINE_POINT + $COUNT))
}

これにより、ヤンクされたテキストの末尾にカーソルが移動し、他の組み込みコマンドとの一貫性が向上します。

于 2010-02-03T00:09:37.117 に答える
5

個人的には、すべてをGNU screen内で実行しています。これにより、readline ベースのプログラムだけでなく、すべての端末ベースのプログラムで多くの機能が得られます。現在のセッションのすべての画面間で共有される独自の貼り付けバッファがあり、交換ファイルを読み書きできます (で構成可能bufferfile)。

  • Ctrl+ A, [, <移動>, Space, <移動>で画面選択を行います。
  • Enter;で貼り付けバッファにコピーされます。
  • Ctrl+ A, ];で貼り付け
  • 交換ファイルの内容をCtrl+ A, <;に置き換えます。
  • Ctrl+ A, .で交換ファイルに書き出されます>

次に必要なのは、同期するための小さなヘルパー/tmp/screen-exchangeと X の選択だけです。これと同じくらい簡単なものが機能します。

# ~/.screenrc (or entered at C-a : command prompt)
bind '{' exec sh -c 'xclip -o>~/.screen_exchange'
bind '}' exec sh -c 'xclip -i ~/.screen_exchange'

もちろん、より良いバインディングとマクロを使用すると作業が楽になります (これにはC-a { C-a < C-a ]X 選択を端末に貼り付ける必要があります) が、それは完全にあなた次第です。

于 2009-06-17T00:40:59.373 に答える
0

ここに書いたように、X クリップボードに入力するために別のキーバインディングを用意したほうがよいことがわかりました。これは、Readline でのテキスト操作に「kill」をよく使用し、毎回クリップボードを一掃したくないためです。 .

Readline が X との対話をトリガーするキーバインドを持つことができるようになったら、^Xw と ^Xy をバインドしてコピー アンド ペーストすることをお勧めします。

これがあなたの質問に対する解決策を提供しないことはわかっていますが、コメントでそれを言うのに十分な担当者がいません.

キーをコマンドにバインドする機能を備えた Readline の拡張については、Readline メーリング リストで取り上げました。

https://lists.gnu.org/archive/html/bug-readline/2016-05/msg00002.html

于 2016-05-02T21:57:34.607 に答える