Làm cách nào tôi có thể tạo phần / * nhận xét với /// như trong XCode?


8

Trong XCode, có một tiện ích bổ sung được gọi là vvdocument, có thể phát hiện ba /lần truy cập và chuyển ///vào:

/*!
*  @author Robbie Yi JIANG, 29-Jan-2016 14:01:45
*
*  
*/

Làm thế nào tôi có thể làm điều này trong Vim.

Câu trả lời:


9

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 UltiSnipsthư mục trong của bạn .vimhoặc _vimfilesthư mục. Trong đó, đặt một c.snippettệ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.


3
+1 cho Ultisnips. Bạn cũng có thể chỉ định vị trí nhảy và vị trí mặc định cho con trỏ của mình sau khi mở rộng đoạn mã.
fruglemonkey 18/2/2016

6

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.snipchứ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. UltiSnipsSnipMate 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.


3

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 strftimephụ 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 strftimetì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.

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.