2013-08-05 64 views
10

Tôi hầu hết các IDEs và soạn thảo văn bản hiện đại (Sublime chữ 3) con trỏ thụt vào một cách chính xác sau khi chèn một dòng mới ở giữa một thẻ html (aka 'mở rộng" tag):Vim vị trí con trỏ sau khi mở rộng thẻ html

Trước :

<div>|</div> 

Sau khi nhấn CR:

<div> 
    | 
</div> 

Nhưng trong Vim, đây là những gì tôi nhận được:

<div> 
|</div> 

Làm cách nào để có được hành vi tương tự trong Vim như trong hầu hết các trình chỉnh sửa khác (xem ở trên)?

+0

thử cách này: https://github.com/othree/xml.vim – Kent

+0

Tôi đang gặp sự cố khi trả lời câu hỏi này vì lý do nào đó (tiếp tục gặp lỗi khi gửi một) . Tôi đã dán câu trả lời của mình vào [this gist] (https://gist.github.com/rson/7bd877744ac59bee5491). –

+0

@RandyMorris Tôi không có vấn đề gì khi đăng câu trả lời. Thử đăng lại? – FDinoff

Trả lời

7

Chỉ chính xác hành vi của <CR> trong chế độ chèn là ngắt dòng tại con trỏ.

Điều bạn muốn là hành vi được tăng cường và bạn cần thêm nội dung nào đó vào cấu hình của mình để tải xuống: ánh xạ, chức năng ngắn hoặc plugin chính thức.

Khi tôi bắt đầu sử dụng vim, hành vi đó thực sự là một trong những điều đầu tiên tôi thêm vào vimrc của mình. Tôi đã thay đổi nó nhiều lần trong quá khứ nhưng bản đồ này đã được khá ổn định trong một thời gian:

inoremap <leader><CR> <CR><C-o>==<C-o>O 

Tôi đã sử dụng <leader><CR> để giữ cho hành vi bình thường của <CR>.


Đây là một chức năng nhỏ mà dường như để làm những gì bạn muốn:

function! Expander() 
    let line = getline(".") 
    let col = col(".") 
    let first = line[col-2] 
    let second = line[col-1] 
    let third = line[col] 

    if first ==# ">" 
    if second ==# "<" && third ==# "/" 
     return "\<CR>\<C-o>==\<C-o>O" 

    else 
     return "\<CR>" 

    endif 

    else 
    return "\<CR>" 

    endif 

endfunction 

inoremap <expr> <CR> Expander() 
+0

Cảm ơn bạn rất nhiều - giải pháp của bạn hoạt động và tôi sẽ chấp nhận nó như một câu trả lời. Tôi thà thích nhìn thấy một hành vi tự động hơn như tôi nhận được nó trong Sublime Text hoặc Textmate. Tôi có thể điều tra vimscript học tập và mở rộng giải pháp Randy Morris dưới đây. –

+0

FWIW, tôi sử dụng SnipMate và Sparkup để viết HTML. Bạn nên xem xét các plugin: chúng sẽ giúp bạn tiết kiệm ** rất nhiều ** đánh máy. – romainl

+0

@DanielLang, vui lòng xem chỉnh sửa của tôi. – romainl

2

@RandyMorris và @romainl đã đăng các giải pháp tốt cho vấn đề chính xác của bạn.

Có một số khả năng khác mà bạn có thể quan tâm nếu bạn tự mình nhập các thẻ này: có plugin ragtag.vim để chỉnh sửa HTML/XML.

Với ragtag.vim bạn gõ này để tạo ra của bạn "trước khi" tình hình (trong insert mode):

div<C-X><Space> 

Để tạo của bạn "sau khi" tình huống mà bạn thay vào đó sẽ gõ:

div<C-X><Enter> 

Vì vậy, nếu bạn biết trước rằng bạn sẽ "mở rộng" thẻ, chỉ nhập tên phần tử và kết hợp CtrlX theo sau bởi Nhập là đủ.

Ngoài ra còn có các plugin nâng cao khác để lưu các lần nhấn phím khi chỉnh sửa HTML, chẳng hạn như ZenCoding.vimSparkup.

+0

Cảm ơn! Thật không may mà không làm việc cho tôi, mặc dù tôi đã có cài đặt ragtag-plugin và sử dụng nó rất nhiều cho chèn thẻ ruby ​​(vì vậy tôi biết nó hoạt động). –

3

đoạn nhỏ này sẽ remap Nhập trong chế độ chèn để kiểm tra hay không con trỏ là giữa >< và hành động phù hợp nếu có. Tùy thuộc vào cài đặt thụt lề của bạn, có thể cần xóa \<Tab>.

Nó sẽ không chơi đẹp với các plugin khác có thể được cũng được lập bản đồ Nhập chính vì vậy hãy biết rằng có lẽ là nhiều việc phải làm nếu bạn muốn tương thích mà.

function EnterOrIndentTag() 
    let line = getline(".") 
    let col = getpos(".")[2] 
    let before = line[col-2] 
    let after = line[col-1] 

    if before == ">" && after == "<" 
    return "\<Enter>\<C-o>O\<Tab>" 
    endif 
    return "\<Enter>" 
endfunction 

inoremap <expr> <Enter> EnterOrIndentTag() 

Tôi đã chỉ kiểm tra các trường hợp đơn giản (đầu dòng, cuối dòng, bên trong và bên ngoài của ><), có lẽ cạnh trường hợp rằng điều này sẽ không bắt.

+0

Cảm ơn bạn Randy. Giải pháp của bạn rất hay, nhưng trên thực tế tôi cần một cái gì đó chơi tốt với các plugin khác như matchIt. Mã của bạn khiến tôi nghĩ đến việc viết một hàm như vậy, cảm ơn! –

0

Vì không ai đề cập đến nó, tôi sẽ làm như vậy. Có plugin tuyệt vời thực hiện chính xác điều đó delemitmate

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