विम में वर्तमान फ़ाइल का नाम बदल रहा है


392

मुझे विम में अपनी वर्तमान फ़ाइल का नाम कैसे बदलना चाहिए?

उदाहरण के लिए:

  • मैं संपादन कर रहा हूं person.html_erb_spec.rb
  • मैं चाहूंगा कि इसका नाम बदल दिया जाए person.haml_spec.rb
  • मैं संपादन जारी रखना चाहूंगा person.haml_spec.rb

मैं ऐसा करने के बारे में कैसे जाना होगा, सुरुचिपूर्ण ढंग से?

जवाबों:


87

वहाँ एक है थोड़ा प्लगइन दें यदि आप ऐसा करते है कि।


9
Rename.vim का यह अपडेट किया गया संस्करण CWD को सही ढंग से संभालता है - हमेशा मूल एक की निर्देशिका में फ़ाइल को बचाता है।
17

48
प्रश्न: "किस तरह का सोशियोपैथिक अजीबो डायर नाम में रिक्त स्थान रखता है?" - A: वह व्यक्ति जिसने बहुत पहले प्रोजेक्ट शुरू किया था, जो अब आपका बॉस है ... ने अपनी विशेषज्ञता के वास्तविक क्षेत्र में कोडिंग को बढ़ावा दिया: विकास कार्यप्रणाली का अनुसरण करते हुए और उन्हें टीम पर मजबूर करने के लिए।
१०:१३

3
@AaronMahan मैंने Rename2.vim (पथ में रिक्त स्थान की अनुमति देने के लिए होशियार (अधिक जटिल डेल्वरवर्ल्ड संस्करण की अवहेलना करते हुए) को ठीक कर दिया है और यहां से इसे निकाल दिया: github.com/aehlke/vim -rename3 यहां तक ​​कि बेहतर कार्यक्षमता के लिए पुल अनुरोध सबमिट करने के लिए स्वतंत्र महसूस करें!
ऐहलके जूल

4
@Stabledog Microsoft, जाहिरा तौर पर। Program Files (x86)। किसी भी समय इस निर्देशिका को इसके साथ काम करने की आवश्यकता है, इसे उद्धरणों में लपेटने की आवश्यकता है। जो उह, बहुत कुछ है।
जैकहेसकेबोर्ड

5
@ जेकहासाकेबोर्ड: +10। "प्रोग्राम फाइल्स (x86)" ऑल-टाइम जीतता है "एक ऑपरेटिंग सिस्टम में सबसे खराब एवर डायरेक्ट्री नाम जो कि लैम्प्स साइमलिंक करता है।" :)
१५:०२ पर स्टैब्लॉग

451

कमांड को कॉल किया जाता है :saveas, लेकिन दुर्भाग्य से यह आपकी पुरानी फाइल को डिलीट नहीं करेगा, आपको इसे मैन्युअल रूप से करना होगा। :help saveasअधिक जानकारी के लिए देखें ।

संपादित करें:

अधिकांश विम इंस्टॉलेशन में एक एकीकृत फ़ाइल एक्सप्लोरर है, जिसका उपयोग आप ऐसे ऑपरेशन के लिए कर सकते हैं। :Exploreकमांड मोड में प्रयास करें (मैं वास्तव में एक फ़ंक्शन कुंजी को मैप करूंगा, यह बहुत आसान है)। उदाहरण के लिए, आप फ़ाइलों का नाम बदल सकते हैं Rया उन्हें हटा सकते हैं D। लेकिन <F1>एक्सप्लोरर में दबाने से आपको बेहतर अवलोकन मिलेगा।


6
मुझे नहीं लगता कि यह अन्य संपादकों की तुलना में अजीब है जहां आप सामान्य रूप से एक फ़ाइल को स्थानांतरित नहीं कर सकते हैं। इसके बजाय आपको अपनी पसंद के फ़ाइल प्रबंधक पर जाना होगा, फ़ाइल का नाम बदलना होगा, और अपने संपादक पर वापस जाना होगा। यदि आप भाग्यशाली हैं कि आपको अपना संपादक छोड़ना और पुनः आरंभ करना है, यदि इसे फ़ाइल नाम परिवर्तन की सूचना नहीं मिली है।
राफेल बुगाजेस्की

130
You might also like: सेक्स ( विभाजन तलाश के लिए आशुलिपि :-))
पीटर जानकुलीक

6
इसके अलावा, ई वर्तमान फलक में खुल जाएगा। से कम रोमांचक: सेक्स लेकिन अधिक कुशल;)।
जोश

56
निडर के लिए, ऊर्ध्वाधर: सेक्स है: वीएक्स।
hobbes3

5
@ जोश: ई मेरे लिए काम करता है: ई यह मेरे लिए काम नहीं करता है। मैं उपयोग करता हूं: एक ही विंडो में अन्य फाइल को संपादित करने के लिए ई।
omar

159

यदि आप git का उपयोग करते हैं और पहले से ही tpope का प्लगइन fugitive.vim है तो बस:

:Gmove newname

यह करेगा:

  1. डिस्क पर अपनी फ़ाइल का नाम बदलें।
  2. फ़ाइल को git रेपो में नाम बदलें।
  3. फ़ाइल को वर्तमान बफ़र में पुनः लोड करें।
  4. पूर्ववत इतिहास को संरक्षित करें।

यदि आपकी फ़ाइल अभी तक गिट रेपो में नहीं जोड़ी गई है तो पहले इसे जोड़ें:

:Gwrite

4
मेरी आँखों से आँसू निकल आए। एकदम सही जवाब!
फरीद नूरी नेश्त

3
मैंने इस उत्तर के सम्मान में दो बकरों की बलि दे दी! लेकिन मुझे इसके साथ एक छोटी सी समस्या है, क्योंकि आपको काम करने वाले पेड़ की जड़ से रास्ता लिखना होगा; और यह अक्सर किसी भी परियोजना में लंबा हो जाता है। क्या इसका कोई हल है?
xor

1
एक दम बढ़िया! मैं नई चीजें खोजता रहता हूं जो भगोड़े कर सकते हैं।
रिच चर्चर

8
@ XXX: जैसा कि मेस्को के जवाब में बताया गया है, आप वर्तमान फ़ाइल नाम डालने के लिए Ctrl + R% का उपयोग कर सकते हैं, जिसे तब संपादित किया जा सकता है।
डेल्टैब

4
यहां कुछ टिप्पणियों को संयोजित करने के लिए: :Gmoveनए फ़ाइलनाम के लिए सापेक्ष पथ की आवश्यकता है। ऐसा करने का एक अच्छा तरीका यह है कि टाइप करें :Gmove <ctrl-r>%जो वर्तमान पथ / फ़ाइलनाम को जोड़ता है।
शमप

80

मैं इसे NERDTree प्लगइन के साथ कर रहा हूँ:

:NERDTreeFind

फिर दबायें m

नाम बदलने के लिए आप (m)ove the current nodeफ़ाइल का नाम चुन सकते हैं और बदल सकते हैं । इसके अलावा डिलीट, कॉपी, मूव आदि जैसे विकल्प हैं ...


1
आप जानते हैं कि इन दिनों सामानों का नाम बदलने का मुख्य तरीका क्या है
सैम सैफ्रन

2
यह एक बहुत अच्छी तरह से काम करता है। निश्चित रूप से इसकी सिफारिश करते हैं।
मैट सेटर

विचार को प्यार करो। यह अब मेरी मुख्य परिवर्तन फ़ाइल नाम विधि होगी।
SLN

72
  • :w newnameकॉपी बनाने के लिए फाइल को एडिट करते समय लिखें -।
  • नई प्रति संपादित करना शुरू करें - :e#
  • (वैकल्पिक रूप से) वर्ष प्रतिलिपि निकालने - :!rm oldname

विंडोज पर, वैकल्पिक तीसरा चरण थोड़ा बदलता है:

  • (वैकल्पिक रूप से) पुरानी विंडोज कॉपी को हटा दें - :!del oldname

3
मैं हर समय इस दृष्टिकोण का उपयोग करता हूं, हालांकि, नकारात्मक पक्ष यह है कि आप अपने पूर्ववत पेड़ को खो देते हैं - इसलिए आप इससे पहले कुछ भी पूर्ववत नहीं कर सकते: ई
रैंप

7
अच्छा लगा। जाहिरा तौर पर Ctrl-6 ऐसा ही करता है: e #
ग्लेन जैकमैन

आप निर्देशिका भी खोल सकते हैं, कर्सर को फ़ाइल में ले जा सकते हैं और फ़ाइल हटाने के लिए "D" दबा सकते हैं।
पेडर

38
अधिक सीधा रास्ता imho 1 है) वर्तमान बफर का नाम बदलें :f newname2) इसे बचाएं :w3) (वैकल्पिक रूप से) !rm oldname। लाभ यह है कि आपका पूर्ववत इतिहास संरक्षित है।
कियान

3
:saveasउस संबंध में बेहतर है, @ क्रैम्पियन - और जो @kynan ने लिखा है।
lericson

36

यदि फ़ाइल पहले से सहेजी गई है:

:!mv {file location} {new file location}
:e {new file location}

उदाहरण:

:!mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala
:e src/test/scala/myNewFile.scala

अनुमति आवश्यकताएँ:

:!sudo mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala

के रूप रक्षित करें:

:!mv {file location} {save_as file location}
:w
:e {save_as file location} 


Windows Unverified के लिए

:!move {file location} {new file location}
:e {new file location}

5
आप कम से कम यह समझा सकते हैं कि आपने इस उत्तर को क्यों वोट दिया।
बेंजामिन

31

मैं सलाह देते हैं :Renametpope से हिजड़ा इस के लिए।

इसमें अन्य आसान आदेशों का एक समूह भी शामिल है।

नाम कमांड को वर्तमान में निम्नानुसार परिभाषित किया गया है (किसी भी अपडेट के लिए रेपो की जांच करें!):

command! -bar -nargs=1 -bang -complete=file Rename :
  \ let s:file = expand('%:p') |
  \ setlocal modified |
  \ keepalt saveas<bang> <args> |
  \ if s:file !=# expand('%:p') |
  \   call delete(s:file) |
  \ endif |
  \ unlet s:file

31

आप इसे netrw का उपयोग करके भी कर सकते हैं

एक्सप्लोर कमांड ओपन फाइल की डायरेक्टरी में netrw को ओपन करता है

:E

जिस फ़ाइल का आप नाम बदलना चाहते हैं, उस पर कर्सर ले जाएँ:

R

नए नाम में टाइप करें, एंटर दबाएं, y दबाएं।


महान! मैं भी netrw के बारे में पता नहीं था।
जवदाबा

31

छोटे, सुरक्षित, प्लगइन के बिना:

:sav new_name
:!rm <C-R>#  // or !del <C-R># for windows

control+ R, दबाने से पहले #तुरंत एक वैकल्पिक-फ़ाइल (वर्तमान विंडो में पहले से संपादित पथ) तक विस्तारित होगा Enter। यह हमें समीक्षा करने की अनुमति देता है कि हम वास्तव में क्या हटाने जा रहे हैं। |ऐसे मामले में पाइप का उपयोग करना सुरक्षित नहीं है , क्योंकि यदि savकिसी कारण से विफल हो जाता है, तब भी #दूसरी जगह (या कुछ भी नहीं) को इंगित करेगा। इसका मतलब है !rm #या delete(expand(#))पूरी तरह से अलग फ़ाइल को हटा सकते हैं! तो इसे हाथ से सावधानी से करें या अच्छी स्क्रिप्ट का उपयोग करें (वे यहाँ कई उत्तरों में उल्लिखित हैं)।

शिक्षात्मक

... या एक फ़ंक्शन / कमांड / स्क्रिप्ट बनाने का प्रयास करें। Sth सरल से शुरू करें जैसे:

command! -nargs=1 Rename saveas <args> | call delete(expand('#')) | bd #

vimrc रीलोड के बाद, बस टाइप करें :Rename new_filename। इस कमांड में क्या समस्या है?

सुरक्षा परीक्षण 1::Rename तर्क के बिना क्या करता है?

हाँ, यह '#' में छिपी फ़ाइल को हटा देता है!

समाधान: आप उदाहरण के लिए उपयोग कर सकते हैं। ऐसी स्थिति या tryकथन:

command! -nargs=1 Rename try | saveas <args> | call delete(expand('#')) | bd # | endtry

सुरक्षा परीक्षण 1: :Rename (बिना तर्क के) त्रुटि फेंक देगा:

E471: तर्क की आवश्यकता है

सुरक्षा परीक्षण 2: क्या होगा यदि नाम पिछले एक जैसा ही होगा?

सुरक्षा परीक्षण 3: यदि फ़ाइल आपके वास्तविक से अलग स्थान पर होगी तो क्या होगा?

इसे स्वयं ठीक करें। पठनीयता के लिए आप इसे इस तरीके से लिख सकते हैं:

function! s:localscript_name(name):
  try
    execute 'saveas ' . a:name
    ...
  endtry
endfunction
command! -nargs=1 Rename call s:localscript_name(<f-args>)

टिप्पणियाँ

  • !rm #से बेहतर है !rm old_name-> आपको पुराना नाम याद रखने की आवश्यकता नहीं है

  • !rm <C-R>#!rm #यह हाथ से करने पर बेहतर है -> आप देखेंगे कि आप वास्तव में क्या हटाते हैं (सुरक्षा कारण)

  • !rmआम तौर पर बहुत सुरक्षित नहीं है ... mvएक कचरा स्थान के लिए बेहतर है

  • call delete(expand('#'))शेल कमांड (OS अज्ञेयवादी) से बेहतर है लेकिन टाइप करने के लिए लंबा और असंभव है control+ का उपयोग करनाR

  • try | code1 | code2 | tryend -> जब कोड 1 के दौरान त्रुटि होती है, तो कोड 2 न चलाएं

  • :sav(या :saveas) के बराबर है :f new_name | w- फ़ाइल_ देखें - और पूर्ववत इतिहास को संरक्षित करता है

  • expand('%:p')आपके स्थान का पूरा रास्ता देता है ( %) या वैकल्पिक फ़ाइल का स्थान ( #)



10

गैरी बर्नहार्ट के .vimrc में एक फ़ंक्शन है जो इसे संभालता है।

function! RenameFile()
let old_name = expand('%')
let new_name = input('New file name: ', expand('%'), 'file')
if new_name != '' && new_name != old_name
    exec ':saveas ' . new_name
    exec ':silent !rm ' . old_name
    redraw!
endif
endfunction
map <leader>n :call RenameFile()<cr>

5
मुझे आप सभी पसंद है। कम से कम मैं फ़ाइलों का नाम बदल सकता हूं।
जीनजेन थॉमस

यह एक महान जवाब है, कोई अतिरिक्त प्लगइन की आवश्यकता नहीं है।
डब्ल्यूपी

8
:!mv % %:h/new_name

रजिस्टर %में वर्तमान फ़ाइल का नाम है। '%:h'वर्तमान फ़ाइल युक्त निर्देशिका 'हेड' को दिखाता है, जैसे: आपकी फ़ाइल पूर्ण पथ होने पर %:hवापस आती /abc/defहैabc/dev/my.txt


7

इस बारे में कैसे (जेक के सुझाव से सुधार):

:exe "!mv % newfilename" | e newfilename

हम्म, मुझे स्पष्ट करना चाहिए कि यह मैकविम पर कल काम किया था, लेकिन मुझे एक सर्वर में तोड़ दिया गया था और आज कोशिश की और 2 डी कमांड को एक कोलोन कमांड के रूप में नहीं माना गया ...
murftown

1
वास्तव में अब यह MacVim पर काम नहीं कर रहा है। ड्रॉइंग बोर्ड पर वापस! :)
मुरफ्ताउन

2
यह होना चाहिए:exe "!mv % newfilename" | e newfilename
जेक

धन्यवाद जेक, यह मेरे समाधान से थोड़ा बेहतर है। अपडेट किया गया।
murftown

7

विम का एक renameकार्य है, लेकिन दुर्भाग्य से यह इतिहास को बरकरार नहीं रखता है।

इतिहास खोए बिना किसी फ़ाइल का नाम बदलने का सबसे आसान OS अज्ञेय तरीका होगा:

:saveas new_file_name
:call delete(expand('#:p'))

expand('#:p') पुरानी फ़ाइल का पूर्ण पथ देता है।

:bd #यदि आप पुरानी फ़ाइल को बफर सूची से हटाना चाहते हैं, तो इसका उपयोग करें ।

या एक प्लगइन बनाएं

यदि आप फ़ाइल का नाम बदलने के लिए एक त्वरित आदेश का उपयोग करना चाहते हैं, तो निम्नलिखित सामग्री के साथ ~ / .vim / प्लगइन के तहत एक नई फ़ाइल जोड़ें:

function! s:rename_file(new_file_path)
  execute 'saveas ' . a:new_file_path
  call delete(expand('#:p'))
  bd #
endfunction

command! -nargs=1 -complete=file Rename call <SID>rename_file(<f-args>)

कमांड Renameआपको फ़ाइल का नाम बदलने में जल्दी मदद करेगी।


: कॉल डिलीट ('<Cr> #') लिखना आसान है।
MaikoID

7

टिम पोप द्वारा विम- यूनुच नामक एक दृष्टिगत रूप से बड़ा प्लगइन है जिसमें एक पुनर्नामित फ़ंक्शन के साथ-साथ कुछ अन्य उपहार भी हैं (हटाएं, ढूंढें, सभी को बचाएं, chmod, sudo edit, ...)।

Vim-eunuch में एक फ़ाइल का नाम बदलने के लिए:

:Move filename.ext

नाम बदलने की तुलना में ।vim:

:rename[!] filename.ext

कुछ कीस्ट्रोक्स बचाता है :)


और यह वास्तव में कुछ अन्य बहुत उपयोगी कार्य है!
पियरे-एड्रियन ब्यूसन

5

प्लगइन्स का उपयोग किए बिना मौजूदा फ़ाइल का नाम बदलने के लिए आपको कमांड का उपयोग करना चाहिए

:Explore

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


3

मुझे नहीं पता कि यह "सबसे आसान" तरीका है, लेकिन यह मानते हुए कि आपने अपनी फ़ाइल (: w) पहले से ही सहेज रखी है, मैं शेल (: श) आह्वान करूँगा और एक साधारण सी.पी. Ctrl-D / Exit का उपयोग करें। इस लिंक पर vi संपादक की उपयोगी सूची


यह फ़ाइल की प्रतिलिपि बनाएगा, नाम नहीं बदलेगा।
इन्नाम

आह - मैंने गलत किया "मैं व्यक्ति को संपादित करना जारी रखना चाहूंगा ।haml_spec.rb" मेरा बुरा!
DBMarcos99

मुझे लगता है कि आप कर सकते हैं:! cp foo foo.new और फिर: e foo.new?
DBMarcos99

3

तुम भी उपयोग कर सकते हैं: च के बाद: w


3
यह पुरानी फ़ाइल को नहीं हटाता है।
कीथ पिंसन

1

यह छोटी स्क्रिप्ट सही नहीं है (अतिरिक्त कैरिज-रिटर्न जिसे आपको दबाना है) लेकिन यह काम पूरा कर लेता है।

function Rename()
  let new_file_name = input('New filename: ')
  let full_path_current_file = expand("%:p")
  let new_full_path = expand("%:p:h")."/".new_file_name
  bd    
  execute "!mv ".full_path_current_file." ".new_full_path
  execute "e ".new_full_path
endfunction                                                                                                                                                                                                                                 

command! Rename :call Rename()
nmap RN :Rename<CR>

0

एक अन्य तरीका सिर्फ नेट्रव का उपयोग करना है, जो विम का एक मूल हिस्सा है।

:e path/to/whatever/folder/

फिर हटाने, नाम बदलने आदि के विकल्प हैं।

आपके द्वारा संपादित की जा रही फ़ाइल के फ़ोल्डर में netrw खोलने के लिए एक कीमैप है:

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>

0

:sav newfile | !rm #

ध्यान दें कि यह बफर सूची से पुरानी फ़ाइल को नहीं हटाता है। यदि आपके लिए यह महत्वपूर्ण है, तो आप इसके बजाय निम्नलिखित का उपयोग कर सकते हैं:

:sav newfile | bd# | !rm #

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