अलग vi संपादन मोड के लिए अलग अलग संकेत?


113

बैश के साथ vi मोड (सेट -o vi) का उपयोग करते समय, एक प्रॉम्प्ट होना अच्छा होगा जो उस मोड पर निर्भर करता है जो आप वर्तमान में हैं (सम्मिलित करें या कमांड करें)। इस संपादन मोड का पता कैसे चलता है?

Btw, यह ZSH में संभव हो रहा है :

bash  prompt 

इस बारे में भी उत्सुक हूँ। बैश प्रलेखन के माध्यम से शिकार किया गया, लेकिन कुछ भी नहीं मिला है।
एंड्रयू फेरियर

जवाबों:


67

ताजा चटका 4.3 और रीडलाइन 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) को आपके सभी रीडलाइन-सक्षम कार्यक्रमों को प्रभावित करना चाहिए;)


इस पर कोई स्थिति? मैं ऐसा कुछ खोजने की कोशिश कर रहा हूं (बैश के लिए नहीं बल्कि अन्य रीडलाइन आधारित संकेतों के लिए जो मैं उपयोग करता हूं)। मैं गुगली कर रहा हूं और उसे कोई और अपडेट नहीं मिला है (इसके अलावा और आपके द्वारा संदर्भित लेख )
माइक एचआर

4
EMPee584 से जोड़ने पर - यदि आप 4.3 या उच्चतर चला रहे हैं, तो अपनी ~/ .inputrc फ़ाइल सेट शो-मोड-इन-प्रॉम्प्ट में जोड़ें। यदि आप संपादन मोड में हैं, तो यह आपके प्रॉम्प्ट के बहुत बाईं ओर एक + जोड़ता है , और a: यदि आप कमांड मोड में हैं।
स्टूज

3
तो इस काम के दौरान; वहाँ ले जाने के लिए एक रास्ता है जहां यह vi- मोड चरित्र int वह तुरंत बैठता है? यदि आपके पास बहु-पंक्ति संकेत (रिवाज) है तो यह सब ठीक नहीं चल सकता है :)
जेम्स मिल्स

4.3 के लिए यह हमेशा प्रॉम्प्ट की शुरुआत में है और दुर्भाग्य से, रीडलाइन केवल एक मल्टीलाइन प्रॉम्प्ट की अंतिम पंक्ति को फिर से तैयार करेगी। वर्कअराउंड के लिए "मल्टीलाइन प्रॉम्प्ट एंड .inputrc" उत्तर देखें या इसके लिए 4.4 के फिक्स के साथ बैश 4.3 के पैचिंग के बारे में उत्तर देखें।
स्टूजेक

20

बैश 4.4 / रीडलाइन 7.0 उपयोगकर्ता- सेटल करने योग्य मोड स्ट्रिंग्स के लिए समर्थन जोड़ देगा

आप बीटा संस्करणों की कोशिश कर सकते हैं, लेकिन वे इस समय थोड़ी छोटी लग रही हैं। वे अभी तक यह निर्दिष्ट करने का समर्थन नहीं करते हैं कि प्रॉम्प्ट में आप मोड संकेतक कहां चाहते हैं (जो मुझे लगता है कि हत्यारा सुविधा है)।

यदि आप इंतजार नहीं करना चाहते हैं, और थोड़ा संकलन से डरते नहीं हैं, तो मैंने बैश 4.3 और रीडलाइन 6.3 के पैच किए गए संस्करण प्रकाशित किए हैं जो इस कार्यक्षमता का समर्थन करते हैं।

पैच किए गए संस्करणों के साथ आप इस तरह से सामान कर सकते हैं:

यहां छवि विवरण दर्ज करें

अधिक विवरण, कैसे स्थापित करें सहित, https://github.com/calid/bash पर उपलब्ध हैं


19

Google सर्च करने के बाद, bash man पेज को देखें और फिर bash source कोड (lib / readline / vi_mode.c) को देखें, ऐसा लगता है कि इन्सर्ट मोड से कमांड मोड में जाने पर प्रॉम्प्ट को बदलने का कोई आसान तरीका नहीं है। ऐसा लगता है कि किसी व्यक्ति को बैश स्रोत को पैच करने के लिए यहां एक अवसर हो सकता है, हालांकि स्रोत में मोड को शुरू करने और रोकने के लिए कॉल होते हैं।

आपके पोस्ट को देखने के बाद यह मुझे bash vi मोड सेटिंग में दिलचस्पी लेने लगा। मैं vi से प्यार करता हूं और कमांड लाइन पर क्यों नहीं। हालाँकि ऐसा लग रहा है कि हमें तुरंत बदलाव के बिना इन्सर्ट मोड में है या नहीं (इसलिए कई फोरम पोस्ट्स के बारे में बताया गया है) इस पर नज़र रखना होगा कि आपके लायक क्या है, जब तक आप ईएससी को नहीं मारते तब तक आप इन्सर्ट मोड में हैं। इसे थोड़ा आसान बनाता है, लेकिन हमेशा उतना सहज नहीं है।

मैं आपके प्रश्न को ऊपर उठा रहा हूं क्योंकि मुझे यह देखने में दिलचस्पी है कि यह कहां जाता है।


7

मल्टीलाइन शीघ्र और .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' 

प्रिंटफ की प्रतिध्वनि में सामान्य प्रांप्ट स्ट्रिंग्स उपलब्ध नहीं हैं। -eInterprete रंग कोड है, और इसे जोड़ने के लिए आवश्यक नहीं है \[या \]है, जो वैसे भी काम नहीं करता।

मोड डालें :

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और से postfixed \2। देखें यहाँ । इसके अलावा, \[और \[अभी भी उत्सर्जित किया जाना चाहिए, लेकिन आपको प्रिंटफ के अंदर \\[और \\]अंदर की आवश्यकता होगी ।
टॉम हेल

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 मोड के लिए भी एक संकेतक प्राप्त करने की कोशिश करता हूं, और आप सभी ने सीखा है कि यह सरल है और अभी तक इसे करने का कोई तरीका नहीं है।

मेरा वर्तमान तरीका है: हिट 'ए' जब मुझे यकीन नहीं होता कि कौन सा मोड है। यदि BASH PROMOT के बाद IF 'a' दिखाई देता है, तो मुझे लगता है कि मैं 'INSERT' मोड में हूं। फिर भी, मैंने 'रिटर्न' को हिट किया और जारी रखा। छोटी झुंझलाहट को हल करने के लिए यह मेरे लिए एक आसान तरीका है।

वैसे, मैं 'उर्फ ए =' कैल ', या खाली हिट' थोड़ा उपयोगी 'देने के लिए कुछ और।


2
मेरे लिए "एस्क || c- [-" के बजाय सिर्फ हिट करने के लिए अधिक समझदारी होगी। फिर आपको यह जानने की जरूरत नहीं है कि आपका क्या मोड है; या आपके द्वारा हटाए गए अवांछित वर्ण डालें (या वापसी दबाएं)
wom

0

इस छवि की तरह बहुस्तरीय संकेत के लिए

मेरा काम इस तरह है

मेरा बैश प्रॉम्प्ट

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)$ ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.