สมมติว่าบัฟเฟอร์ปัจจุบันคือเปิดไฟล์สำหรับการแก้ไขจึงไม่แสดง:e
E32: No file name
ฉันต้องการดึงหนึ่งหรือทั้งหมด:
- ชื่อไฟล์ตรงตามที่แสดงในบรรทัดสถานะเช่น
~\myfile.txt
- เส้นทางแบบเต็มไปยังไฟล์เช่น
c:\foo\bar\myfile.txt
- เพียงแค่ชื่อไฟล์เช่น
myfile.txt
สมมติว่าบัฟเฟอร์ปัจจุบันคือเปิดไฟล์สำหรับการแก้ไขจึงไม่แสดง:e
E32: No file name
ฉันต้องการดึงหนึ่งหรือทั้งหมด:
~\myfile.txt
c:\foo\bar\myfile.txt
myfile.txt
คำตอบ:
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
รายละเอียดที่
unnamedplus
เป็นคลิปบอร์ดของคุณlet @+ = expand("%")
"%:h"
เพื่อรับเส้นทางแบบเต็มโดยไม่มีชื่อไฟล์
เกือบจะเป็นสิ่งที่คุณต้องการและมันอาจทำได้: Ctrl+R %
ดึงชื่อไฟล์ปัจจุบันไปยังตำแหน่งที่คุณอยู่ (พร้อมรับคำสั่งแก้ไขบัฟเฟอร์ ... ) ดูเคล็ดลับ Vim นี้สำหรับข้อมูลเพิ่มเติม
Ctrl+R %
ทำงานในinsert
โหมด - แต่ในedit
โหมดCtrl+R
หมายถึงการทำซ้ำ
หากคุณต้องการใส่ชื่อไฟล์บัฟเฟอร์ปัจจุบันลงในคลิปบอร์ดระดับระบบลองเปลี่ยนการลงทะเบียนเป็น @ +:
" 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
สำหรับไดเรกทอรี
"*
และ"+
เทียบเท่าดังนั้นคุณสามารถแจกจ่ายด้วยการตรวจสอบแพลตฟอร์มและใช้เพียง@+
หากคุณ:reg
คุณจะเห็นชื่อของไฟล์ปัจจุบันในการ%
ลงทะเบียน "%p
ตัวอย่างเช่นคุณสามารถวางด้วย
ถ้าอย่างฉันคุณมักจะเปลี่ยนไปใช้บัฟเฟอร์ 'สำรอง' มันมีประโยชน์มากที่พา ธ และชื่อไฟล์แบบเต็มจะถูกใส่ใน#
รีจิสเตอร์ "#p
ตัวอย่างเช่นคุณสามารถวางด้วย
หมายเหตุ (ในกรณีนี้เป็นลักษณะการทำงานเฉพาะสำหรับการตั้งค่าของฉัน): ฉันใช้ VIM 7.4.52 บน Ubuntu 14.04.4 LTS
การรวมข้อมูลจากคำตอบอื่น ๆ สองสามข้อ: หากคุณต้องการดึงพา ธ แบบเต็มไปยังไฟล์ปัจจุบันและวางลงในบัฟเฟอร์คำสั่งในหน้าต่างอื่นก่อน:let @" = expand("%:p")
อื่นให้ย้ายไปที่หน้าต่างและประเภทCtrl+R "
อื่น
มีประโยชน์สำหรับการคัดลอกไฟล์ในขณะที่อยู่ในไดเรกทอรีเดียวกันและเปิดไฟล์เก่าไว้ ตัวอย่างเช่น:
เริ่มต้น : การแก้ไขsrc / com / benatkin / paint / shapes / Circle.java
ประเภท
:let @" = expand("%:p")
(เส้นทางถูกดึงไปยังบัฟเฟอร์คลิปบอร์ดหลัก)เปิดหน้าต่างใหม่ด้วย
:sp
ชนิด
:e Ctrl+R"
ใช้ปุ่มลูกศรเพื่อกลับไปที่ Circle และเปลี่ยนเป็น Square แล้วกด <CR>
สิ้นสุด : การแก้ไขsrc / com / benatkin / paint / shapes / 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>