Vim ने कोड को गलत तरीके से क्यों इंडेंट किया?


100

विम में, अगर मैं यह स्क्रिप्ट पेस्ट करूँ:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

मुझे ये अजीब परिणाम मिले:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

हैश संकेत (#) और टैब दिखाई दिए हैं। क्यों?


31
यह vi.stackexchange.com के लिए एक बेहतर प्रश्न हो सकता है
एरिक

@EricRenouf क्यों? (ईमानदार प्रश्न)
प्रात: ४

3
@qix मेरा विचार था कि यह एक सवाल है कि विम कैसे काम करता है, जो कि * nix पर इस्तेमाल किया जाने वाला एक सामान्य उपकरण है, लेकिन * nix vim का उपयोग करने के लिए कोई आवश्यकता नहीं है
Eric Renouf

1
@JaredBurrows मुझे यकीन है कि उम्मीद है कि यह इसे बनाता है
एरिक

1
आप पेस्ट को कैसे ट्रिगर कर रहे हैं? माउस के साथ?
बेन वोइग्ट

जवाबों:


122

दो कारण हैं:

vimऑटो-इंडेंट सक्षम होने पर चिपकाने के लिए , आपको टाइप करके पेस्ट मोड में बदलना होगा :

:set paste

फिर आप मोड डालने और अपना कोड पेस्ट करने के लिए बदल सकते हैं। पेस्ट करने के बाद टाइप करें:

:set nopaste

पेस्ट मोड को बंद करने के लिए। चूंकि यह एक सामान्य और लगातार कार्रवाई है, vimटॉगल पेस्ट मोड प्रदान करता है:

set pastetoggle=<F2>

आप F2जो भी कुंजी चाहते हैं उसे बदल सकते हैं, और अब आप पेस्ट करना चालू कर सकते हैं और आसानी से बंद कर सकते हैं।


टिप्पणियों के ऑटो-इंसर्ट को बंद करने के लिए, आप इन लाइनों को अपने vimrc में जोड़ सकते हैं :

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimआपको सिस्टम क्लिपबोर्ड से पाठ चिपकाने के लिए एक पेस्टिंग रजिस्टर भी प्रदान करता है । आप अपने सिस्टम के आधार पर उपयोग "*pया "+pनिर्भर कर सकते हैं । बिना X11 वाले सिस्टम पर, जैसे कि OSX या विंडोज, आपको *रजिस्टर का उपयोग करना होगा। X11 सिस्टम पर, लिनक्स की तरह, आप दोनों का उपयोग कर सकते हैं।

आगे की पढाई


2
मैं हमेशा के लिए विम का उपयोग कर रहा हूं और इस बारे में कभी नहीं जानता था। बहुत धन्यवाद।
काजा

अधिकांश आधुनिक चित्रमय टर्मिनल एमुलेटर "ब्रैकेटेड पेस्ट मोड" नामक एक सुविधा का समर्थन करते हैं। विम इस मोड को सक्षम करने के लिए टर्मिनल से पूछ सकता है, जो बदले में, कुछ निश्चित अनुक्रमों के साथ चिपके हुए पाठ को घेर लेगा। विम इसे पहचान सकते हैं और पेस्ट की अवधि के लिए रैपिंग / इंडेंटिंग को बंद कर सकते हैं। लंबी कहानी की कहानी: चिपकाना "उम्मीद के मुताबिक काम करेगा"। मैं एक विम उपयोगकर्ता नहीं हूं, लेकिन एक त्वरित वेबसर्च आपको यह बताएगा कि इस मोड को कैसे कॉन्फ़िगर किया जाए।
१०:१० पर एंगमॉन्ट २

2
@MichaelDurrant set pasteकभी भी आपके vimrc में नहीं होना चाहिए। यह बहुत सारी चीज़ों को निष्क्रिय या रीसेट करता है, जिसमें इन्सर्ट मोड मैपिंग, कमांड लाइन मैपिंग, संक्षिप्ताक्षर, पाठ्यपुस्तक, रैपमर्गिन, ऑटोइंडेंट, स्मार्टइंडेंट, सॉफ्टटबटॉप, फॉर्मेटॉप्शन, इंडेंटेक्सप्र, और कुछ अन्य शामिल हैं। :h pasteपूरी सूची है। अधिकांश लोग इनमें से कुछ या सभी चीजों का उपयोग करते हैं और आश्चर्य करते हैं कि सेटिंग्स को अनदेखा क्यों किया जाता है।
FDinoff

4
मैं आमतौर पर :r!catशब्दशः चिपकाने के लिए उपयोग करता हूं ।
साइमन रिक्टर

1
यह इंटरएक्ट के साथ चर्चा करने के लायक हो सकता है set mouse, जो माउस क्लिक के साथ पेस्ट करने पर स्वचालित रूप से पेस्ट मोड में प्रवेश कर सकता है और छोड़ सकता है।
बेन वोइग्ट

36

विम पेस्ट का उपयोग करें। आप जो चाहते हैं, वह क्लिपबोर्ड बफर पर पेस्ट करना है "+p

यह +जगह में इसे चुनता है और चिपकाता है।

यदि आप लिनक्स का उपयोग कर रहे हैं, *तो एक्स / मध्य-क्लिक बफर (अंतिम चयनित पाठ) है।

फिर विम जानता है कि यह एक पेस्ट है।

अन्यथा विम आपको लगता है कि आपने पेस्ट की जा रही कुंजियों को टाइप किया है और पेस्ट के अंत में सभी ऑटो-इंडेंटेशन (आपके कॉपी किए गए इंडेंटेशन के ऊपर) करता है।

एसएसएच पर काम करने के लिए इसके लिए एक नोट के रूप में आपको अपने क्लिपबोर्ड के लिए साझा किए जाने वाले विकल्प को सेट करना होगा -Y

man sshअधिक जानकारी के लिए देखें।


4
यह वास्तव में सही उत्तर imho है
क्रिस्टोफ़र साल्-स्टोर्गाड

ऐसा लगता है कि यह केवल चित्रमय विम के लिए काम करता है ( gvim); एक टर्मिनल एमुलेटर में चल रहा विम अंतिम हटाए गए पाठ को "* p" के साथ चिपकाता है, वर्तमान चयन के नहीं।
wurtel

मैं gvim का उपयोग नहीं करता, केवल टर्मिनल vim। आपका माउस क्या है? मेरी माउस सेटिंग c है। निश्चित नहीं है कि जब माउस चयन की अनुमति है तो यह कैसे काम करता है। set mouse?
Exussum

2
यह भी vim --versionदेखें कि क्या यह क्लिपबोर्ड समर्थन के साथ संकलित किया गया था +xterm_clipboard, आउटपुट में होना चाहिए
एक्सयूसम

@wurtel: हो सकता है कि आपने unnamedस्ट्रिंग के साथ क्लिपबोर्ड सेट किया हो ।
cuonglm

8

टैब इसलिए डाले गए क्योंकि आपने ऑटोइंडेंट को चालू कर दिया है और :set noaiटर्मिनल में पेस्ट करने से पहले आप ऑटोइंडेंट ( ) को बंद करके उस व्यवहार को अक्षम कर सकते हैं ।

टिप्पणी की गई लाइनें ऑटो टिप्पणी द्वारा निर्मित होती हैं और इसे बंद करके अक्षम किया जा सकता है।

उन लोगों के लिए आपको :set pasteअपने फॉर्मेट कोड को चिपकाने और :set nopasteसामान्य व्यवहार को बहाल करने के लिए , टॉगल का उपयोग करके वांछित व्यवहार प्राप्त करना चाहिए ।

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