जब मैं उन्हें विम पर चिपकाता हूं तो मैं मूल स्रोत के रूप में कोड को कैसे रख सकता हूं?


37

जब मैं कुछ कोड को वेबपृष्ठों से कॉपी करता हूं और उसे VIM पर पेस्ट करता हूं, तो मुझे लगता है कि यह एक गद्य शैली की सीढ़ी की तरह है

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

चूंकि यह इतनी नियमित रूप से गड़बड़ है, इसलिए मुझे लगता है कि शायद मेरे साथ कुछ गलत है .vimrcजो नीचे है:

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

आमतौर पर मैं VIM में अजगर लिखता हूं। और मदद की सराहना की जाएगी।


1
धन्यवाद। इसने मुझे सालों तक परेशान किया, और मैं कभी किसी से इसके बारे में पूछने के लिए इधर-उधर नहीं हुआ। +1।
DevSolar

जवाबों:


50

इससे पहले करें:

:set paste

उसके बाद:

:set nopaste

की जरूरत नहीं है gvim; चिपकाने पर यह स्वचालित रूप से चालू और बंद हो जाता है।
बेंजामिन बैनियर

किसी भी विचार क्यों है?
नाथन फ़ेलमैन

1
बस अनुमान लगा रहा है: सादा विम केवल कमांड-लाइन है, और क्लिपबोर्ड के बारे में "पता नहीं" है। यह एक इनपुट चरित्र अनुक्रम के रूप में "पेस्ट" लेता है, और ऑटो-इंडेंटिंग लागू करता है। GUI- अवगत gvim "पता" कर सकता है कि आने वाला डेटा क्लिपबोर्ड से है, और इस तरह उद्देश्य के लिए ऑटोइंडेंटिंग को अक्षम कर देता है।
DevSolar

यह सही है। टर्मिनल "पेस्ट" ऑपरेशन को कच्चे चरित्र इनपुट के रूप में मानता है।
इग्नासियो वाज़क्वेज़-अब्राम्स

यह पूरी तरह से एक vim मुद्दा नहीं है - आप कमांड प्रॉम्प्ट में पुराने DOS संपादक में चिपकाने के समान प्रभाव प्राप्त कर सकते हैं। यह प्रोग्राम विंडोज 7 64-बिट में गायब प्रतीत होता है - संभवतः क्योंकि यह वास्तव में एक पुराना 16-बिट डॉस ऐप है और इसे अपडेट करने की परेशानी के लायक नहीं था। यह Windows XP में है, हालांकि, और उस (1) में चिपकाना वास्तव में धीरे-धीरे काम करता है, चरित्र-दर-वर्ण इनपुट को बाहर करना, और (2) एक वास्तविक गड़बड़ करता है।
स्टीव 314

16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

कोड पेस्ट के लिए ऑटो-इंडेंटिंग टॉगल करें

पृष्ठभूमि

यदि आप पाठ को पेस्ट करने के लिए Vim कमांड का उपयोग करते हैं, तो कुछ भी अप्रत्याशित नहीं होता है। समस्या केवल तब उत्पन्न होती है जब किसी अन्य अनुप्रयोग से पेस्ट किया जाता है, और केवल तब जब आप विम के GUI संस्करण का उपयोग नहीं कर रहे हैं। विम के कंसोल या टर्मिनल संस्करण में, किसी अन्य एप्लिकेशन से टेक्स्ट पेस्ट करने के लिए कोई मानक प्रक्रिया नहीं है। इसके बजाय, टर्मिनल कीबोर्ड बफर में पाठ सम्मिलित करके चिपकाने का अनुकरण कर सकता है, इसलिए विम को लगता है कि पाठ उपयोगकर्ता द्वारा टाइप किया गया है। प्रत्येक पंक्ति के समाप्त होने के बाद, विम कर्सर को आगे बढ़ा सकता है, इसलिए अगली पंक्ति अंतिम के समान इंडेंट के साथ शुरू होती है। हालांकि, यह पहले से ही चिपकाए गए पाठ में इंडेंटेशन को बदल देगा।

पेस्ट टॉगल करें

निम्नलिखित को अपने vimrc में रखें (जो भी कुंजी आप चाहते हैं उसे बदलें):

set pastetoggle=<F2>

किसी अन्य एप्लिकेशन से चिपकाने के लिए:

  • इन्सर्ट मोड शुरू करें।
  • F2 दबाएं ('पेस्ट' विकल्प को चालू करता है)।
  • क्लिपबोर्ड से टेक्स्ट पेस्ट करने के लिए अपने टर्मिनल का उपयोग करें।
  • F2 दबाएं ('पेस्ट' विकल्प को बंद कर देता है)।

फिर चिपकाए गए पाठ के मौजूदा इंडेंटेशन को बरकरार रखा जाएगा।

आपको पहले इंसर्ट मोड शुरू नहीं करना है, लेकिन यदि आप सामान्य मोड में हैं और F2 के लिए मैपिंग है, तो वह मैपिंग लागू होगी, और 'पेस्टेटॉगल' फ़ंक्शन संचालित नहीं होगा।

कुछ लोग आपके vimrc के लिए निम्नलिखित विकल्प द्वारा स्थिति पंक्ति में दिखाई गई दृश्य प्रतिक्रिया पसंद करते हैं:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

पहली पंक्ति एक मैपिंग सेट करती है जिससे कि सामान्य मोड में F2 दबाने पर 'पेस्ट' विकल्प उल्टा हो जाएगा, और फिर उस विकल्प का मान दिखाएगा। दूसरी पंक्ति आपको आवेषण मोड में 'प्रेस' को चालू और बंद करने के लिए F2 दबाने की अनुमति देती है। तीसरी पंक्ति यह प्रदर्शित करने में सक्षम करती है कि क्या 'पेस्ट' को इन्सर्ट मोड में चालू किया गया है।


1
हॉटकी समाधान के लिए +1। वीआईएम (मेरे जैसे) में भी नहीं-फर्म के लिए, जिन्होंने पहले से ही एफ-कीज़ को कुछ और (जैसे मेरे) मैप किया है, <C-F2> होगा Ctrl-F2 ...
DevSolar

उत्कृष्ट - मैं अब इसका उपयोग कर रहा हूं
hoju

केवल अपने मूल कार्यों के साथ <S-Insert> या <Ctrl + V> जैसे पेस्ट कुंजियों को स्वचालित रूप से ऐसा करने के लिए क्यों न करें? या, एक फ़ंक्शन लिखें जो पेस्ट को निष्क्रिय करता है जब कुछ इनपुट वर्ण एक सेकंड के समय में बफर को लिखे जाते हैं, तो यह सिर्फ एक विचार है, निश्चित रूप से मेरे लिए मेरे पास लगभग सभी मेरी कुंजी अन्य सामानों के लिए मैप की गई है, इसलिए यह एक दर्द है , मैं भी 12 एफ कुंजी और + 15 अधिक एफ कुंजी (जी कुंजी) के साथ एक कीबोर्ड है, और उस के साथ, तीन स्तरों, जो अभी भी पर्याप्त नहीं है :) लेकिन मेरे बस। एकमात्र समस्या है, राइट-क्लिक मेनू, जिसे कोई
एससीएस सेक् स

2

यह ऑटोइंडेंट है जो आपके साथ खिलवाड़ कर रहा है।

set autoindent
set smartindent

जब आप अपने कोड को काटते और चिपकाते हैं, तो उन्हें अक्षम करने का प्रयास करें, और फिर जब आप कर लें तब उन्हें फिर से सक्षम करें।


-2

इसे प्राप्त करने के लिए सबसे कम प्रयास हैं (इसे लगाया जा सकता है .vimrc):

:set paste

फिर अपना कोड पेस्ट करें।


3
'paste'विकल्प स्थायी रूप से सेट किया जा करने के लिए होती कभी नहीं किया गया था। यह बहुत सारी चीजों को निष्क्रिय कर देता है, जिसमें मैपिंग और संक्षिप्तीकरण शामिल हैं। इसके अलावा, एक पिछला जवाब पहले से ही 'paste'विकल्प को कवर करता है।
हेप्टाइट

2
सुपर उपयोगकर्ता में आपका स्वागत है! यह एक मौजूदा उत्तर को दोहराता है और कोई नई सामग्री नहीं जोड़ता है। कृपया जवाब न दें जब तक कि आपके पास योगदान देने के लिए वास्तव में कुछ नया न हो।
टोबे स्पाइट नाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.