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?

Btw, ini sepertinya mungkin di ZSH :


sumber
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.  New Features in Readline
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;)

eMPee584
sumber
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.
studgeek
20

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:

masukkan deskripsi gambar di sini

Detail lebih lanjut, termasuk cara menginstal, tersedia di https://github.com/calid/bash

Dylan Cali
sumber
19

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.

Jeremy Heslop
sumber
7

Multiline prompt dan .inputrc

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.

function prompt {
    PS1=' > '
    echo -e "$(date +%R)  $PWD"
}

PROMPT_COMMAND='prompt' 

String prompt biasa tidak tersedia di echo printf. Ini -euntuk menafsirkan kode warna, dan tidak perlu menambahkan \[or \], yang toh tidak berfungsi.

MemasukkanMode :

20:57   /home/sshbio/dotfiles/bash
+ > _

NormalMode :

20:57   /home/sshbio/dotfiles/bash
: > _

Menekan tab , hanya PS1 yang diulang, yang masuk akal bagi saya:

20:57   /home/sshbio/dotfiles/bash
+ > ls _
bashrc      bash_profile     inputrc
+ > ls _

Pratinjau (Sumber)

pengguna3034472
sumber
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.

Jetchisel
sumber
0

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 '.

Andrew_1510
sumber
2
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)
wom
0

untuk Multiline prompt seperti gambar ini

pekerjaan saya seperti ini

prompt pesta saya

export PS1=" ┌錄 \[\e[32m\]\u\[\e[m\]\[\e[32m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\] \w \\$ \n "

.inputrc

set show-mode-in-prompt on
set vi-ins-mode-string " └──錄 (ins):"
set vi-cmd-mode-string " └──錄 (cmd):"

berharap ini membantu Anda

menandai
sumber
0

Gaya Prompt dan Kursor berbeda melalui .inputrc

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:

(cmd)$ ... 
(ins)$ ...
winklerrr
sumber