Salin dan tetapkan di Bash seperti di Emacs?

16

Saya ingin dapat menyalin dan menempelkan teks pada baris perintah di Bash menggunakan binding keyboard yang sama dengan yang digunakan Emacs secara default (yaitu menggunakan C-spaceuntuk set-mark, M-wuntuk menyalin teks C-y,, M-yuntuk menempelkannya, dll.).

The dokumentasi GNU Bash mengatakan bahwa Bash datang dengan beberapa binding kunci ini diatur secara default.

Misalnya, menarik ( C-y) berfungsi secara default di terminal saya. Namun, saya tidak bisa mendapatkan set-markdan copyperintah untuk bekerja, dan mereka tampaknya tidak terikat dengan kunci apa pun secara default.

Biasanya, cara pengguna dapat mendefinisikan binding kuncinya sendiri adalah dengan menambahkannya .inputrc. Jadi saya mencari dan menemukan fungsi bash berikut dalam dokumentasi yang saya anggap dapat membantu saya mendefinisikan perilaku seperti Emacs yang saya inginkan (yaitu set-markdengan C-spacedan copydengan M-w).

copy-region-as-kill ()

Salin teks di wilayah ke buffer kill, sehingga dapat disentak segera. Secara default, perintah ini tidak terikat.

dan

set-mark (C-@)

Tetapkan tanda ke titik. Jika argumen numerik diberikan, tanda diatur ke posisi itu.

Jika saya mengerti dengan benar, di atas berarti bahwa copy-region-as-killtidak terikat ke urutan keyboard apa pun secara default, sementara set-markterikat C-@secara default.

Saya mencoba C-@di terminal saya, tetapi saya pikir itu tidak berjalan set-markkarena saya tidak melihat teks yang disorot ketika saya memindahkan kursor saya. Bagaimanapun, saya mencoba menambahkan binding keyboard ( M-wdan C-) ke fungsi copy-region-as-killdan set-markdi atas di saya .inputrcdan kemudian memuat kembali dengan C-x C-r, tetapi ini tidak berhasil. Saya tahu bahwa entri saya yang lain sedang .inputrcbekerja karena saya memiliki keybindings lain yang ditentukan pengguna.

Adakah yang saya lakukan salah? Apakah saya kehilangan sesuatu?

Amelio Vazquez-Reina
sumber
Versi bashapa dan program terminal apa yang Anda gunakan?
Mikel
Saya menggunakan GNU bash, versi 3.1.17 (1) -release (x86_64-redhat-linux-gnu) di gnome-terminal (juga pada Terminator)
Amelio Vazquez-Reina

Jawaban:

11

Itu tidak menyoroti pilihan, tetapi kalau tidak saya pikir itu berfungsi dengan baik.

Coba jalankan

$ bind -p | grep copy-region-as-kill

untuk memastikan itu C-x C-rbenar - benar berfungsi.

Seharusnya dikatakan:

"\ew": copy-region-as-kill

Setelah itu, itu akan berfungsi dengan baik.

Contoh:

$ abc<C-Spc><C-a><M-w> def <C-y>

memberi saya

$ abc def abc

Jika Anda ingin tahu di mana markberada, lakukan saja C-x C-x.

Contoh:

$ <C-Spc>abc<C-x><C-x>

akan meletakkan kursor kembali ke tempat Anda menetapkan tanda (awal baris).

Juga, saya tidak berpikir Anda perlu menambahkan set-markikatan. Saya tidak melakukannya.

$ bind -p | grep set-mark
"\C-@": set-mark
"\e ": set-mark
# vi-set-mark (not bound)

(perhatikan bahwa sebagian besar terminal mengirim C-@ketika C-Spcditekan. Saya berasumsi terminal Anda juga.)

Jika semua ini gagal:

  • apakah Ctrl+ Spacebekerja di emacs -nwterminal yang sama?
  • cara kerja pintas lain Alt/ Metadi bash?
Mikel
sumber
1
Terima kasih! Saya memiliki "Mw" bukannya "\ ew" di .inputrc. Kurangnya highlight juga membingungkan saya. Terima kasih atas penunjuk ke perintah bind. Sekarang berfungsi seperti pesona!
Amelio Vazquez-Reina
2
Selamat datang! Ya, Anda harus menulis \eatau \M-. Lihat sintaks file readline init .
Mikel
Jawaban yang bagus! Terima kasih. Ini menyelesaikan masalah serupa bagi saya: D
ephsmith
set-mark dan copy-region-as-kill bekerja secara diam-diam, dapatkah saya menyorot wilayah tersebut (seperti pada emacs)?
mosh
4

Saya juga mengikat Cw untuk membunuh-wilayah . Di sini .inputrc saya:

# Lihat http://lists.gnu.org/archive/html/bug-bash/2009-03/msg00033.html
matikan bind-tty-special-chars

# Tentukan binding utama Emacs saya.
"\ C- @": set-mark
"\ Cw": kill-region
"\ Mw": copy-region-as-kill
"\ M- /" dabbrev-expand
gavenkoa
sumber