2011-08-05 37 views
7

Tôi tình cờ làm việc trên mã trong đó một số mô-đun sử dụng các tab thụt đầu dòng trong khi các mô-đun khác sử dụng dấu cách. Nhiều trình soạn thảo văn bản như Np ++ có một số tính năng tab thích ứng, sử dụng dấu cách cho thụt lề nếu dòng trước đó (hoặc khối mã) sử dụng dấu cách hoặc các tab như trường hợp có thể.Tab thích ứng trong vim

Tôi chưa từng thấy bất kỳ thứ gì trong vim như thế này. Có bất kỳ plugin hoặc cài đặt nào cho điều này không?

Trả lời

4

tôi perfer để thiết lập môi trường của tôi lên giống như ví dụ dưới đây minh chứng. Tôi thực hiện quy tắc chung về cách thay thế các tab bằng dấu cách và sử dụng augroup khi tôi cần ghi đè quy tắc đó. Makefiles là một ví dụ tốt khi bạn có thể yêu cầu TABS và một tệp cpp là khi bạn có thể yêu cầu không gian.

" A tab produces a 4-space indentation 
:set softtabstop=4 
:set shiftwidth=4 
:set expandtab 
" replace tabs with spaces unless noted otherwise 

" <snip> 

augroup CPPprog 
    au! 
    "----------------------------------- 
    " GENERAL SETTINGS 
    "----------------------------------- 
    au BufRead,BufNewFile,BufEnter    *.cpp,*.c,*.h,*.hpp set nolisp 
    au BufRead,BufNewFile,BufEnter    *.cpp,*.c,*.h,*.hpp set filetype=cpp 
    au FileType        *      set nocindent smartindent 
    au FileType        *.c,*.cpp    set cindent 
    au BufRead,BufNewFile,BufEnter    *.cpp     let g:qt_syntax=1 
    " turn on qt syntax highlighting (a plugin) 
    au BufNewFile,BufRead,BufEnter    *.c,*.h,*.cpp,*.hpp let c_space_errors=1 
    " trailing white space and spaces before a <Tab> 

    " <snip> 

augroup END 

" <snip> 

augroup filetype 
    au! BufRead,BufNewFile,BufEnter *Makefile*,*makefile*,*.mk set filetype=make 
augroup END 
" In Makefiles, don't expand tabs to spaces, since we need the actual tabs 
autocmd FileType make set noexpandtab 
0

Khi @zkhr cho biết bạn có thể sử dụng smartindent hoặc autoindent. Bạn cũng có thể sử dụng cindent là dấu phẩy mặc định được sử dụng bởi vim trong khi chỉnh sửa các tệp C/C++.

'smartindent' tự động chèn thêm một mức thụt đầu dòng trong một số trường hợp và hoạt động đối với các tệp giống như C.

'cindent' có thể tùy chỉnh nhiều hơn, nhưng cũng nghiêm ngặt hơn khi nói đến cú pháp.

'smartindent' và 'cindent' có thể ảnh hưởng đến thụt lề dựa trên loại tệp và không bao giờ được sử dụng cùng với nó.

Nếu bạn đang chỉnh sửa một tập tin cụ thể và bạn muốn ngăn chặn thụt tự động trong tập tin đó, hãy nhập:

:setlocal noautoindent 
:setlocal nocindent 
:setlocal nosmartindent 
:setlocal indentexpr= 
0

Tôi không nghĩ có bất kỳ thứ gì trong Vim chính xác như những gì bạn muốn. Nhưng bạn có thể muốn xem copyindent. Xem :h copyindent. Nó cung cấp cho "tabbing thích nghi" nhưng không hoàn toàn những gì bạn muốn. Các tab/dấu cách hàng đầu trên một dòng mới sẽ sao chép các dòng/dòng trước đó. Tuy nhiên, nếu bạn tăng thụt lề, quyết định xem liệu các tab hoặc dấu cách có được thêm hay không sẽ phụ thuộc vào cài đặt expandtab. (Bạn cũng có thể muốn xem trợ giúp cho tùy chọn preserveindent, cũng nên được đặt trong kịch bản của bạn).

Bạn cũng sẽ muốn có cài đặt tab tự động, qua autoindent hoặc smartindent. Không chắc chắn, bạn có thể phải đặt lại smartindent hoặc autoindent sau khi thiết lập copyindent để làm cho nó hoạt động đúng cách (ví dụ: :set nosmartindent rồi :set smartindent một lần nữa).

Các vấn đề liên quan