เมื่อใช้โหมด vi (set -o vi) กับ Bash จะเป็นการดีที่จะมีพรอมต์ที่ขึ้นอยู่กับโหมดที่คุณกำลังใช้งานอยู่ (แทรกหรือคำสั่ง) เราจะค้นพบโหมดการแก้ไขนี้ได้อย่างไร?
Btw สิ่งนี้ดูเหมือนจะเป็นไปได้ในZSH :
เมื่อใช้โหมด vi (set -o vi) กับ Bash จะเป็นการดีที่จะมีพรอมต์ที่ขึ้นอยู่กับโหมดที่คุณกำลังใช้งานอยู่ (แทรกหรือคำสั่ง) เราจะค้นพบโหมดการแก้ไขนี้ได้อย่างไร?
Btw สิ่งนี้ดูเหมือนจะเป็นไปได้ในZSH :
คำตอบ:
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 ทั้งหมดของคุณ;)
ทุบตี 4.4 / 7.0 Readline จะเพิ่มการสนับสนุนสำหรับผู้ใช้สามารถตั้งค่าโหมดสตริง
คุณสามารถลองใช้เวอร์ชันเบต้าได้ แต่ในขณะนี้ดูเหมือนว่ามีข้อผิดพลาดเล็กน้อย นอกจากนี้ยังไม่สนับสนุนการระบุตำแหน่งในพรอมต์ที่คุณต้องการให้ตัวบ่งชี้โหมดเกิดขึ้น (ซึ่งฉันคิดว่าเป็นคุณสมบัตินักฆ่า)
หากคุณไม่ต้องการรอและไม่กลัวการคอมไพล์เล็กน้อยฉันได้เผยแพร่ bash 4.3 เวอร์ชันแพตช์และอ่านบรรทัด 6.3 ไปยัง github ที่รองรับฟังก์ชันนี้
ด้วยเวอร์ชันที่ได้รับการแก้ไขแล้วคุณสามารถทำสิ่งต่างๆดังนี้:
ดูรายละเอียดเพิ่มเติมรวมถึงวิธีการติดตั้งได้ที่https://github.com/calid/bash
หลังจากค้นหา google ดูในหน้า bash man จากนั้นดูซอร์สโค้ด bash (lib / readline / vi_mode.c) ดูเหมือนว่าไม่มีวิธีง่ายๆในการเปลี่ยนพรอมต์เมื่อย้ายจากโหมดแทรกเป็นโหมดคำสั่ง ดูเหมือนว่าอาจมีโอกาสที่จะมีคนแก้ไขแหล่งที่มา bash แม้ว่าจะมีการเรียกร้องให้เริ่มและหยุดโหมดในแหล่งที่มา
เมื่อเห็นโพสต์ของคุณทำให้ฉันสนใจการตั้งค่าโหมด bash vi ฉันรัก vi และทำไมไม่อยู่ในบรรทัดคำสั่ง อย่างไรก็ตามดูเหมือนว่าเราจะต้องติดตามว่าเราอยู่ในโหมดแทรกโดยไม่มีการเปลี่ยนแปลงในทันทีหรือไม่ (พูดโพสต์ในฟอรัมมากมาย) สิ่งที่คุ้มค่าคุณจะอยู่ในโหมดแทรกเสมอเว้นแต่คุณจะกด ESC ทำให้ง่ายขึ้นเล็กน้อย แต่ไม่ง่ายเสมอไป
ฉันกำลังเพิ่มคำถามของคุณเนื่องจากฉันสนใจที่จะทราบว่าสิ่งนี้จะไปถึงไหน
.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 _
นี่คือสิ่งที่ฉันมีใน ~/.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
ความหมายมันใช้งานได้กับเทอร์มินัลอีมูเลเตอร์เฉพาะสีเท่านั้น
ฉันพยายามหาตัวบ่งชี้สำหรับโหมด BASH vi ด้วยและคุณทุกคนได้เรียนรู้ว่ามันฟังดูง่ายและยังไม่มีวิธีใดที่จะทำได้
แนวทางปัจจุบันของฉันคือกด 'a' เมื่อฉันไม่แน่ใจว่าเป็นโหมดใด หาก 'a' ปรากฏขึ้นหลังจาก BASH PROMOT แสดงว่าฉันอยู่ในโหมด 'INSERT' จากนั้นฉันกด 'RETURN' และดำเนินการต่อ นี่เป็นวิธีง่ายๆสำหรับฉันในการแก้ปัญหาความรำคาญเล็ก ๆ
อย่างไรก็ตามฉัน 'นามแฝง a =' cal 'หรืออย่างอื่นเพื่อให้ hit ว่างเปล่า' a 'มีประโยชน์เล็กน้อย
สำหรับ 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):"
หวังว่านี่จะช่วยคุณได้
.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)$ ...