Adakah cara untuk membuat prompt dan output-sebelumnya tidak dapat diedit di shell / term-mode?

9

Ini memang pertanyaan yang dangkal.

Meskipun ansi-termmulai berperilaku dengan benar ketika saya pertama kali membukanya, tampaknya menurun ke mode 'dapat diedit' setelah beberapa perintah, misalnya, ketika saya lakukan C-a(mulai dari baris) diikuti oleh C-k(garis membunuh), itu menghapus seluruh prompt.

Untuk kewarasan estetika saya, apakah ada cara untuk membuat prompt dan output sebelumnya tidak dapat diedit shell? (Diperbarui untuk mengecualikan ansi-term mengingat perbedaan yang bermakna.)

Saya menggunakan zsh di Emacs 24.4; OS adalah LXDE (Ubuntu 14.04) melalui Virtual Box.

(Idealnya saya masih bisa menggerakkan kursor di sekitar ...)

tukang es
sumber
1
Apakah Anda kebetulan menggunakan OS "aneh"? Biasanya dalam mode shell Ca melompat ke awal commandline, setelah prompt, dan Ca kedua diperlukan untuk melompat ke awal. Pada Windows dan Solaris (dalam kehidupan sebelumnya) saya biasanya menemukan bahwa Ca melompat ke awal, ketika di MacOS, Linux dll itu berfungsi seperti yang diharapkan untuk saya.
Mark Aufflick
@Mark A: Saya telah memperbarui posting asli untuk memasukkan beberapa detail lagi, termasuk pengaturan saya saat ini.
iceman
Perilaku yang dijelaskan dari istilah ansi terdengar seperti Anda telah beralih ke mode baris dengan default aneh atau C-c C-j. Coba temukan default itu atau beralih ke mode char dengan C-c C-k.
wasamasa
1
Karena shell-mode/ term-modemasing-masing tidak berasal comint-mode, Anda mengajukan dua pertanyaan yang sangat berbeda pada saat yang sama di sini. Pikiran membaginya menjadi dua pertanyaan terpisah?
purple_arrows

Jawaban:

16

comint mode -derived (seperti shell, ielm, ...) fungsi pendukung filter, potongan berikut membuat output dan cepat read-only:

(setq comint-prompt-read-only t)

(defun my-comint-preoutput-turn-buffer-read-only (text)
  (propertize text 'read-only t))

(add-hook 'comint-preoutput-filter-functions 'my-comint-preoutput-turn-buffer-read-only)

Adapun ansi-term(yang bukan berasal dari comint ), ia memiliki dua mode operasi, char modeyang tetap jujur ​​pada binding dari shell dan perangkat lunak yang berjalan di dalamnya mungkin dan line modeyang memungkinkan Anda untuk mengedit buffer sesuka Anda. Anda biasanya harus tetap di char mode(terikat ke C-c C-k) dan sesekali beralih ke line mode(terikat ke C-c C-j) untuk mengedit output perintah.

wasamasa
sumber
Ini benar-benar cantik, tetapi berhenti bekerja ... :( Saya punya solusi kerja yang mengambil kode jauh lebih banyak → github.com/michalrus/dotfiles/commit/…
Michal Rus
Tak tahu, masih bekerja untuk saya pada 25.2.
wasamasa
Ini memang dalam arti, bahwa Anda tidak dapat menghapus teks ini, tetapi Anda dapat menyisipkan baru, disatukan dengan yang tidak berubah.
Michal Rus
1
Begitu ya, tidak mengujinya secara khusus.
wasamasa
Ups, satu perubahan lagi untuk orang yang melihat. Saya melewatkan beberapa celah sebelumnya. Yang ini sangat cocok untuk saya. github.com/michalrus/dotfiles/blob/…
Michal Rus
2

Saat bercampur termdengan shell-mode, variabel comint-use-prompt-regexptampaknya sesekali diatur. Ini menyebabkan perilaku sedikit seperti yang Anda jelaskan: di shell-mode C-a akan pergi ke awal baris, C-kakan membunuh seluruh baris, termasuk prompt.

Sebuah memperbaiki sederhana adalah untuk me-reset comint-use-prompt-regexpdengan C-: (setq comint-use-prompt-regexp nil), memaksa modus shell untuk properti teks penggunaan yang kunci gerakan kursor sadar.

Ada deskripsi cara kerjanya di manual GNU Emacs di sini: https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html

ataylor
sumber
1

Coba ubahsuaikan variabel comint-prompt-read-onlyke t.

Ini akan mempengaruhi shell-modedan yang lain berasal dari comint-mode, tetapi tidak term-mode.

purple_arrows
sumber