Có ba bước chính để thực hiện những gì bạn yêu cầu:
- lấy tên tập tin thay thế
- mở tệp đó trong cửa sổ hiện tại hoặc trong cửa sổ khác như mong muốn
- Khôi phục vị trí con trỏ trong tệp đó
Để tìm tên tệp thay thế, bạn muốn ngắt tên tệp hiện tại thành "gốc" và "phần mở rộng". Một cách đơn giản để làm điều này là:
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
Nếu bạn biết bạn chỉ chuyển đổi giữa .h
và .cpp
các tệp, bạn có thể dễ dàng thay đổi tiện ích mở rộng từ cái này sang cái khác:
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
Hoặc, tạo một ánh xạ từ điển các tiện ích mở rộng đã biết đến các tiện ích mở rộng thay thế có khả năng hợp lệ. Hoặc sử dụng globpath()
để có được tất cả các lựa chọn thay thế có thể cho tệp hiện tại:
let alternates = globpath(expand("%:h"), root . ".*")
và chọn cái đầu tiên, hoặc bất cứ thứ gì. Tôi thích globpath
cách tiếp cận, với một số thông minh thêm tôi sẽ mô tả sau. Khi bạn đã chọn tiện ích mở rộng mục tiêu, hãy tạo đường dẫn đích đầy đủ:
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
Bây giờ bạn có thể mở tệp thay thế trong cửa sổ hiện tại:
execute "edit " . target
Hoặc sử dụng winnr()
để lấy số "cửa sổ khác" ( winnr("#")
là cửa sổ <C-W>p
sẽ nhảy tới hoặc bạn có thể mã hóa nó nếu bạn biết nó sẽ luôn giống với thiết lập của bạn) và làm một cái gì đó như:
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
Điều này cung cấp cho bạn một giải pháp thực sự cơ bản để mở các tệp thay thế. Có một vài thiếu sót với cách tiếp cận ở trên, vì tôi đã viết nó đơn giản và nó hơi khó hiểu. Tôi đã viết một plugin thay thế tập tin chuyển đổi "theo cách tôi muốn" (đi qua tất cả các globpath()
kết quả có sẵn ). Nó giải quyết một số vấn đề với sự đơn giản ở trên, bạn có thể kiểm tra việc thực hiện nếu bạn muốn khám phá thêm.
Cuối cùng, điểm "khôi phục vị trí con trỏ". Tôi đã lưu nó lần cuối vì nó trực giao với thứ chuyển đổi thay thế (ví dụ như plugin của tôi không xử lý nó), nhưng bạn có thể đặt nó vào chức năng của mình nếu bạn sẽ tự lăn. :help line()
có một autocommand rất hữu ích cho việc khôi phục vị trí con trỏ về vị trí của nó khi tệp được mở lần cuối:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
Tôi chỉ đặt điều đó, hoặc một cái gì đó rất giống nhau, .vimrc
vì tôi thích hành vi mọi lúc. Bạn có thể dễ dàng đặt mã ở nơi khác.
:h line()
(giải pháp chung): "Trình tự động tự động này nhảy đến vị trí đã biết cuối cùng trong một tệp ngay sau khi mở nó, nếu dấu '" được đặt :: au BufReadPost * if line ("' ' \ "")> 1 && dòng ("'\" ") <= dòng (" $ ") | exe "bình thường! g` \" "| endif