Làm cách nào tôi có thể chạy autocmd khi khởi động Vim mà không có tệp, tệp không tồn tại hoặc tệp trống (nhưng không phải khi bắt đầu với tệp hiện có)?


11

Tôi muốn chạy autocmd trong các trường hợp sau khi tôi khởi động Vim:

  • Không có tên tệp được chỉ định.
  • Khi tập tin mới.
  • Khi tập tin tồn tại nhưng hoàn toàn trống.

Trong tất cả ba trường hợp trên, tôi muốn chạy autocmd; Cụ thể, tôi muốn bắt đầu chèn chế độ tự động cho chỉ các kịch bản ở trên (và không phải khi tôi mở một tập tin đã tồn tại và không phải là trống).


CẬP NHẬT:

Tôi đã thử đặt các mục sau vào _vimrcnhưng không có may mắn (cộng với tôi không chắc liệu có một hàm nào trong vim đếm số lượng ký tự trong một tệp không (để xem nó có bằng không) trước khi mở không:

if @% == "" || filereadable(@%)
  autocmd BufRead,BufNewFile * startinsert
endif

Không, đây không phải là một bản sao. Tôi muốn vi bắt đầu ở chế độ chèn CHỈ DÀNH CHO BA SCENariOS tôi đã đề cập.
John Sonderson 13/03/2015

3
OKAY, TÔI THẤY NHƯNG NÓ THẬT SỰ NHÌN THẤY NHƯ MỘT KHAI THÁC. ;-) Tôi đã chỉnh sửa câu hỏi của bạn một chút để làm cho sự khác biệt rõ ràng hơn.
Martin Tournoij


2
@JohnSonderson liên kết đầu tiên cho bạn biết cách tìm nếu không có tên tệp nào, liên kết thứ hai có thể được điều chỉnh bằng cách sử dụng normalthay vì exec.
muru

1
Tệp vimrc chỉ được đọc một lần : khi Vim khởi động. Nội dung của autocmd được chạy mỗi khi nó được kích hoạt. Vì vậy, ifcâu lệnh không nên ở xung quanh autocmd, nếu nên ở bên trong autocmd, vì vậy nó sẽ được chạy mỗi khi autocmd được kích hoạt.
Martin Tournoij 15/03/2015

Câu trả lời:


10

Điều này làm việc cho cả 3 trường hợp của bạn cho tôi:

function InsertIfEmpty()
    if @% == ""
        " No filename for current buffer
        startinsert
    elseif filereadable(@%) == 0
        " File doesn't exist yet
        startinsert
    elseif line('$') == 1 && col('$') == 1
        " File is empty
        startinsert
    endif
endfunction

au VimEnter * call InsertIfEmpty()

Chúng có thể được cô đọng thành chỉ kiểm tra lần cuối cho một tệp trống, vì không có tên tệp hoặc tệp không tồn tại thường bắt đầu dưới dạng bộ đệm trống. Tuy nhiên, có thể một số plugin khác điền trước một số nội dung vào một trong hai trường hợp đầu tiên (như một số plugin mẫu), vì vậy tốt nhất là kiểm tra cả ba.

Bài kiểm tra đầu tiên bạn đã có.

Thử nghiệm thứ hai cần kiểm tra filereadablegiá trị bằng 0 (không tồn tại) để quyết định xem nó có mới không (ngược lại với những gì bạn đã có).

Thử nghiệm cuối cùng kiểm tra số lượng dòng cuối cùng trong tệp là 1 (cũng là dòng đầu tiên, có nghĩa là chỉ có một dòng) và số cột của cuối dòng (cột sau ký tự cuối cùng trong dòng) là 1, có nghĩa là có 0 ký tự. Nếu chỉ có 1 dòng có 0 ký tự trong đó thì tệp phải trống.

Một lưu ý cuối cùng: Cách bạn có câu phát biểu của mình trong câu hỏi có thể dẫn đến một số kết quả đáng ngạc nhiên. Cụ thể, bạn đang thiết lập BufReadBufNewFilechỉ khi các điều kiện được đáp ứng khi khởi động, nhưng sau đó những autocommands đó tồn tại trong phần còn lại của phiên của bạn. Vì vậy, nếu bạn bắt đầu với một tệp trống, thiết lập các lệnh này, mọi tệp tiếp theo được mở (mới hay không, trống hay không) sẽ bắt đầu ở chế độ chèn.

Chế độ tự động VimEnterđược chạy vào cuối khởi động của Vim và chỉ một lần cho toàn bộ phiên. Bằng cách này, các bài kiểm tra của bạn chỉ chạy khi bạn khởi động Vim chứ không phải bất kỳ lúc nào khác.

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.