Tên tệp Yank / đường dẫn của bộ đệm hiện tại trong Vim


186

Giả sử bộ đệm hiện tại là một tệp đang mở để chỉnh sửa, do :eđó không hiển thị E32: No file name.

Tôi muốn kéo một hoặc tất cả:

  • Tên tệp chính xác như hiển thị trên dòng trạng thái, ví dụ: ~\myfile.txt
  • Đường dẫn đầy đủ đến tệp, vd c:\foo\bar\myfile.txt
  • Chỉ tên tập tin, vd myfile.txt


Câu trả lời:


206

TL; DR

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

này sẽ sao chép tên tập tin đến đăng ký unamed , sau đó bạn có thể sử dụng tốt cũ pđể dán nó. và tất nhiên bạn có thể ánh xạ nó tới một phím để sử dụng nhanh hơn.

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

bạn cũng có thể sử dụng nó cho đường dẫn đầy đủ

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

Giải trình

Vim sử dụng thanh ghi chưa được đặt tên để lưu trữ văn bản đã bị xóa hoặc sao chép (kéo theo), tương tự như vậy khi bạn dán nó đọc văn bản từ thanh ghi này.

Sử dụng letchúng ta có thể lưu trữ thủ công văn bản trong thanh ghi bằng cách sử dụng :let @" = "text"nhưng chúng ta cũng có thể lưu trữ kết quả của một biểu thức.

Trong ví dụ trên, chúng tôi sử dụng chức năng expandmở rộng ký tự đại diện và từ khóa. trong ví dụ của chúng tôi, chúng tôi sử dụng expand('%')để mở rộng tên tệp hiện tại. Chúng tôi có thể sửa đổi nó như expand('%:p')đối với tên tập tin đầy đủ.

Xem :help let :help expand :help registersđể biết chi tiết


23
Cool chỉ cần thêm cái này vào vimrc của tôi: noremap <im lặng> <F4>: let @ + =
extend

9
Trên Windows, thay vào đó, bạn nên sử dụng: let @ * = extend ("%"), nếu bạn muốn nó nằm trong bảng tạm của Windows .
KFL

15
Nếu bạn đang sử dụng unnamedpluslàm bảng tạm của mình, hãy sử dụnglet @+ = expand("%")
Kevin Cox

4
Sử dụng "%:h"để có được đường dẫn đầy đủ mà không cần tên tệp.
Polymorphix

Liên quan, đặc biệt nếu bạn cần thư mục không có tên tệp - stackoverflow.com/a/2233924/1882064
arcseldon

94

Hầu như những gì bạn đang yêu cầu và nó có thể làm: Ctrl+R %kéo tên tệp hiện tại vào vị trí của bạn (dấu nhắc lệnh, chỉnh sửa bộ đệm, ...). Xem Mẹo Vim này để biết thêm.


1
Khi bạn thoát khỏi chế độ chỉnh sửa, bạn có thể thêm tên tệp:
ctrl- "ctrl-

13
Ctrl+R %hoạt động trong khi ở insertchế độ - nhưng trong editchế độ, Ctrl+Rcó nghĩa là làm lại.
Kevin Panko

3
StefanB có nghĩa là gì "% p cho chế độ lệnh / chế độ bình thường. Điều đó giống với <Cr>% trong chế độ chèn / cmdline.
Graywh

Chỉ cần bật lại hoặc phát biểu khác nhau: câu trả lời cho cả Graywh và dwc là "dán từ thanh ghi%". Một cái làm cho chế độ chèn, cái kia cho chế độ bình thường. Trong macvim, có vẻ như thanh ghi% không thể được ghi đè.
Eric Hu

Có cùng một lệnh đơn giản để có được vải lanh? ) thx cho giải pháp
itnikolay

71

Nếu bạn muốn đặt tên tệp bộ đệm hiện tại vào bảng tạm ở cấp hệ thống, hãy thử thay đổi đăng ký thành @ +:

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

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

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

Chỉnh sửa 20140421: Tôi thường sử dụng những thứ này, vì vậy tôi đã tạo một số phím tắt. Linux Vims rõ ràng hoạt động hơi khác so với Mac Vims , vì vậy cũng có trường hợp đặc biệt. Nếu bạn đặt như sau trong ~/.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

Sau đó, ví dụ <leader>cfsẽ sao chép đường dẫn tương đối của bộ đệm hiện tại (nhà lãnh đạo mặc định là dấu gạch chéo ngược ( \)). Tôi thường sử dụng chúng để chạy các lệnh trên một tệp hoặc làm những việc khác trên dòng lệnh. Tôi không thực sự sử dụng tên tệp / tên thư mục cuối cùng thường xuyên.

Bạn có thể xem xét các ánh xạ trực quan hơn như <leader>cfrtương đối, <leader>cfađối <leader>cffvới chỉ tên tệp, <leader>cfdcho thư mục.


2
Trên windows và mac "*"+tương đương nhau, vì vậy bạn có thể phân phối với các kiểm tra nền tảng và chỉ cần sử dụng@+
Gabe Moothart

1
Thật kỳ lạ, điều này dường như không hoạt động trong chức năng vimscript: "echo bufname ('%: p')" trống, nhưng bạn có thể sửa lỗi này với "fnamemodify (bufname ('%'), ': p' dài hơn ) "
David Ljung Madison Stellar

6

Nếu bạn làm :regbạn sẽ thấy tên của tập tin hiện tại trong %sổ đăng ký. Bạn có thể dán nó với "%p, ví dụ.

Nếu, giống như tôi, bạn thường chuyển sang bộ đệm 'thay thế', sẽ rất tiện khi tên đường dẫn và tên tệp đầy đủ của nó được đặt trong thanh #ghi. Bạn có thể dán nó với "#p, ví dụ.

Lưu ý (chỉ trong trường hợp đây là hành vi cụ thể đối với thiết lập của tôi): Tôi đang sử dụng VIM 7.4.52 trên Ubuntu 14.04.4 LTS.


4

Kết hợp thông tin từ một vài câu trả lời khác: Nếu bạn muốn kéo đường dẫn đầy đủ hiện tại đến một tệp và đặt nó vào bộ đệm lệnh trong một cửa sổ khác, trước tiên hãy làm :let @" = expand("%:p"), sau đó di chuyển sang cửa sổ khác và gõ Ctrl+R ".

Hữu ích cho việc sao chép một tập tin trong khi vẫn ở trong cùng một thư mục và giữ cho tập tin cũ mở. Ví dụ:

Bắt đầu : Chỉnh sửa src / com / benatkin / paint / hình dạng / Circle.java

  1. Loại :let @" = expand("%:p") (Đường dẫn được kéo vào bộ đệm chính.)

  2. Mở một cửa sổ mới với :sp

  3. Kiểu :e Ctrl+R"

  4. Sử dụng các phím mũi tên để quay lại Circle và thay đổi nó thành Square và nhấn <CR>

Kết thúc : Chỉnh sửa src / com / benatkin / paint / hình / Square.java


1

Đây là giải pháp của tôi:

" 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

Tôi sử dụng xclip để truy cập clipboard của X, vì vậy tôi sử dụng:

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

"+ hoặc" * thực hiện điều tương tự tự nhiên trong vim mà không phải sử dụng lệnh bên ngoài.
Dorian B.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.