ชื่อไฟล์ / พา ธ ของบัฟเฟอร์ปัจจุบันในกลุ่ม


188

สมมติว่าบัฟเฟอร์ปัจจุบันคือเปิดไฟล์สำหรับการแก้ไขจึงไม่แสดง:eE32: No file name

ฉันต้องการดึงหนึ่งหรือทั้งหมด:

  • ชื่อไฟล์ตรงตามที่แสดงในบรรทัดสถานะเช่น ~\myfile.txt
  • เส้นทางแบบเต็มไปยังไฟล์เช่น c:\foo\bar\myfile.txt
  • เพียงแค่ชื่อไฟล์เช่น myfile.txt


คำตอบ:


209

TL; DR

: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รายละเอียดที่


23
Cool เพิ่งเพิ่มสิ่งนี้ลงใน vimrc ของฉัน: noremap <silent> <F4>: let @ + = ขยาย ("%: p") <CR>
ThePosey

9
บน Windows คุณควรใช้: let @ * = expand ("%") หากคุณต้องการให้มันอยู่ในคลิปบอร์ดของWindows
KFL

15
หากคุณใช้unnamedplusเป็นคลิปบอร์ดของคุณlet @+ = expand("%")
Kevin Cox

4
ใช้"%:h"เพื่อรับเส้นทางแบบเต็มโดยไม่มีชื่อไฟล์
Polymorphix

ที่เกี่ยวข้องโดยเฉพาะอย่างยิ่งถ้าคุณต้องการไดเรกทอรีที่ไม่มีชื่อไฟล์ - stackoverflow.com/a/2233924/1882064
arcseldon

94

เกือบจะเป็นสิ่งที่คุณต้องการและมันอาจทำได้: Ctrl+R %ดึงชื่อไฟล์ปัจจุบันไปยังตำแหน่งที่คุณอยู่ (พร้อมรับคำสั่งแก้ไขบัฟเฟอร์ ... ) ดูเคล็ดลับ Vim นี้สำหรับข้อมูลเพิ่มเติม


1
เมื่อคุณออกจากโหมดแก้ไขคุณสามารถเพิ่มชื่อไฟล์: ctrl- "ctrl-% p
stefanB

13
Ctrl+R %ทำงานในinsertโหมด - แต่ในeditโหมดCtrl+Rหมายถึงการทำซ้ำ
Kevin Panko

3
สิ่งที่ stefanB หมายถึงคือ "% p สำหรับโหมดปกติ / คำสั่งนั่นคือ <Cr>% ในโหมดแทรก / cmdline-mode
graywh

เพียงเพื่อดำเนินการต่อหรือระบุสถานะที่แตกต่างกัน: คำตอบสำหรับทั้ง graywh และ dwc คือ "paste from register%" สิ่งนี้ทำสำหรับโหมดแทรกส่วนอีกอันสำหรับโหมดปกติ ใน macvim จะไม่สามารถเขียนทับ% register ได้
Eric Hu

มีคำสั่งง่ายๆเหมือนกันที่จะได้รับชุดเครื่องนอนหรือไม่? ) ขอบคุณสำหรับการแก้ปัญหา
itsnikolay

73

หากคุณต้องการใส่ชื่อไฟล์บัฟเฟอร์ปัจจุบันลงในคลิปบอร์ดระดับระบบลองเปลี่ยนการลงทะเบียนเป็น @ +:

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

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

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

แก้ไข 20140421: ฉันมักใช้สิ่งเหล่านี้ดังนั้นฉันจึงสร้างทางลัดบางอย่าง เห็นได้ชัดว่า Linux Vims ทำงานแตกต่างจาก Mac Vims เล็กน้อยดังนั้นจึงมีกรณีพิเศษสำหรับมันเช่นกัน หากคุณใส่สิ่งต่อไปนี้ในของคุณ~/.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
บน windows และ mac "*และ"+เทียบเท่าดังนั้นคุณสามารถแจกจ่ายด้วยการตรวจสอบแพลตฟอร์มและใช้เพียง@+
Gabe Moothart

1
สิ่งที่ดูเหมือนจะไม่พอในฟังก์ชั่น vimscript: "echo bufname ('%: p')" ว่างเปล่า แต่คุณสามารถแก้ไขได้ด้วย "fnamemodify อีกต่อไป (bufname ('%'), ': p' ) "
David Ljung Madison Stellar

6

หากคุณ:regคุณจะเห็นชื่อของไฟล์ปัจจุบันในการ%ลงทะเบียน "%pตัวอย่างเช่นคุณสามารถวางด้วย

ถ้าอย่างฉันคุณมักจะเปลี่ยนไปใช้บัฟเฟอร์ 'สำรอง' มันมีประโยชน์มากที่พา ธ และชื่อไฟล์แบบเต็มจะถูกใส่ใน#รีจิสเตอร์ "#pตัวอย่างเช่นคุณสามารถวางด้วย

หมายเหตุ (ในกรณีนี้เป็นลักษณะการทำงานเฉพาะสำหรับการตั้งค่าของฉัน): ฉันใช้ VIM 7.4.52 บน Ubuntu 14.04.4 LTS


4

การรวมข้อมูลจากคำตอบอื่น ๆ สองสามข้อ: หากคุณต้องการดึงพา ธ แบบเต็มไปยังไฟล์ปัจจุบันและวางลงในบัฟเฟอร์คำสั่งในหน้าต่างอื่นก่อน:let @" = expand("%:p")อื่นให้ย้ายไปที่หน้าต่างและประเภทCtrl+R "อื่น

มีประโยชน์สำหรับการคัดลอกไฟล์ในขณะที่อยู่ในไดเรกทอรีเดียวกันและเปิดไฟล์เก่าไว้ ตัวอย่างเช่น:

เริ่มต้น : การแก้ไขsrc / com / benatkin / paint / shapes / Circle.java

  1. ประเภท:let @" = expand("%:p") (เส้นทางถูกดึงไปยังบัฟเฟอร์คลิปบอร์ดหลัก)

  2. เปิดหน้าต่างใหม่ด้วย :sp

  3. ชนิด :e Ctrl+R"

  4. ใช้ปุ่มลูกศรเพื่อกลับไปที่ Circle และเปลี่ยนเป็น Square แล้วกด <CR>

สิ้นสุด : การแก้ไขsrc / com / benatkin / paint / shapes / 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

ฉันใช้ xclip เพื่อเข้าถึงคลิปบอร์ดของ X ดังนั้นฉันจึงใช้:

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

"+ หรือ" * ทำสิ่งเดียวกันในกำเนิดโดยไม่ต้องใช้คำสั่งภายนอก
Dorian B.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.