Câu trả lời:
Phương pháp trong câu trả lời trước đó của tôi không chuyển đổi tốt sang nội dung động. Đây là nơi bổ sung các đoạn mã như UltiSnips và SnipMate. Tôi sẽ cung cấp bản demo của UltiSnips tại đây. Cài đặt nó bằng phương pháp yêu thích của bạn từ Làm cách nào để cài đặt plugin trong vim / vi?
Bây giờ, tạo một UltiSnips
thư mục trong của bạn .vim
hoặc _vimfiles
thư mục. Trong đó, đặt một c.snippet
tệp chứa:
snippet /// "My header" A
/*!
* @author Robbie Yi JIANG, `date +'%d-%b-%Y %T'`
*
*
*/
endsnippet
Bây giờ, nếu bạn mở một tệp C và loại ///
, nó sẽ tự động được thay thế bằng tiêu đề, bao gồm cả ngày và giờ hiện tại. Đó là nó!
Thông thường, UltiSnips chèn một đoạn mã khi bạn nhấn Tab. Ở đây, chúng tôi đã chỉ định rằng đoạn mã sẽ được tự động nhập - đó là những gì A
ở cuối dòng đầu tiên cho biết. Kiểm tra :help UltiSnips-syntax
để biết thêm thông tin về viết đoạn trích.
Tuy nhiên, hầu hết mọi người bắt đầu với một bộ sưu tập các đoạn, chẳng hạn như vim-snippets
. Có quá nhiều để mô tả ở đây, nhưng bạn có thể một số trong số chúng rất hữu ích.
Một cách sẽ là tạo một tệp chứa đoạn mã này và đọc nó khi bạn nhập ///
.
Ví dụ: tạo ~/.vim/snippets/my_header.snip
chứa tiêu đề này. Sau đó xác định ánh xạ này:
inoremap /// <esc>:r ~/.vim/snippets/my_header.snip<cr>i
Hoặc là:
inoremap /// <esc>:call append(line('.')-1, readfile(expand('~/.vim/snippets/my_header.snip')))<cr>i
Trong ánh xạ đầu tiên, con trỏ của bạn sẽ được đặt trên dòng đầu tiên của văn bản được chèn; và trong giây, con trỏ sẽ được đặt bên dưới văn bản được chèn.
Có lẽ ánh xạ đơn giản nhất, về mặt nhảy xung quanh các chế độ, là:
inoremap /// <c-r><c-o>=readfile(expand('~/.vim/snippets/my_header.snip'))<cr>
Để sử dụng chung hơn, bạn có thể muốn xem xét các plugin đoạn trích. UltiSnips và SnipMate là hai cái phổ biến. Tôi cũng không sử dụng, vì vậy tôi sẽ không đề xuất.
Viết hàm trả về chuỗi và gọi nó.
function! InsertHeader()
let l:header = "/*!\n"
\. "* @author Robbie Yi JIANG, " . strftime('%d-%b-%Y %H:%M:%S') . "\n"
\. "*\n"
\. "* \n"
\. "*/\n"
return l:header
endfunction
inoremap /// <C-R>=InsertHeader()<Enter><C-O>2k<C-O>$
Các chi tiết strftime
phụ thuộc vào nền tảng của bạn, nếu bạn không sử dụng Windows và nó không hoạt động thì bạn sẽ cần phải man strftime
tìm ra các đối số.
Điều này hoạt động trong chế độ chèn nhưng nó thực hiện những điều kỳ lạ để xử lý dấu gạch chéo. Nếu bạn đang thực hiện //
nhận xét theo kiểu C ++ , dấu gạch chéo thứ hai sẽ không xuất hiện cho đến khi bạn nhập khoảng trắng hoặc thứ gì đó sau nó.
Việc <C-R>=
chèn một biểu thức tại vị trí con trỏ. Các InsertHeader()<Enter>
bit là sự biểu hiện đó được đánh giá. Tôi xây dựng dòng chuỗi theo dòng trong hàm, .
là nối chuỗi và \
là ký tự tiếp tục dòng (trong đó phần tiếp theo nói "kết hợp điều này với dòng trước", trái ngược với cách C và gia đình của nó làm điều đó). Cuối cùng, hai <C-O>
thao tác, một để di chuyển lên hai dòng và một để di chuyển đến cuối dòng trong đó có lẽ một bình luận tập tin sẽ được nhập vào; lưu ý khoảng trắng ở cuối chuỗi trong dòng thứ tư của l:header
.