Farklı vi düzenleme modu için farklı bash istemi?


113

Bash ile vi modunu (set -o vi) kullanırken, şu anda bulunduğunuz moda (ekleme veya komut) bağlı olan bir komut isteminin olması güzel olurdu. Bu düzenleme modu nasıl bulunur?

Btw, bu ZSH'de mümkün görünüyor :

bash  prompt 

Bunu ben de merak ediyorum. Bash belgelerini araştırıyor, ancak hiçbir şey bulamadım.
Andrew Ferrier

Yanıtlar:


67

Taze bash 4.3 ve okuma satırı 6.3'te sizin için bir şeyler var .. değişim günlüğünden:

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.

Yani koymak

set show-mode-in-prompt on

içine / etc / inputrc veya ~ / .inputrc (thx stooj), readline özellikli tüm programlarınızı etkilemelidir;)


bu konuda herhangi bir durum var mı? Bunun gibi bir şey bulmaya çalışıyorum (bash için değil, kullandığım diğer okuma satırı tabanlı istemler için). Googling yapıyorum ve başka bir güncelleme bulamadım (bunun ve atıfta bulunduğunuz makale dışında )
Mike HR

4
Sadece eMPee584'ten ekleyerek - bash 4.3 veya üstünü çalıştırıyorsanız, aşağıdakileri ~ / .inputrc dosya kümenize ekleyin istemde göster modu Bu, düzenleme modundaysanız isteminizin en soluna bir + ekler ve a: komut modundaysanız.
stooj

3
Yani bu çalışırken; Bu vi modu karakterinin istediği yere gitmenin bir yolu var mı? Çok satırlı istemleriniz varsa (özel), o kadar da iyi çalışmaz :)
James Mills

4.3 için her zaman bilgi isteminin başlangıcındadır ve maalesef, okuma satırı yalnızca çok satırlı bir komut isteminin son satırını yeniden çizecektir. Bir geçici çözüm için "Çok satırlı komut istemi ve .inputrc" yanıtına bakın veya bunun için 4.4'ün düzeltmesiyle bash 4.3'e yama uygulama hakkındaki yanıta bakın.
studgeek

20

Bash 4.4 / Readline 7.0 , kullanıcı tarafından ayarlanabilen mod dizeleri için destek ekleyecek .

Beta sürümlerini deneyebilirsiniz, ancak şu anda biraz hatalı görünüyorlar. Ayrıca, mod göstergesinin istemde nerede oluşmasını istediğinizi belirtmeyi henüz desteklemiyorlar (ki bence bu katil özelliktir).

Beklemek istemiyor ve küçük bir derlemeden korkmuyorsanız, bu işlevi destekleyen bash 4.3 ve readline 6.3'ün yamalı sürümlerini github'a yayınladım.

Yamalı sürümlerle aşağıdaki gibi şeyler yapabilirsiniz:

görüntü açıklamasını buraya girin

Nasıl kurulacağı da dahil olmak üzere daha fazla ayrıntı https://github.com/calid/bash adresinde mevcuttur.


19

Google'da arama yaptıktan sonra, bash man sayfasına ve ardından bash kaynak koduna (lib / readline / vi_mode.c) baktıktan sonra, ekleme modundan komut moduna geçerken istemi değiştirmenin kolay bir yolu yok gibi görünüyor. Görünüşe göre, kaynaktaki modları başlatma ve durdurma çağrıları olsa da, burada birinin bash kaynağına yama yapması için bir fırsat olabilir.

Gönderinizi gördükten sonra bash vi modu ayarıyla ilgilenmemi sağladı. Vi'yi seviyorum ve neden komut satırında olmasın. Bununla birlikte, hızlı bir değişiklik yapmadan ekleme modunda olup olmadığımızı takip etmemiz gerekecek gibi görünüyor (bu nedenle, birçok forum gönderisini söyleyin) Ne olursa olsun, ESC'ye basmadığınız sürece her zaman ekleme modundasınız. Biraz kolaylaştırır, ancak her zaman o kadar sezgisel değildir.

Bunun nereye gittiğini görmekle ilgilendiğim için sorunuzu yanıtlıyorum.


7

Çok satırlı komut istemi ve .inputrc

İnputrc bir göstermek için bir seçenek vardır +insert için ve :ekleyerek, normal modda için set show-mode-in-prompt onde ~/.inputrceMPee584 yazdığı gibi, ancak bu istemi (bash ve taleb eski sürümleri ile) satırlı iyi çalışmaz.

Çözüm, tek bir satıra PS1( >) ve komut isteminden önce bir şeyi yankılayan bir işleve sahiptir. Bash'in içine yerleştirilir ve çağrılır PROMPT_COMMAND.

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

PROMPT_COMMAND='prompt' 

Normal komut dizeleri printf yankısında kullanılamaz. -eİnterprete renk kodlarına olduğunu ve eklemek gerekli değildir \[ya \]zaten çalışmıyor, hangi.

Ekleme modu:

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

Normal mod:

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

Sekmeye basıldığında , yalnızca PS1 tekrarlanıyor, bu benim için mantıklı:

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

Ön izleme (Kaynak)


vi-cmd-mode-stringVeya içinde renkler kullanılıyorsa vi-ins-mode-string, bunların önüne \1ve sonrasına eklenmelidir \2. Buraya bakın . Ayrıca \[ve \[yine de yayınlanmalıdır, ancak printf içinde \\[ve buna ihtiyacınız olacak \\].
Tom Hale

1

İçinde sahip olduğum şey bu ~/.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

Ekleme modu mavi renktedir.

└──[ins]

Komut modu sarı renklidir.

└──[cmd]

Dezavantajı, bir ttyanlamı göstermemesi, yalnızca bir terminal öykünücüsünde yalnızca renkleri çalıştırmasıdır.


0

BASH vi modu için de bir gösterge almaya çalışıyorum ve hepiniz bunun kulağa basit geldiğini ve henüz yapmanın bir yolu olmadığını öğrendiniz.

Şu anki yaklaşımım: Hangi modun olduğundan emin olmadığımda 'a' tuşuna basın. BASH PROMOT'tan sonra 'a' görünürse, 'INSERT' modunda olduğumu öğrenirim. SONRA, 'GERİ DÖN'e basıp devam ediyorum. Bu benim için küçük sıkıntıyı çözmenin kolay bir yolu.

Bu arada, ben "a =" cal "takma adını veya boş isabet" biraz "kullanışlılık verecek başka bir şey.


2
A yerine "esc || c- [" tuşuna basmak bana daha mantıklı gelir. O halde hangi modda olduğunuzu bilmek zorunda değilsiniz; veya kaldırmanız gereken istenmeyen karakterleri ekleyin (veya dönüş tuşuna basın)
wom

0

Bu resim gibi çok satırlı komut istemi için

buradaki işim böyle

benim bash istemim

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):"

umarım bu sana yardımcı olmuştur


0

Farklı İstem ve İmleç Stili ile .inputrc

Öncelikle şunlardan daha yüksek bir bash sürümü çalıştırdığınızdan emin olmalısınız 4.3:

$ bash --version
GNU bash, version 4.4

Ardından aşağıdaki satırları sayfanıza ekleyin ~/.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

Komut modunda, imleç blok olarak görüntülenir.
Ekleme modunda, imleç dikey çubuk olarak görüntülenir.

Daha sonra, moda bağlı olarak komut istemi şu şekilde görünecektir:

(cmd)$ ... 
(ins)$ ...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.