Bash prompt berbeda untuk mode pengeditan vi yang berbeda?
113
Saat menggunakan mode vi (set -o vi) dengan Bash, alangkah baiknya memiliki prompt yang bergantung pada mode yang Anda gunakan saat ini (masukkan atau perintah). Bagaimana cara mengetahui mode pengeditan ini?
Saya penasaran tentang ini juga. Telah berburu melalui dokumentasi bash, tetapi belum menemukan apa pun.
Andrew Ferrier
Jawaban:
67
Bash 4.3 dan readline 6.3 baru memiliki sesuatu untuk kalian .. dari changelog:
4.NewFeaturesinReadline
j.New user-settable variable, show-mode-in-prompt, adds a characters to the
beginning of the prompt indicating the current editing mode.
Jadi menempatkan
set show-mode-in-prompt on
ke / etc / inputrc atau ~ / .inputrc (thx stooj) harus mempengaruhi semua program readline-enabled Anda;)
status apa pun tentang ini? Saya mencoba menemukan sesuatu seperti ini (bukan untuk bash tetapi untuk petunjuk berbasis readline lain yang saya gunakan). Saya telah googling dan belum menemukan pembaruan lain (selain ini dan artikel yang Anda referensikan )
Mike HR
4
Hanya menambahkan dari eMPee584 - jika Anda menjalankan bash 4.3 atau lebih tinggi, tambahkan yang berikut ini ke set file ~ / .inputrc Anda show-mode-in-prompt Ini menambahkan + di bagian paling kiri dari prompt Anda jika Anda berada dalam mode edit , dan a: jika Anda berada dalam mode perintah.
stooj
3
Jadi sementara ini berhasil; apakah ada cara untuk pindah ke tempat karakter vi-mode ini duduk di prompt? Jika Anda memiliki prompt multi-baris (khusus) itu tidak berfungsi dengan baik :)
James Mills
Untuk 4.3 itu selalu di awal prompt dan, sayangnya, readline hanya akan menggambar ulang baris terakhir dari prompt multiline. Lihat jawaban "Multiline prompt dan .inputrc" untuk solusi atau lihat jawaban tentang menambal bash 4.3 dengan perbaikan 4.4 untuk ini.
Anda dapat mencoba versi beta, tetapi saat ini tampaknya agak bermasalah. Mereka juga belum mendukung menentukan di mana pada prompt Anda ingin indikator mode terjadi (yang menurut saya adalah fitur pembunuh).
Jika Anda tidak ingin menunggu, dan tidak takut dengan kompilasi kecil, saya telah menerbitkan versi patch dari bash 4.3 dan readline 6.3 ke github yang mendukung fungsi ini.
Dengan versi yang ditambal, Anda dapat melakukan hal-hal seperti ini:
Setelah mencari di google, melihat melalui halaman manual bash dan kemudian melihat melalui kode sumber bash (lib / readline / vi_mode.c) sepertinya tidak ada cara mudah untuk mengubah prompt saat berpindah dari mode sisipkan ke mode perintah. Sepertinya ada peluang di sini bagi seseorang untuk menambal sumber bash karena ada panggilan untuk memulai dan menghentikan mode di sumber.
Setelah melihat kiriman Anda, saya tertarik dengan pengaturan mode bash vi. Saya suka vi dan mengapa tidak di baris perintah. Namun sepertinya kita harus melacak apakah kita dalam mode penyisipan tanpa perubahan prompt (jadi katakanlah banyak posting forum) Untuk apa itu layak Anda selalu dalam mode penyisipan kecuali Anda menekan ESC. Membuatnya sedikit lebih mudah, tetapi tidak selalu intuitif.
Saya mengajukan pertanyaan Anda karena saya tertarik untuk melihat ke mana arahnya.
Inputrc memiliki opsi untuk menunjukkan +untuk insert dan :untuk mode normal, dengan menambahkan set show-mode-in-prompt ondalam ~/.inputrcsebagai eMPee584 menulis, tapi ini tidak bekerja dengan baik dengan multiline prompt (dengan versi bash dan readline).
Solusinya memiliki satu garis PS1 ( >), dan fungsi yang menggemakan sesuatu sebelum prompt. Itu dibangun ke dalam bash dan disebut PROMPT_COMMAND.
Jika menggunakan warna dalam vi-cmd-mode-stringatau vi-ins-mode-string, ini harus diawali oleh \1dan diawali oleh \2. Lihat disini . Juga, \[dan \[masih harus dipancarkan, tetapi Anda akan membutuhkan \\[dan \\]di dalam printf.
Tom Hale
1
Inilah yang saya miliki ~/.inputrc
set show-mode-in-prompt on
set vi-ins-mode-string \1\e[34;1m\2└──[ins] \1\e[0m\2
set vi-cmd-mode-string \1\e[33;1m\2└──[cmd] \1\e[0m\2
Mode sisipkan berwarna biru.
└──[ins]
Modus perintah itu diwarnai kuning.
└──[cmd]
Kelemahannya adalah tidak ditampilkan dalam ttyarti hanya bekerja pada emulator terminal saja warna.
Saya juga mencoba mendapatkan indikator untuk mode BASH vi, dan Anda semua mengetahui bahwa ini terdengar sederhana dan belum ada cara untuk melakukannya.
Pendekatan saya saat ini adalah: tekan 'a' ketika saya tidak yakin mode mana yang digunakan. JIKA 'a' muncul setelah BASH PROMOT, saya mengetahui bahwa saya berada dalam mode 'INSERT'. LALU, saya menekan 'KEMBALI' dan melanjutkan. Ini adalah cara mudah bagi saya untuk mengatasi gangguan kecil.
Ngomong-ngomong, saya 'alias a =' cal ', atau sesuatu yang lain memberi hit kosong' sedikit kegunaan '.
Akan lebih masuk akal bagi saya untuk hanya menekan "esc || c- [" daripada a. Maka Anda tidak perlu melihat untuk mengetahui mode apa yang Anda gunakan; atau masukkan karakter yang tidak diinginkan yang harus Anda hapus (atau tekan kembali)
Pertama, Anda harus memastikan bahwa Anda menjalankan versi bash lebih tinggi dari 4.3:
$ bash --version
GNU bash, version 4.4
Kemudian letakkan baris berikut di Anda ~/.inputrc:
#################### VIM ##################### FOR MORE INFORMATION CHECK:# https://wiki.archlinux.org/index.php/Readline# TURN ON VIM (E.G. FOR READLINE)set editing-mode vi
# SHOW THE VIM MODE IN THE PROMPT (COMMAND OR INSERT)set show-mode-in-prompt on
# SET THE MODE STRING AND CURSOR TO INDICATE THE VIM MODE# FOR THE NUMBER AFTER `\e[`:# 0: blinking block# 1: blinking block (default)# 2: steady block# 3: blinking underline# 4: steady underline# 5: blinking bar (xterm)# 6: steady bar (xterm)set vi-ins-mode-string (ins)\1\e[5 q\2
set vi-cmd-mode-string (cmd)\1\e[1 q\2
Dalam mode perintah, kursor ditampilkan sebagai blok.
Dalam mode sisip, kursor ditampilkan sebagai bilah vertikal.
Prompt itu sendiri akan terlihat seperti ini tergantung pada modenya:
Jawaban:
Bash 4.3 dan readline 6.3 baru memiliki sesuatu untuk kalian .. dari changelog:
Jadi menempatkan
ke / etc / inputrc atau ~ / .inputrc (thx stooj) harus mempengaruhi semua program readline-enabled Anda;)
sumber
Bash 4.4 / Readline 7.0 akan menambahkan dukungan untuk string mode yang dapat diatur pengguna .
Anda dapat mencoba versi beta, tetapi saat ini tampaknya agak bermasalah. Mereka juga belum mendukung menentukan di mana pada prompt Anda ingin indikator mode terjadi (yang menurut saya adalah fitur pembunuh).
Jika Anda tidak ingin menunggu, dan tidak takut dengan kompilasi kecil, saya telah menerbitkan versi patch dari bash 4.3 dan readline 6.3 ke github yang mendukung fungsi ini.
Dengan versi yang ditambal, Anda dapat melakukan hal-hal seperti ini:
Detail lebih lanjut, termasuk cara menginstal, tersedia di https://github.com/calid/bash
sumber
Setelah mencari di google, melihat melalui halaman manual bash dan kemudian melihat melalui kode sumber bash (lib / readline / vi_mode.c) sepertinya tidak ada cara mudah untuk mengubah prompt saat berpindah dari mode sisipkan ke mode perintah. Sepertinya ada peluang di sini bagi seseorang untuk menambal sumber bash karena ada panggilan untuk memulai dan menghentikan mode di sumber.
Setelah melihat kiriman Anda, saya tertarik dengan pengaturan mode bash vi. Saya suka vi dan mengapa tidak di baris perintah. Namun sepertinya kita harus melacak apakah kita dalam mode penyisipan tanpa perubahan prompt (jadi katakanlah banyak posting forum) Untuk apa itu layak Anda selalu dalam mode penyisipan kecuali Anda menekan ESC. Membuatnya sedikit lebih mudah, tetapi tidak selalu intuitif.
Saya mengajukan pertanyaan Anda karena saya tertarik untuk melihat ke mana arahnya.
sumber
Multiline prompt dan
.inputrc
Inputrc memiliki opsi untuk menunjukkan
+
untuk insert dan:
untuk mode normal, dengan menambahkanset show-mode-in-prompt on
dalam~/.inputrc
sebagai eMPee584 menulis, tapi ini tidak bekerja dengan baik dengan multiline prompt (dengan versi bash dan readline).Solusinya memiliki satu garis
PS1
(>
), dan fungsi yang menggemakan sesuatu sebelum prompt. Itu dibangun ke dalam bash dan disebutPROMPT_COMMAND
.String prompt biasa tidak tersedia di echo printf. Ini
-e
untuk menafsirkan kode warna, dan tidak perlu menambahkan\[
or\]
, yang toh tidak berfungsi.MemasukkanMode :
NormalMode :
Menekan tab , hanya PS1 yang diulang, yang masuk akal bagi saya:
(Sumber)
sumber
vi-cmd-mode-string
atauvi-ins-mode-string
, ini harus diawali oleh\1
dan diawali oleh\2
. Lihat disini . Juga,\[
dan\[
masih harus dipancarkan, tetapi Anda akan membutuhkan\\[
dan\\]
di dalam printf.Inilah yang saya miliki
~/.inputrc
Mode sisipkan berwarna biru.
Modus perintah itu diwarnai kuning.
Kelemahannya adalah tidak ditampilkan dalam
tty
arti hanya bekerja pada emulator terminal saja warna.sumber
Saya juga mencoba mendapatkan indikator untuk mode BASH vi, dan Anda semua mengetahui bahwa ini terdengar sederhana dan belum ada cara untuk melakukannya.
Pendekatan saya saat ini adalah: tekan 'a' ketika saya tidak yakin mode mana yang digunakan. JIKA 'a' muncul setelah BASH PROMOT, saya mengetahui bahwa saya berada dalam mode 'INSERT'. LALU, saya menekan 'KEMBALI' dan melanjutkan. Ini adalah cara mudah bagi saya untuk mengatasi gangguan kecil.
Ngomong-ngomong, saya 'alias a =' cal ', atau sesuatu yang lain memberi hit kosong' sedikit kegunaan '.
sumber
untuk Multiline prompt seperti gambar ini
pekerjaan saya seperti ini
prompt pesta saya
.inputrc
berharap ini membantu Anda
sumber
Gaya Prompt dan Kursor berbeda melalui
.inputrc
Pertama, Anda harus memastikan bahwa Anda menjalankan versi bash lebih tinggi dari
4.3
:Kemudian letakkan baris berikut di Anda
~/.inputrc
:Dalam mode perintah, kursor ditampilkan sebagai blok.
Dalam mode sisip, kursor ditampilkan sebagai bilah vertikal.
Prompt itu sendiri akan terlihat seperti ini tergantung pada modenya:
sumber