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 :
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 :
Jawaban:
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;)
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
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
Inputrc memiliki opsi untuk menunjukkan +
untuk insert dan :
untuk mode normal, dengan menambahkan set 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 disebut PROMPT_COMMAND
.
function prompt {
PS1=' > '
echo -e "$(date +%R) $PWD"
}
PROMPT_COMMAND='prompt'
String prompt biasa tidak tersedia di echo printf. Ini -e
untuk 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 _
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 tty
arti 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 '.
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
.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)$ ...