Vim - làm thế nào để chạy một lệnh ngay lập tức khi khởi động vim?


103

Tôi có một plugin (FindFile.vim) cần chạy :FindFileCache .bất cứ khi nào tôi khởi động vim để thu thập bộ nhớ cache tệp để mở nhanh .. Tuy nhiên, tôi phải chạy cái này mỗi khi khởi động vim.

Làm cách nào tôi có thể viết một lệnh chạy một lần, mỗi khi vim đó khởi động?

Câu trả lời:


145

Nơi tốt nhất để giữ nội dung cấu hình của bạn là trong tệp .vimrc của bạn . Tuy nhiên, nó có nguồn gốc quá sớm, hãy kiểm tra :h startup:

At startup, Vim checks environment variables and files and sets values
accordingly.  Vim proceeds in this order:

1. Set the 'shell' and 'term' option                *SHELL* *COMSPEC* *TERM*
2. Process the arguments
3. Execute Ex commands, from environment variables and/or files *vimrc* *exrc*
4. Load the plugin scripts.                                 *load-plugins*
5. Set 'shellpipe' and 'shellredir'
6. Set 'updatecount' to zero, if "-n" command argument used
7. Set binary options
8. Perform GUI initializations
9. Read the viminfo file
10. Read the quickfix file
11. Open all windows
12. Execute startup commands

Như bạn có thể thấy, .vimrc của bạn sẽ được tải trước các plugin. Nếu bạn đưa :FindFileCache .nó vào sẽ xảy ra lỗi, vì lệnh đó chưa tồn tại. (Nó sẽ tồn tại khi plugin được tải ở bước 4)

Để giải quyết vấn đề này, thay vì thực hiện lệnh trực tiếp, hãy tạo một lệnh tự động. Các lệnh tự động thực hiện một số lệnh khi một sự kiện xảy ra. Trong trường hợp này, sự kiện VimEnter có vẻ thích hợp (từ :h VimEnter):

                                                    *VimEnter*
VimEnter                    After doing all the startup stuff, including
                            loading .vimrc files, executing the "-c cmd"
                            arguments, creating all windows and loading
                            the buffers in them.

Sau đó, chỉ cần đặt dòng này trong .vimrc của bạn :

autocmd VimEnter * FindFileCache .

2
+1, đây phải là câu trả lời được chấp nhận, nó gọn gàng hơn nhiều so với việc tạo một tệp riêng cho một lệnh.

Muốn thêm, tôi đã có khoảng thời gian này với tôi với E172 vì tôi đã có một khoảng trống sau đó.
Caroline

đã thử sử dụng cách tiếp cận này để gọi: AnsiEsc tuy nhiên nó không thực sự mang lại hiệu quả mong muốn - bất kỳ cơ hội nào bạn biết cách phát hiện xem một lệnh như: AnsiEsc đã được chạy trước đó chưa?
serup

89

Ngoài ra còn có cờ -c của vim. Tôi thực hiện việc này trong cấu hình tmuxp của mình để vim bắt đầu với sự phân chia dọc:

vim -c "vnew"

Ít nhất với neovim, bạn cũng có thể mở một tệp cùng lúc:

nvim -c "colorscheme mustang" some_file

6
Cảm ơn, đây là những gì tôi đang tìm kiếm. Đôi khi, tôi chỉ cần chạy một lệnh khởi động tạm thời như chia như bạn đã thể hiện, và không cần phải lưu trữ này trong tập tin vimrc của tôi
verboze

Điều này không thể mở một tập tin:vim -c ':colo default' test.txt
van abel

1
Hoàn hảo cho tôi cũng vậy - Tôi đang sử dụng xolox/vim-notesvà tôi muốn một chức năng cá mở Vim với một ghi chú mới sẵn sàng hoạt động.
wsams

13

Tạo một tệp có tên ~/.vim/after/plugin/whatever_name_you_like.vimvà điền vào

FindFileCache .

Thứ tự mà các tập lệnh được đọc và thực thi trong các thư mục vim được mô tả trong :help 'runtimepath'


2

Để nhận được thậm chí muộn hơn các câu trả lời khác nhưng vẫn ngay sau khi khởi động, hãy sử dụng bộ hẹn giờ ở dạng .vimrc. Ví dụ: mã này trong .vimrc đợi nửa giây sau khi khởi động trước khi thiết lập một biến.

function DelayedSetVariables(timer)
    let g:ycm_filetype_blacklist['ignored'] = 1
endfunction
let timer=timer_start(500,'DelayedSetVariables')

(Biến trong ví dụ là danh sách đen từ plugin YouCompleteMe. Tôi giả sử, plugin khởi động một số quy trình khác không đồng bộ, sau đó sẽ tạo ra các biến, nhưng không hoàn toàn sẵn sàng vào thời điểm vim đã bắt đầu. Biến không tồn tại khi tôi cố gắng đặt nó trong .vimrc, một tệp sau hoặc sự kiện VimEnter. Điều này dành riêng cho hệ thống Windows của tôi bằng cách nào đó, tài liệu YCM cho biết .vimrc sẽ hoạt động cho các tùy chọn thiết lập.)


1

Đưa FindFileCachevào của bạn .vimrc.

Các lệnh tự động tải khác nhau và sẽ không hoạt động đối với trường hợp của bạn.


cảm ơn vì đã chỉ ra điều đó, thực sự là pluginkhông autoload.
Benoit
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.