पूरा करते समय कमांड के पहले अक्षर डिस्प्ले में दोहराए जाते हैं


21

पहले दो वर्ण दोहराए गए थे जबकि मैं Tabपूरा करने के लिए उपयोग करता हूं। नीचे स्क्रीनशॉट cdमें दोहराया गया है।

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

मैंने rxvt-unicdoe, xterm, टर्मिनेटर की कोशिश की है। इन सभी टर्मिनल एमुलेटरों में यह मुद्दा है।

Zsh संस्करण 5.0.2, कॉन्फ़िगर फ़ाइल पर my-zsh


क्या अक्षर कमांड में दोहराए जाते हैं जो zsh निष्पादित करते हैं, या क्या वे केवल प्रदर्शित होते हैं? यदि कमांड दो वर्णों से अधिक है, तो क्या वर्णों की संख्या बदल जाती है? क्या वर्तमान निर्देशिका में परिवर्तन होने पर संख्या बदल जाती है?
गिलेस एसओ- बुराई को रोकना '

@ गिले बार-बार आदेश में मौजूद नहीं है। मैं कमांड निष्पादित कर सकता हूं।
जिलन

जवाबों:


32

यदि आपकी कमांड लाइन पर वर्ण कभी-कभी ऑफ़सेट पर प्रदर्शित होते हैं, तो ऐसा अक्सर होता है क्योंकि zsh ने प्रॉम्प्ट के लिए गलत चौड़ाई की गणना की है। लक्षण हैं कि प्रदर्शन दिखता है ठीक जब तक आप वर्ण जोड़ने या वर्ण दर वर्ण चलती लेकिन जब आप अन्य आदेशों कर्सर (ले जाने का उपयोग करें (कुछ उन्हें करना चाहिए की तुलना में आगे सही प्रदर्शित होने के पात्रों के साथ) ठीक से प्रदर्शित हो जाता है कर रहे हैं Home, पूरा होने, आदि ) या जब कमांड दूसरी पंक्ति को ओवरलैप करता है।

कमांड के अक्षर कहां रखे गए हैं, यह जानने के लिए Zsh को संकेत की चौड़ाई को जानना होगा। यह मानता है कि प्रत्येक चरित्र एक स्थिति पर कब्जा कर लेता है जब तक कि अन्यथा न कहा जाए।

एक संभावना यह है कि आपके प्रॉम्प्ट में एस्केप सीक्वेंस हैं जो ठीक से सीमांकित नहीं हैं। एस्केप अनुक्रम जो पाठ के रंग या अन्य स्वरूपण पहलुओं को बदलते हैं, या जो विंडो शीर्षक या अन्य प्रभावों को बदलते हैं, में शून्य चौड़ाई होती है। उन्हें प्रतिशत-ब्रेसिज़ निर्माण के भीतर शामिल करने की आवश्यकता है%{…%} । अधिक आम तौर पर, भागने का क्रम %42{…%}zsh को यह बताने के लिए कहता है कि ब्रेसिज़ के अंदर जो है वह 42 अक्षर चौड़ा है।

इसलिए अपनी प्रॉम्प्ट सेटिंग्स ( PS1और PROMPT, या वे वेरिएबल जिन्हें वे रेफरेंस करते हैं) चेक करें और सुनिश्चित करें कि सभी सीक्वेंस से बच जाएं (जैसे कि \e[…mटेक्स्ट फीचर्स बदलने के लिए - ध्यान दें कि यह कुछ वैरिएबल जैसे मौजूद हो सकता है $fg[red]) अंदर हैं %{…%}। चूंकि आप ओह-माय-ज़श का उपयोग कर रहे हैं, इसलिए अपनी सेटिंग्स और परिभाषाएँ जो आप ओह-माय-ज़श से उपयोग कर रहे हैं, दोनों की जाँच करें।

इसी मुद्दे पर मारपीट होती है। वहाँ एक में तत्काल चौड़ाई शून्य अनुक्रम संलग्न करने की आवश्यकता है \[…\]

एक और संभावना यह है कि आपके प्रॉम्प्ट में गैर- ASCII वर्ण हैं और उस zsh (या किसी अन्य अनुप्रयोग) और आपके टर्मिनल का एक अलग विचार है कि वे कितने व्यापक हैं। यह तब हो सकता है जब आपके टर्मिनल के एन्कोडिंग और शेल में घोषित एन्कोडिंग के बीच एक बेमेल है , और दो एन्कोडिंग के परिणामस्वरूप कुछ बाइट अनुक्रमों के लिए अलग-अलग चौड़ाई में परिणाम होते हैं। आमतौर पर आप इस मुद्दे पर एक गैर-यूनिकोड टर्मिनल का उपयोग कर सकते हैं, लेकिन एक यूनिकोड लोकेल या इसके विपरीत घोषित कर सकते हैं।

अनुप्रयोग वातावरण जानने के लिए पर्यावरण चर पर भरोसा करते हैं; प्रासंगिक सेटिंग है LC_CTYPE, जो वातावरण चर से निर्धारित किया जाता है LANGUAGE, LC_ALL, LC_CTYPEऔर LANG(इनमें से पहला है कि सेट है लागू होता है)। कमांड locale | grep LC_CTYPEआपको आपकी वर्तमान सेटिंग बताता है। आमतौर पर स्थानीय मुद्दों से बचने का सबसे अच्छा तरीका टर्मिनल एमुलेटर को सेट करना है LC_CTYPE, क्योंकि यह जानता है कि यह एन्कोडिंग क्या उम्मीद करता है; लेकिन अगर वह आपके लिए काम नहीं कर रहा है, तो सुनिश्चित करें कि सेट करना है LC_CTYPE

समान लक्षण तब हो सकते हैं जब पिछली कमांड ने कुछ आउटपुट प्रदर्शित किया था जो एक नई रेखा में समाप्त नहीं हुआ था, ताकि प्रॉम्प्ट लाइन के बीच में प्रदर्शित हो लेकिन शेल को इसका एहसास नहीं होता है। इस मामले में जो केवल इस तरह के आदेश को चलाने के बाद होगा, लगातार नहीं।

यदि एक पंक्ति ठीक से प्रदर्शित नहीं होती है, तो कमांड redisplayया clear-screen( डिफ़ॉल्ट रूप से Ctrl+ Lसे) इसे ठीक कर देगा।


मुझे लगता है कि मैं शायद संबंधित फ़ॉन्ट को याद कर रहा हूं, मुझे लगता है कि पहला चर अजीब है। यह ->मुझे लगता है कि होने की उम्मीद है
जिल

@jilen आह, यह एक और मुद्दा हो सकता है जिसका मैं उल्लेख करना भूल गया: हो सकता है कि आपके प्रॉम्प्ट में आपके टर्मिनल से एक अलग एन्कोडिंग में गैर-एएससीआईआई अक्षर हों, जिसमें एक या दोनों एनकोडिंग मल्टीबाइट हो। यदि आप उस के साथ मदद चाहते हैं, localeऔर echo $PS1 | od -t x1(और किसी भी अन्य चर के साथ प्रयोग किया जाता है $PS1) के आउटपुट पोस्ट करें ।
गिलेस एसओ- बुराई को रोकना '

2
मैं लोकेल सेट करना भूल गया (मैं आर्चलिनक्स का उपयोग कर रहा हूं, लोकेल डिफ़ॉल्ट रूप से सेट नहीं होती है)। सेट लोकेल के बाद, यह समस्या ठीक हो जाती है। बहुत बहुत धन्यवाद, लड़का !!!!
जिलें

मैंने इसे अपवित्र किया क्योंकि, यह बहुत बढ़िया है। लेकिन भागने की जरूरत नहीं है अगर आप अन्यथा अपने आप पर कर्सर की गिनती को संभाल लें तो कोष्ठक में शामिल किया जाना चाहिए। एक सब्सक्राइब्ड फ़ंक्शन को कॉल करना मेरे लिए अतीत में काम कर चुका है - या ऐसे रीडायरेक्ट जो अभी भी स्टैडआउट को शामिल किए बिना / dev / tty पर काम कर सकते हैं। अन्य तरीके जो काम कर चुके हैं - \e{7,8}कर्सर राज्यों को बचाने / पुनर्स्थापित करने के लिए उपयोग करना।
मिकसेर्व

यह LC_CTYPEमेरे लिए यह तय था । मैंने इसे सेट किया था C, जब मैंने इसे परेशान किया, तो सब कुछ काम कर गया। धन्यवाद।
जलमनी

14

मुझे भी यही समस्या थी और मेरा समाधान यहाँ मिला: https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 । बस अपने में निम्नलिखित डाल दिया ~/.zshrc

export LC_CTYPE=en_US.UTF-8


1
आपके संकेत के लिए धन्यवाद! हालाँकि, localeमुझे पूरी तरह से रीसेट करना था जो मैं उपयोग कर रहा था, लेकिन इसने मेरे लिए काम किया। यह उत्तर उबंटू के लिए आवश्यक कदम प्रदान करता है।
अधिकतम

आपको बहुत - बहुत धन्यवाद! मुझे बहुत आक्रामकता से बचाया
मोशे

1

मैं macerm पर iTerm 2 में यह मुद्दा था। मैंने प्राथमिकताएँ -> प्रोफ़ाइल -> पाठ पर जाकर इसे हल किया और "यूनिकोड संस्करण 9 चौड़ाई का उपयोग करें" पर टिक कर दिया।


वाह, यह वास्तव में काम किया। धन्यवाद!
पॉल कैलाब्रो

1

मुझे यह मुद्दा ubuntu lts docker image ( ubuntu:latest) का उपयोग करके मिला है । मैंने इसे संबंधित पेज पर दिए गए निर्देश के साथ तय किया: https://hub.docker.com/_/ubuntu

apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
echo 'export LANG=en_US.utf8' >> ~/.zshrc
zsh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.