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?


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?

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.