2012-07-22 57 views
5

Nhiều người sử dụng không gian thay vì tab. Tôi sử dụng cả hai. Tab ở đầu dòng và dấu cách từ ký tự không khoảng trắng đầu tiên. Không có vấn đề gì khi bắt đầu tài liệu mới và trong trường hợp tôi phải sửa đổi một bản chỉnh sửa tốt hơn để sử dụng định dạng. Tuy nhiên đôi khi tôi vẫn cần khắc phục vấn đề về khoảng trắng.Làm thế nào để chuyển đổi không gian hàng đầu thành các tab?

Theo Search and replace Tôi chỉ có thể thực hiện :%s/spaces_for_tab/tab/g. Nó rất đơn giản và nó sẽ làm việc trong nhiều trường hợp. Dù sao tôi chỉ muốn tái cấu trúc các khoảng trống ở đầu dòng.

+2

': đặt noet', chọn khối để chuyển đổi,': retab! ' – ninjalj

+0

@ninjalj Có nó hoạt động, nhưng việc chọn khối để chuyển đổi đôi khi có thể khó. –

+0

có thể trùng lặp của [Làm thế nào tôi có thể chuyển đổi không gian vào các tab trong Vim hoặc Linux?] (Http://stackoverflow.com/questions/9104706/how-can-i-convert-spaces-to-tabs-in-vim-or -linux) –

Trả lời

2

Tôi đã viết một func đơn giản cho nó. Dù sao nó sẽ chỉ hoạt động cho tab 4 dấu cách.

fu! Fixspaces() 
     while search('^\t* \{4}') != 0 
       execute ':%s/^\t*\zs \{4}/\t/g' 
     endwhile 
endfu 

Bạn có thể đề xuất giải pháp tốt hơn, nếu có, và tôi sẽ sử dụng nó với niềm vui. Vấn đề là func này thay thế khoảng trống trong chuỗi.

+0

Đây là lần đầu tiên tôi đánh dấu câu trả lời của mình. Dù sao đây là một nhiệm vụ lớn (ngăn không gian thay đổi trong chuỗi nhiều dòng, các thẻ trước html, vv) triển khai của tôi hơi ngây thơ một chút. –

+0

Đây không phải là giải pháp tốt, sử dụng lệnh dựng sẵn của vim thay vì 'retab' kết hợp với' noexpandtab' –

+0

@sg Nếu tôi hiểu chính xác, lời phàn nàn của Martin là 'retab' không hoạt động như mong đợi và' retab! 'chuyển đổi không gian thành các tab * ở bất cứ đâu * trên dòng (ngay cả bên trong các chuỗi ký tự chuỗi). Nó thực sự thích hợp hơn mà chỉ có khoảng trắng hàng đầu sẽ được chuyển đổi thành các tab. –

5

Đây là vấn đề về số regex. Để neo ở đầu dòng, hãy sử dụng dấu mũ, ví dụ:

s/^  /\t/ 

Hoặc làm điều đó bằng chức năng được xây dựng trong vim của:

:set tabstop=4 "four spaces will make up for one tab 
:set noexpandtab "tell vim to keep tabs instead of inserting spaces 
:retab   "let vim handle your case 

Bằng cách này, tôi cũng thích các tab cho thụt đầu dòng và không gian cho alignment. Thật không may, vim doesn't handle this well (và tôi không biết những gì các biên tập viên khác làm), vì vậy tôi chủ yếu sử dụng :set expandtab (có thể thấy :set softtabstop).

+0

Thông thường, bạn sẽ muốn 'retab!' thay vì 'retab'. –

+1

Vấn đề là, như bạn đã viết, VIM không xử lý tốt (nhiều khả năng tôi chỉ bỏ lỡ một số tính năng của VIM, VIM luôn luôn đáng ngạc nhiên đối với tôi) bởi vì retab thay thế tất cả các không gian không chỉ những không gian hàng đầu. –

-1

tôi mất Martin câu trả lời và được cải thiện vào nó một chút nếu có ai quan tâm:

function Fixspaces() 
    let ts = &tabstop 
    let pos = getpos('.') 

    if &expandtab 
    while search('^ *\t') != 0 
     silent execute ':%s/^ *\zs\t/'.repeat(' ', ts).'/g' 
    endwhile 

    echo 'Changed tabs to spaces' 
    else 
    while search('^\t* \{'.ts.'}') != 0 
     silent execute ':%s/^\t*\zs \{'.ts.'}/\t/g' 
    endwhile 

    echo 'Changed spaces to tabs' 
    endif 

    call setpos('.', pos) 
endfunction 

Chức năng này cũng có chức năng phù hợp tùy thuộc vào giá trị của các thiết lập expandtabtabstop và cũng nhớ nơi con trỏ là.

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