2011-08-25 40 views
20

Có một plugin Vim nào có thể xử lý chèn dấu chấm phẩy thông minh, giống như trong Eclipse?Dấu chấm phẩy thông minh Vim

Ví dụ (nhân vật ống là chèn con trỏ):

foobar(|) 

Tôi gõ một dấu chấm phẩy:

foobar();| 

Tương tự:

foobar("blah|") 

Tôi gõ một dấu chấm phẩy:

foobar("blah");| 

Nếu tôi muốn có một dấu chấm phẩy tại vị trí con trỏ gốc, tôi nhấn backspace sau khi tái vị trí thông minh:

foobar("hello|") 
foobar("hello");| 
foobar("hello;|") 
+1

Và nếu bạn muốn thực sự có dấu chấm phẩy bên trong chuỗi ký tự thì sao? –

+2

Trong Eclipse, nhấn backspace sau khi chèn dấu chấm phẩy thông minh sẽ đặt dấu chấm phẩy vào vị trí con trỏ ban đầu. – dteoh

+4

Giải pháp lý tưởng: sử dụng Python. Sau đó, bạn không cần phải lo lắng về dấu chấm phẩy ;-) –

Trả lời

24

tôi sử dụng bản đồ này:

inoremap <leader>; <C-o>A; 

Nó không phải ; vì tôi sử dụng dấu chấm phẩy thường xuyên và trong nhiều bối cảnh.

  • <C-o> được sử dụng để nhập một lệnh chế độ thông thường.
  • A; có nghĩa là "thêm ; ở cuối dòng".
+3

@dansomething: Oh yes! Kể từ câu trả lời đó, tôi đã sửa đổi dòng đó nhiều lần trong '~/.vimrc' của tôi. Đây là hiện thân: inoremap ; m' A; '' – romainl

+0

Với ánh xạ của bạn, vim chờ ký tự thứ hai trên mỗi lần bấm phím . – Koshimitsu

+0

@Koshimitsu đây là hành vi tiêu chuẩn và bạn nhận thấy nó chỉ khi bạn tạm dừng bản thân. – romainl

0
" ftplugin/c/c_snippet.vim 
inoremap <expr> <buffer> ; getline('.')[col('.')-1:-1]=~')$' ? '<right>;' : ';' 

Phiên bản này sẽ không gây ra vấn đề với for nếu động cơ của bạn đoạn mở rộng nó thành

for (...|) { 
    <+code+> 
}<++> 

Nếu khung mở là trên một dòng mới, nó sẽ làm mọi chuyện rối lên.

Bạn có thể dễ dàng thay đổi regex thành '"\=)\+$' để trả lời câu hỏi ban đầu của mình.

inoremap <expr> <buffer> ; getline('.')[col('.')-1:-1]=~'"\=)\+$' ? '<end>;' : ';' 

Tuy nhiên, tôi không nghĩ đó là một ý tưởng hay. Trong trường hợp đó, các bản đồ cho <bs> sẽ là:

inoremap <expr> <buffer> <bs> getline('.')[:col('.')-2] =~ '.*")\+;$' ? '<bs><c-o>F";' : '<bs>' 
10

Tôi muốn làm điều tương tự, tôi hoạt động trên nó cả đêm, tấn mã, nhưng cuối cùng, tôi nhận được một giải pháp đơn giản.

inoremap ;<cr> <end>;<cr> 

và nếu tôi đang trong một cú đúp, tôi muốn thêm một dấu chấm phẩy hoặc dấu chấm ở cuối, như thế này

foo({ 
    | 
}) 

Tôi nhấn ;;<cr> hoặc ..<cr> để làm điều này

inoremap ;<cr> <end>;<cr> 
inoremap .<cr> <end>. 
inoremap ;;<cr> <down><end>;<cr> 
inoremap ..<cr> <down><end>. 
2

Tôi sử dụng chức năng sau và ánh xạ để chèn dấu chấm phẩy vào cuối dòng và để xóa dấu cách còn lại:

imap <leader>. <C-R>=Semicolonfun()<CR> 
fun! Semicolonfun() "{{{ 
    call setline(line('.'), substitute(getline('.'), '\s*$', ';', '')) 
    return "\<End>" 
endfunction "}}} 

Vì vậy, nếu bạn có một cái gì đó như:

log.warning("you miss the |identifier") 

Nhấn. hoặc là ,. nếu bạn remap các nhà lãnh đạo, bạn sẽ có được những điều sau đây:

log.warning("you miss the identifier");| 
Các vấn đề liên quan