यम फ़ाइल का नाम / विम में वर्तमान बफर का पथ


187

वर्तमान बफ़र मानकर संपादित करने के लिए एक फ़ाइल खुली है, इसलिए :eप्रदर्शित नहीं होती है E32: No file name

मैं एक या सभी को करना चाहता हूं:

  • फ़ाइल का नाम ठीक वैसा ही जैसा कि स्टेटस लाइन पर दिखाया जाता है, जैसे ~\myfile.txt
  • फ़ाइल के लिए एक पूर्ण पथ, उदा c:\foo\bar\myfile.txt
  • बस फ़ाइल का नाम, जैसे myfile.txt


जवाबों:


207

टी एल; डॉ

:let @" = expand("%")>

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

:nmap cp :let @" = expand("%")<cr>

आप इसका उपयोग पूर्ण पथ के लिए भी कर सकते हैं

:let @" = expand("%:p")

व्याख्या

विम टेक्स्ट को स्टोर करने के लिए अनाम कोड का उपयोग करता है जिसे हटा दिया गया है या कॉपी किया गया है (yanked), इसी तरह जब आप पेस्ट करते हैं तो यह इस रजिस्टर से टेक्स्ट को पढ़ता है।

का उपयोग करते हुए letहम रजिस्टर का उपयोग करने में दुकान पाठ मैन्युअल कर सकते हैं :let @" = "text", लेकिन हम भी एक अभिव्यक्ति का परिणाम स्टोर कर सकते हैं।

उपरोक्त उदाहरण में हम फंक्शन का उपयोग करते हैं expandजो वाइल्डकार्ड और कीवर्ड का विस्तार करता है। हमारे उदाहरण में हम expand('%')वर्तमान फ़ाइल नाम का विस्तार करने के लिए उपयोग करते हैं । हम इसे expand('%:p')पूर्ण फ़ाइल नाम के रूप में संशोधित कर सकते हैं ।

:help let :help expand :help registersविवरण के लिए देखें


23
कूल ने इसे मेरे vimrc में जोड़ा: noremap <sil> <F4>: let @ + = Expand ("%: p") <CR>
ThePosey

9
विंडोज पर, आपको इसके बजाय का उपयोग करना चाहिए: यदि आप इसे विंडोज क्लिपबोर्ड में रखना चाहते हैं तो @ * = ("%") का विस्तार करें ।
KFL

15
यदि आप unnamedplusअपने क्लिपबोर्ड उपयोग के रूप में उपयोग कर रहे हैंlet @+ = expand("%")
केविन कॉक्स

4
"%:h"फ़ाइल नाम के बिना पूर्ण पथ प्राप्त करने के लिए उपयोग करें ।
पॉलीमोर्फिक्स

संबंधित, विशेष रूप से यदि आपको फ़ाइल नाम के बिना निर्देशिका की आवश्यकता है - stackoverflow.com/a/2233924/1882064
आर्कसेलडॉन

94

लगभग आप जो पूछ रहे हैं, और वह यह कर सकता है: Ctrl+R %वर्तमान फ़ाइल नाम को उस स्थान पर खींचता है जहाँ आप हैं (कमांड प्रॉम्प्ट, एडिट बफर, ...)। इस विम टिप को और देखें ।


1
जब आप संपादन मोड से बाहर निकलते हैं तो आप फ़ाइल का नाम जोड़ सकते हैं: ctrl- "ctrl-% p
stefanB

13
Ctrl+R %insertमोड में रहते हुए काम करता है - लेकिन editमोड में, का Ctrl+Rमतलब है फिर से करना।
केविन पेंको

3
StefanB का मतलब "सामान्य / कमांड मोड के लिए% p था। यह
इन्स

बस फिर से शुरू या अलग करने के लिए: ग्रेव्ह और डीडब्ल्यूसी दोनों के जवाब "रजिस्टर% से पेस्ट" हैं। एक इन्सर्ट मोड के लिए करता है, दूसरा सामान्य मोड के लिए। मैकविम में, ऐसा प्रतीत होता है कि% रजिस्टर को अधिलेखित नहीं किया जा सकता है।
एरिक हू

लिनेनंबर प्राप्त करने के लिए एक ही सरल आदेश है? ) समाधान के लिए thx
itnikolay

71

यदि आप अपने सिस्टम-स्तरीय क्लिपबोर्ड में वर्तमान बफर फ़ाइल नाम रखना चाहते हैं, तो रजिस्टर को @ + में बदलने का प्रयास करें:

" relative path
:let @+ = expand("%")

" full path
:let @+ = expand("%:p")

" just filename
:let @+ = expand("%:t")

संपादित करें 20140421: मैं आमतौर पर इनका उपयोग करता हूं, इसलिए मैंने कुछ शॉर्टकट बनाए। लिनक्स विम्स जाहिरा तौर पर मैक विम्स की तुलना में थोड़ा अलग तरीके से काम करता है , इसलिए इसके लिए एक विशेष मामला भी है। यदि आप निम्नलिखित को अपने में रखते हैं ~/.vimrc:

" copy current file name (relative/absolute) to system clipboard
if has("mac") || has("gui_macvim") || has("gui_mac")
  " relative path  (src/foo.txt)
  nnoremap <leader>cf :let @*=expand("%")<CR>

  " absolute path  (/something/src/foo.txt)
  nnoremap <leader>cF :let @*=expand("%:p")<CR>

  " filename       (foo.txt)
  nnoremap <leader>ct :let @*=expand("%:t")<CR>

  " directory name (/something/src)
  nnoremap <leader>ch :let @*=expand("%:p:h")<CR>
endif

" copy current file name (relative/absolute) to system clipboard (Linux version)
if has("gui_gtk") || has("gui_gtk2") || has("gui_gnome") || has("unix")
  " relative path (src/foo.txt)
  nnoremap <leader>cf :let @+=expand("%")<CR>

  " absolute path (/something/src/foo.txt)
  nnoremap <leader>cF :let @+=expand("%:p")<CR>

  " filename (foo.txt)
  nnoremap <leader>ct :let @+=expand("%:t")<CR>

  " directory name (/something/src)
  nnoremap <leader>ch :let @+=expand("%:p:h")<CR>
endif

फिर उदाहरण <leader>cfके लिए वर्तमान बफर के सापेक्ष पथ को कॉपी करेगा (डिफ़ॉल्ट लीडर बैकस्लैश ( \) है)। मैं अक्सर फाइल पर कमांड चलाने या कमांड लाइन पर अन्य काम करने के लिए इनका उपयोग करता हूं। मैं अक्सर अंतिम फ़ाइल नाम / निर्देशिका नाम का उपयोग नहीं करता हूं।

आप <leader>cfrसापेक्ष के लिए अधिक सहज मैपिंग पर विचार कर सकते हैं , <leader>cfaपूर्ण के लिए, <leader>cffकेवल फ़ाइल नाम के लिए, <leader>cfdनिर्देशिका के लिए।


2
विंडोज़ और मैक पर "*और "+बराबर हैं, इसलिए आप प्लेटफ़ॉर्म चेक के साथ डिस्पेंस कर सकते हैं और बस इस्तेमाल कर सकते हैं@+
गेबे मुथर्ट

1
अजीब तरह से यह एक vimscript फ़ंक्शन में काम नहीं करता है: "इको bufname ('%: p')" रिक्त है, लेकिन आप इसे लंबे समय तक "fnamemodify (bufname ('%')), ': p' के साथ ठीक कर सकते हैं ) "
डेविड लजुंग मैडिसन तारकीय

6

यदि आप करते हैं तो :regआपको %रजिस्टर में वर्तमान फ़ाइल का नाम दिखाई देगा । आप "%pउदाहरण के लिए, इसके साथ पेस्ट कर सकते हैं ।

यदि, मेरी तरह, आप अक्सर 'वैकल्पिक' बफ़र पर जाते हैं, तो यह बहुत आसान है कि इसका पूरा पथ-और-फ़ाइल-नाम #रजिस्टर में डाल दिया जाए । आप "#pउदाहरण के लिए, इसके साथ पेस्ट कर सकते हैं ।

ध्यान दें (बस यह मेरे सेटअप के लिए विशिष्ट व्यवहार है): मैं Ubuntu 14.04.4 LTS पर VIM 7.4.52 का उपयोग कर रहा हूं।


4

अन्य उत्तरों के एक जोड़े से जानकारी का संयोजन: यदि आप वर्तमान पूर्ण पथ को एक फ़ाइल में डालना चाहते हैं और इसे दूसरी विंडो में कमांड बफर में डालते हैं :let @" = expand("%:p"), तो पहले करें , फिर दूसरी विंडो में जाएं और टाइप करें Ctrl+R "

एक ही डायरेक्टरी में रहते हुए और पुराने को खुला रखते हुए किसी फाइल को कॉपी करने के लिए उपयोगी है। उदाहरण के लिए:

प्रारंभ : संपादन src / com / बेनेटकिन / पेंट / आकृतियाँ / Circle.java

  1. प्रकार :let @" = expand("%:p") (पथ मुख्य क्लिपबोर्ड बफ़र के लिए yanked हो जाता है।)

  2. के साथ एक नई विंडो खोलें :sp

  3. प्रकार :e Ctrl+R"

  4. सर्कल पर वापस जाने और इसे स्क्वायर में बदलने के लिए तीर कुंजियों का उपयोग करें, और <CR> दबाएं

अंत : संपादन src / com / benatkin / पेंट / आकृतियों / Square.java


1

यहाँ मेरा समाधान है:

" filename / dirname of the current file {{{
    " copy result to the system clipboard and echo the result
    " the cb> prompt means the clipboard
    " *f*ile *n*ame, ex. init.vim
    map <Leader>fn :let @+ = expand("%:t") \| echo 'cb> ' . @+<CR>
    " *f*ile *p*ath, ex. /home/user/nvim/init.vim
    map <Leader>fp :let @+ = expand("%:p") \| echo 'cb> ' . @+<CR>
    " *d*irectory *p*ath, ex. /home/user/nvim
    map <Leader>dp :let @+ = expand("%:p:h") \| echo 'cb> ' . @+<CR>
    " *d*irectory *n*ame, ex. nvim
    map <Leader>dn :let @+ = expand("%:p:h:t") \| echo 'cb> ' . @+<CR>
" }}}

-1

मैं X के क्लिपबोर्ड तक पहुंचने के लिए xclip का उपयोग करता हूं, इसलिए मैं उपयोग करता हूं:

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>

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