Shift + Up tidak dikenali oleh Emacs di terminal

15

Sangat sering saya menggunakan Shift+ Up/Downuntuk memilih wilayah di Emacs. Ini berfungsi dengan baik dalam mode GUI, tetapi ketika emacsdipanggil dengan -nwopsi saya dapat memilih garis hanya dengan Shift+ Down. Tanda Shift+ Uptidak berfungsi, saya mendapatkan pesan kesalahan ini di minibuffer:

<select> is undefined

Bagaimana saya bisa mengatasi masalah ini?

WeSenseASoulInSearchOfAnswers
sumber

Jawaban:

13

Terminal teks hanya mentransmisikan karakter (lebih tepatnya, byte), bukan kunci. Tombol dan gantungan kunci (tombol dengan pengubah) dikodekan sebagai urutan karakter. Kunci yang memasukkan karakter yang dapat dicetak dikirim sebagai dirinya sendiri; tombol fungsi dikirim sebagai urutan pelarian. Sebagian besar urutan escape terdiri dari karakter Escape ( ?\edalam sintaks Emacs) diikuti oleh dua atau lebih karakter yang dapat dicetak. Lihat Kontrol dan tombol atas / bawah di terminal untuk digunakan oleh emacs dan Bagaimana cara kerja input keyboard dan output teks? untuk informasi lebih lanjut.

Emacs memiliki mekanisme untuk menerjemahkan urutan melarikan diri ke dalam gagasan kunci. Tabel terjemahan input-decode-mapdiinisialisasi ketika Emacs dimulai (atau lebih tepatnya, ketika bingkai baru terbuka: variabel ini memiliki nilai yang berbeda pada setiap terminal). Terkadang Emacs tidak tahu semua urutan pelarian yang dikirim oleh terminal.

Dalam kasus Anda, tampaknya Emacs memiliki interpretasi yang salah untuk urutan escape yang dikirim oleh Shift+ Up. Anda harus mengatakannya untuk menafsirkannya sebagai S-upganti select. Pertama, cari tahu apa urutan pelariannya. Di *scratch*buffer, tekan Ctrl+ Qlalu Shift+ Up. Perintah C-qmenyebabkan karakter selanjutnya, yang merupakan karakter pelarian, untuk dimasukkan secara harfiah, diikuti oleh sisa urutan pelarian. Katakanlah Shift+ Upmengirimkan \e[1;2Apada sistem kami, maka Anda perlu mendefinisikan ulang entri yang sesuai di input-mode-map:

(define-key input-decode-map "\e[1;2A" [S-up])

Pada prinsipnya, input-decode-mapharus ditetapkan per terminal. Dalam praktiknya, sangat jarang memiliki dua terminal di mana urutan pelepasan yang sama mengkodekan kunci yang berbeda, sehingga pengaturan global akan berfungsi dengan baik.

Gilles 'SO- berhenti menjadi jahat'
sumber
Jawaban Anda tampaknya menjawab pertanyaan saya di sini - emacs.stackexchange.com/questions/33988 . Are the (define-key ...)perintah yang seharusnya masuk ke init.el? Apakah ada contoh terperinci di suatu tempat yang bisa saya lihat?
vfclists
define-keyPerintah @vfclists masuk ke file init Anda. Itu bisa ~/.emacs.d/init.elatau beberapa lokasi lainnya. Anda akan menemukan banyak contoh penggunaan define-keydengan mencari define-key, tetapi menemukan peta mana yang akan diikat adalah masalah lain. Beberapa peta yang terlibat: global-map, input-decode-map, function-key-map, keyboard-translate-map. Saya tidak tahu bagaimana menjawab pertanyaan Anda karena saya tidak tahu Spacemacs. Saya tidak merekomendasikan penggunaan paket seperti Spacemacs yang secara acak mendefinisikan kembali antarmuka standar.
Gilles 'SO- stop being evil'
Saya telah beralih ke emacs biasa untuk belajar mode-org dan saya berhasil bekerja input-decode-mapsetelah menemukan beberapa contoh. Bisakah saya menerimanya yang input-decode-mapberlaku saat pengguna memasukkan teks ke dalam buffer?
vfclists
@vfclists input-decode-mapadalah salah satu keymaps yang berlaku. Lihat manual untuk detailnya.
Gilles 'SO- stop being evil'
5

Dalam emacs, wilayah dibatasi oleh titik (kursor) dan tanda (beberapa posisi kursor sebelumnya, yang telah "ditandai").

Jadi, untuk "memilih suatu wilayah", Anda perlu menempatkan tanda itu, lalu memindahkan titik Anda.

Cara termudah untuk menempatkan tanda adalah dengan menekan C-SPC. Kemudian cukup gerakkan kursor, Anda akan melihat "wilayah" meluas seperti yang Anda lakukan.

Untuk "membatalkan pilihan wilayah", Anda dapat menekan C-SPC lagi.

Karena "shift + movement" adalah pengikatan kunci yang umum pada perangkat lunak lain, secara default, ini mengemulasi perilaku "pilih wilayah" ini. Namun, itu tidak berfungsi di terminal, karena shift tidak dapat dikirim ke emacs sebagai kunci pengubah.

Perhatikan bahwa secara umum, C-SPCmetode ini jauh lebih kuat daripada metode lain untuk memilih wilayah: Anda tidak terbatas pada gerakan naik / turun / kiri / kanan (Anda dapat menggunakan pencarian misalnya ...), dan itu tidak memerlukan Anda mempertahankan kombinasi tombol yang tidak nyaman untuk waktu yang lama.

T. Verron
sumber