Làm cách nào để chèn tên tệp hiện tại vào nội dung trong Vim?


38

Sau một số tìm kiếm, tôi đã biết :echo @%hiển thị tên tệp hiện tại ở dòng dưới cùng của màn hình vim.

Tôi muốn chuyển tên tệp (có và không có đường dẫn đầy đủ) vào nội dung của tệp mà không cần rời khỏi vim.

Có cách nào để làm điều này?

Câu trả lời:


27

Tôi chắc chắn có nhiều cách khác để làm điều này ... nhưng lệnh chính bạn muốn là :r[ead]chèn đầu ra của lệnh vào bộ đệm.

Vì vậy, để chèn chỉ tên tệp:

:r! echo %

Và, để bao gồm đường dẫn đầy đủ:

:r! echo %:p

Để biết thêm thông tin:

:help read
:help filename-modifiers 

37

Tên tệp hiện tại nằm trong thanh "%ghi, vì vậy bạn có thể chèn nó (trong khi ở chế độ chèn) với <c-r>%; đường dẫn đầy đủ có thể được chèn vào <c-r>=expand("%:p"). Bạn có thể tạo một macro của nó nếu bạn sử dụng nó thường xuyên. Để biết thêm, các thủ thuật tương tự, xem :h expand:h "=.


Có lẽ tôi đã đọc sai điều đó, nhưng không <c-r>được ánh xạ như lệnh làm lại?
JC Yamokoski

10
Trong chế độ chèn, <c-r>chỉ định rằng ký tự tiếp theo là một thanh ghi.
Kevin

Phải, cảm ơn. Hoàn toàn quên chuyển sang chế độ chèn ...
JC Yamokoski

Bạn cũng có thể làm "%ptrong chế độ bình thường hoặc trực quan.
ness101

15

Như có thể thấy :h registers, thanh "%ghi chứa tên tệp hiện tại. Các :pu[t]lệnh chèn nội dung của một thanh ghi vào văn bản.

Vì vậy, để chèn tên tệp thực tế, bạn có thể nhập một trong hai tên này, trong chế độ lệnh:

:put %

hoặc là

"%p

Để chèn tên tệp với đường dẫn đầy đủ, nhập

:put=expand('%:p')

trong chế độ lệnh.


Thêm thông tin:

:h pu[t]

Bằng cách gõ "rpbạn có thể dán nội dung đăng ký "r.


3
:put "%:p"dường như không làm việc cho tôi. Nó dường như chỉ hoạt động với việc mở rộng () , như trong : :put =expand('%:p'), khiến cho nó không quá cồng kềnh so với <c-r>=expand('%:p')không may.
akavel

@akavel Bạn nói đúng, tôi sẽ cập nhật câu trả lời. Cảm ơn bạn! ;) Và, thực sự, cả hai đều dài dòng như nhau.
braunmagrin

5

Một cách đơn giản là chạy:

!!echo %
  • !! đang thay thế dòng hiện tại bằng kết quả của lệnh theo sau nó.

  • % được thay thế bằng tên của tệp đã chỉnh sửa trong lệnh để điều này sẽ chèn tên đó vào tệp được chỉnh sửa một cách hiệu quả.

Tên tệp là tên bạn đã truyền cho lệnh vi (m) và có thể chứa đường dẫn tương đối hoặc tuyệt đối. Nếu bạn muốn tách nó và chỉ giữ lại tên tệp, hãy chạy

!!basename %

1

Nếu bạn cần thực hiện việc này thường xuyên, có thể hữu ích khi liên kết một chuỗi khóa với những gì bạn muốn, theo http://vim.wikia.com/wiki/Insert_cản_filename

chèn tên tệp hiện tại mà không có phần mở rộng ở vị trí con trỏ, khi bạn ở chế độ chèn.

:inoremap \fn <C-R>=expand("%:t:r")<CR>

Để giữ phần mở rộng sử dụng:

:inoremap \fn <C-R>=expand("%:t")<CR>

Để chèn đường dẫn tuyệt đối của thư mục, tập tin đang được sử dụng:

:inoremap \fn <C-R>=expand("%:p:h")<CR>

Để chèn đường dẫn tương đối của thư mục, tệp đang được sử dụng:

:inoremap \fn <C-R>=expand("%:h")<CR>

Tất cả các công việc trên trực tiếp vimcho phiên hoặc bạn có thể đặt nó vào .vimrc(nơi dấu hai chấm trên dòng là tùy chọn).


0

Tôi đã googling một cách đơn giản nhất để chèn tên tệp hiện tại (không có đường dẫn hoặc phần mở rộng) vào vị trí hiện tại (không có dòng mới, không thay thế dòng hiện tại). Vì vậy, kết hợp các câu trả lời trước và liên kết này, đây là những gì tôi đang tìm kiếm.

Trong chế độ chèn :

<C-R>=expand("%:t:r")

Sau đó, lần sau (với lệnh đã có trong lịch sử):

<C-R>=<UP>
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.