bash prompt ที่แตกต่างกันสำหรับโหมดแก้ไข vi ที่แตกต่างกัน?


113

เมื่อใช้โหมด vi (set -o vi) กับ Bash จะเป็นการดีที่จะมีพรอมต์ที่ขึ้นอยู่กับโหมดที่คุณกำลังใช้งานอยู่ (แทรกหรือคำสั่ง) เราจะค้นพบโหมดการแก้ไขนี้ได้อย่างไร?

Btw สิ่งนี้ดูเหมือนจะเป็นไปได้ในZSH :

bash  prompt 

ฉันอยากรู้เรื่องนี้เหมือนกัน ตามล่าหาเอกสารทุบตี แต่ไม่พบอะไรเลย
Andrew Ferrier

คำตอบ:


67

Fresh bash 4.3 และ readline 6.3 มีอะไรให้พวกคุณบ้าง .. จากบันทึกการเปลี่ยนแปลง:

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.

ดังนั้นการวาง

set show-mode-in-prompt on

ใน / etc / inputrc หรือ ~ / .inputrc (thx stooj) ควรมีผลกับโปรแกรมที่เปิดใช้งาน readline ทั้งหมดของคุณ;)


สถานะใด ๆ ในเรื่องนี้? ฉันกำลังพยายามค้นหาบางอย่างเช่นนี้ (ไม่ใช่สำหรับทุบตี แต่สำหรับพรอมต์อื่น ๆ ที่ใช้ Readline) ฉัน googling และไม่พบการอัปเดตอื่น ๆ (นอกเหนือจากนี้และบทความที่คุณอ้างถึง )
Mike HR

4
เพียงแค่เพิ่มจาก eMPee584 - หากคุณใช้ bash 4.3 ขึ้นไปให้เพิ่มสิ่งต่อไปนี้ในไฟล์ ~ / .inputrc ของคุณชุด show-mode-in-prompt ซึ่งจะเพิ่มเครื่องหมาย + ที่ด้านซ้ายสุดของพรอมต์หากคุณอยู่ในโหมดแก้ไข และ a: ถ้าคุณอยู่ในโหมดคำสั่ง
stooj

3
ในขณะนี้ทำงาน; มีวิธีย้ายตำแหน่งที่ตัวละครในโหมด vi นี้อยู่ในตำแหน่งที่เขาแจ้งหรือไม่? หากคุณมีข้อความแจ้งหลายบรรทัด (กำหนดเอง) มันก็ไม่ได้ผลทั้งหมด :)
James Mills

สำหรับ 4.3 จะอยู่ที่จุดเริ่มต้นของพรอมต์เสมอและน่าเสียดายที่ readline จะวาดบรรทัดสุดท้ายของพรอมต์หลายบรรทัดใหม่เท่านั้น ดูคำตอบ "Multiline prompt และ .inputrc" สำหรับวิธีแก้ปัญหาชั่วคราวหรือดูคำตอบเกี่ยวกับการแก้ไข bash 4.3 ด้วยการแก้ไขของ 4.4 สำหรับสิ่งนี้
studgeek

20

ทุบตี 4.4 / 7.0 Readline จะเพิ่มการสนับสนุนสำหรับผู้ใช้สามารถตั้งค่าโหมดสตริง

คุณสามารถลองใช้เวอร์ชันเบต้าได้ แต่ในขณะนี้ดูเหมือนว่ามีข้อผิดพลาดเล็กน้อย นอกจากนี้ยังไม่สนับสนุนการระบุตำแหน่งในพรอมต์ที่คุณต้องการให้ตัวบ่งชี้โหมดเกิดขึ้น (ซึ่งฉันคิดว่าเป็นคุณสมบัตินักฆ่า)

หากคุณไม่ต้องการรอและไม่กลัวการคอมไพล์เล็กน้อยฉันได้เผยแพร่ bash 4.3 เวอร์ชันแพตช์และอ่านบรรทัด 6.3 ไปยัง github ที่รองรับฟังก์ชันนี้

ด้วยเวอร์ชันที่ได้รับการแก้ไขแล้วคุณสามารถทำสิ่งต่างๆดังนี้:

ใส่คำอธิบายภาพที่นี่

ดูรายละเอียดเพิ่มเติมรวมถึงวิธีการติดตั้งได้ที่https://github.com/calid/bash


19

หลังจากค้นหา google ดูในหน้า bash man จากนั้นดูซอร์สโค้ด bash (lib / readline / vi_mode.c) ดูเหมือนว่าไม่มีวิธีง่ายๆในการเปลี่ยนพรอมต์เมื่อย้ายจากโหมดแทรกเป็นโหมดคำสั่ง ดูเหมือนว่าอาจมีโอกาสที่จะมีคนแก้ไขแหล่งที่มา bash แม้ว่าจะมีการเรียกร้องให้เริ่มและหยุดโหมดในแหล่งที่มา

เมื่อเห็นโพสต์ของคุณทำให้ฉันสนใจการตั้งค่าโหมด bash vi ฉันรัก vi และทำไมไม่อยู่ในบรรทัดคำสั่ง อย่างไรก็ตามดูเหมือนว่าเราจะต้องติดตามว่าเราอยู่ในโหมดแทรกโดยไม่มีการเปลี่ยนแปลงในทันทีหรือไม่ (พูดโพสต์ในฟอรัมมากมาย) สิ่งที่คุ้มค่าคุณจะอยู่ในโหมดแทรกเสมอเว้นแต่คุณจะกด ESC ทำให้ง่ายขึ้นเล็กน้อย แต่ไม่ง่ายเสมอไป

ฉันกำลังเพิ่มคำถามของคุณเนื่องจากฉันสนใจที่จะทราบว่าสิ่งนี้จะไปถึงไหน


7

Multiline prompt และ .inputrc

inputrc มีตัวเลือกที่จะแสดงหนึ่ง+แทรกและ:สำหรับโหมดปกติโดยการเพิ่มset show-mode-in-prompt onใน~/.inputrcเป็น eMPee584 เขียน แต่นี้ไม่ได้ทำงานได้ดีกับหลายพรอมต์ (กับรุ่นเก่าของทุบตีและ ReadLine)

โซลูชันมีบรรทัดเดียวPS1( >) และฟังก์ชันที่สะท้อนบางอย่างก่อนพร้อมต์ PROMPT_COMMANDมันถูกสร้างขึ้นในทุบตีและเรียก

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

PROMPT_COMMAND='prompt' 

สตริงพร้อมต์ปกติไม่มีอยู่ใน echo ของ printf -eคือรหัสสี interprete และมันไม่จำเป็นที่จะเพิ่ม\[หรือ\]ที่ไม่ได้ทำงานอยู่แล้ว

แทรกโหมด:

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

โหมดปกติ :

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

กดแท็บเฉพาะ PS1 ซ้ำซึ่งเหมาะสมสำหรับฉัน:

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

ดูตัวอย่าง (ที่มา)


หากใช้สีในvi-cmd-mode-stringหรือสีvi-ins-mode-stringเหล่านี้ควรนำหน้า\1และ\2แก้ไขภายหลังด้วย ดูที่นี่ . นอกจากนี้\[และ\[ยังควรปล่อยออกมา แต่คุณจะต้องใช้\\[และ\\]อยู่ใน printf
Tom Hale

1

นี่คือสิ่งที่ฉันมีใน ~/.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

แทรกโหมดเป็นสีน้ำเงิน

└──[ins]

โหมดคำสั่งเป็นสีเหลือง

└──[cmd]

ข้อเสียคือมันไม่ได้แสดงตามttyความหมายมันใช้งานได้กับเทอร์มินัลอีมูเลเตอร์เฉพาะสีเท่านั้น


0

ฉันพยายามหาตัวบ่งชี้สำหรับโหมด BASH vi ด้วยและคุณทุกคนได้เรียนรู้ว่ามันฟังดูง่ายและยังไม่มีวิธีใดที่จะทำได้

แนวทางปัจจุบันของฉันคือกด 'a' เมื่อฉันไม่แน่ใจว่าเป็นโหมดใด หาก 'a' ปรากฏขึ้นหลังจาก BASH PROMOT แสดงว่าฉันอยู่ในโหมด 'INSERT' จากนั้นฉันกด 'RETURN' และดำเนินการต่อ นี่เป็นวิธีง่ายๆสำหรับฉันในการแก้ปัญหาความรำคาญเล็ก ๆ

อย่างไรก็ตามฉัน 'นามแฝง a =' cal 'หรืออย่างอื่นเพื่อให้ hit ว่างเปล่า' a 'มีประโยชน์เล็กน้อย


2
จะสมเหตุสมผลกว่าสำหรับฉันที่จะกด "esc || c- [" แทนที่จะเป็น a. จากนั้นคุณไม่ต้องมองหาว่าคุณอยู่ในโหมดใด หรือใส่อักขระที่ไม่ต้องการที่คุณต้องลบ (หรือกด return)
wom

0

สำหรับ Multiline prompt เช่นภาพนี้

งานของฉันเป็นแบบนี้

แจ้งทุบตีของฉัน

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

หวังว่านี่จะช่วยคุณได้


0

รูปแบบพรอมต์และเคอร์เซอร์ที่แตกต่างกันผ่าน .inputrc

ก่อนอื่นคุณควรตรวจสอบให้แน่ใจว่าคุณใช้งานเวอร์ชัน bash ที่สูงกว่า4.3:

$ bash --version
GNU bash, version 4.4

จากนั้นใส่บรรทัดต่อไปนี้ใน~/.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

ในโหมดคำสั่งเคอร์เซอร์จะแสดงเป็นบล็อก
ในโหมดแทรกเคอร์เซอร์จะแสดงเป็นแถบแนวตั้ง

จากนั้นพรอมต์จะมีลักษณะดังนี้ขึ้นอยู่กับโหมด:

(cmd)$ ... 
(ins)$ ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.