'path'
Tùy chọn của Vim cho phép bạn chỉ định các thư mục lệnh nào sẽ thích gf
và :find
sẽ tìm kiếm tệp.
Nếu bạn chỉ muốn chức năng này kích hoạt một tập hợp tệp cụ thể, thì bạn có thể sử dụng autocmd để tự động "chuyển hướng" :edit
lệnh của bạn đến tệp trong một trong các 'path'
thư mục.
set path+=~/
function! FindInPath(name)
let found = findfile(a:name)
if !empty(found)
exe 'silent keepalt file '. fnameescape(found)
edit
endif
endfunction
autocmd BufNewFile .vimrc,.zshrc nested call FindInPath(expand('<afile>'))
Điều này sử dụng BufNewFile
autocmd như một kích hoạt cho file not found, so try to find it somewhere else
. Khi tình huống đó được phát hiện, sử dụng findfile()
để cố gắng tìm tệp trong 'path'
thư mục. Nếu nó được tìm thấy, thay đổi tên của bộ đệm hiện tại thành tập tin đó và chỉnh sửa lại bộ đệm, nếu không thì tiếp tục sử dụng bộ đệm mới.
Vòng nested
loại được yêu cầu ở đây vì autocmds thường không làm tổ. Trong trường hợp này, bạn không muốn các autocmds điển hình kích hoạt khi :edit
lệnh mở tệp của bạn.
Lưu ý rằng điều này vẫn sẽ tạo ra một bộ đệm bổ sung so với việc chỉ chỉnh sửa tệp theo cách thủ công. Khi thời gian BufNewFile
được chạy, bộ đệm cho tên tệp được chỉ định ban đầu đã được tạo. Sử dụng :file
để thay đổi tên của bộ đệm sẽ tạo ra bộ đệm mới, không tải với tên gốc.
Nếu bạn luôn muốn tìm kiếm 'path'
, thì autocmd có thể được thay đổi để sử dụng *
mẫu tệp thay vì chỉ định một số tệp nhất định.
Đây là phiên bản cập nhật phù hợp với yêu cầu của bạn hơn. Nó sử dụng :find
để trực tiếp mở tệp thay vì đặt tên bộ đệm dựa trên kết quả của findfile()
.
function! FindInPath(name)
let path=&path
" Add any extra directories to the normal search path
set path+=~,~/.vim,/etc
" If :find finds a file, then wipeout the buffer that was created for the "new" file
setlocal bufhidden=wipe
exe 'silent! keepalt find '. fnameescape(a:name)
" Restore 'path' and 'bufhidden' to their normal values
let &path=path
set bufhidden<
endfunction
autocmd BufNewFile * nested call FindInPath(expand('<afile>'))
Điều này giải quyết vấn đề trong chức năng trước đó, nơi Vim sẽ phàn nàn khi cố gắng lưu :file
bộ đệm có tên.
keepalt file
có nhược điểm giống như gán chovim.current.buffer.name
- vim cảnh báo bạn rằng tệp đã tồn tại khi cố gắng lưu các thay đổi của bạn.