سؤال

على افتراض أن المخزن المؤقت الحالي هو ملف مفتوح للتحرير، لذلك :e لا يعرض E32: No file name.

أود انسجوم واحد أو كل من:

  • اسم الملف تماما كما تظهر على سطر الحالة، على سبيل المثال ~\myfile.txt
  • مسار كامل للملف، على سبيل المثال c:\foo\bar\myfile.txt
  • فقط اسم الملف، على سبيل المثال myfile.txt
هل كانت مفيدة؟

المحلول

TL؛ دكتور

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

هذا سوف نسخ اسم الملف إلى تسجيل غير مطلوب, ، ثم يمكنك استخدام القديم الجيد p لصقها. وبالطبع يمكنك تعيين هذا إلى مفتاح للاستخدام الأسرع.

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

يمكنك أيضا استخدام هذا للمسار الكامل

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

تفسير

يستخدم VIM سجل لم يذكر اسمه. لتخزين النص الذي تم حذفه أو نسخه (يخطئ)، وبالمثل عند لصقه يقرأ النص من هذا السجل.

استخدام let يمكننا تخزين النص يدويا في السجل باستخدام :let @" = "text" ولكن يمكننا أيضا تخزين نتيجة التعبير.

في المثال أعلاه نستخدم الوظيفة expand التي توسع أحرف البدل والكلمات الرئيسية. في مثالنا نستخدم expand('%') لتوسيع اسم الملف الحالي. يمكننا تعديلها كما expand('%:p') لاسم الملف الكامل.

يرى :help let :help expand :help registers للتفاصيل

نصائح أخرى

تقريبا ما تطلبه، وقد يفعل: Ctrl+R % يسحب اسم الملف الحالي إلى أين أنت (موجه الأوامر، تحرير المخزن المؤقت، ...). يرى هذا الطرف vim للمزيد من.

إذا كنت ترغب في وضع اسم الملف المخزن المؤقت الحالي في الحافظة على مستوى النظام، فحاول تغيير التسجيل إلى @ +:

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

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

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

تحرير 20140421: أنا عادة استخدام هذه، لذلك قمت بإنشاء بعض الاختصارات. يبدو أن Linux Vims يعمل بشكل مختلف قليلا من Vims Mac, ، لذلك هناك حالة خاصة لذلك أيضا. إذا وضعت ما يلي في ~/.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 في الدليل.

اذا فعلت :reg سترى اسم الملف الحالي في % تسجيل. يمكنك لصقها مع "%p, ، علي سبيل المثال.

إذا، مثلي، يمكنك التبديل غالبا إلى المخزن المؤقت "البديل"، فمن المفيد جدا أن يتم وضع اسم المسار الكامل والملف في # تسجيل. يمكنك لصقها مع "#p, ، علي سبيل المثال.

ملاحظة (فقط في حالة حدوث ذلك هو سلوك خاص بإعدادي): أنا أستخدم VIM 7.4.52 على Ubuntu 14.04.4 LTS.

الجمع بين المعلومات من إجابات أخرى: إذا كنت ترغب في انسحاب المسار الكامل الحالي إلى ملف ووضعه في المخزن المؤقت للأمر في نافذة أخرى، أولا :let @" = expand("%:p"), ، ثم انتقل إلى نافذة أخرى ونوع Ctrl+R ".

مفيد لنسخ ملف أثناء الإقامة في نفس الدليل والحفاظ على Old Open Open. علي سبيل المثال:

يبدأ: تحرير SRC / COM / BENATKIN / الطلاء / الأشكال / Circle.java

  1. اكتب :let @" = expand("%:p") (يحرك المسار إلى المخزن المؤقت للحافظة الرئيسية.)

  2. افتح نافذة جديدة :sp

  3. اكتب :e Ctrl+R"

  4. استخدم مفاتيح الأسهم للعودة إلى الدائرة وتغييرها إلى مربع، واضغطu003CCR>

نهاية: تحرير SRC / COM / BENATKIN / الطلاء / الأشكال / Square.java

هنا هو الحل الخاص بي:

" 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>
" }}}

يمكنني استخدام XCLIP للوصول إلى الحافظة X، لذلك يمكنني استخدام:

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top