Tự động thêm đóng "hoặc 'khi chèn một, nhưng chỉ khi con trỏ chưa ở trong chuỗi


14

Tôi đã xác định ánh xạ trong tôi vimrcđể tự động nhập dấu ngoặc đơn và dấu ngoặc nhọn khi tôi nhập mở inoremap ( ()<esc>i.

Tôi muốn làm tương tự cho "', nhưng chỉ khi con trỏ hiện không nằm trong chuỗi - vì bên trong chuỗi 'có thể là dấu nháy đơn chứ không phải là dấu phân cách chuỗi. Tôi có thể làm cái này như thế nào?

Câu trả lời:


5

Một cách tiếp cận có thể là sử dụng các syn*chức năng. Cái gì đó như:

fun! Qtx(qt)
    let x = synIDattr(synIDtrans(synID(line("."), col("."), 1)), "name")
    if x != "String" && x != "Comment" && x != "Constant"
        return a:qt . a:qt
    endif
    return a:qt
endfun


inoremap <silent> <expr> ' Qtx("'")
inoremap <silent> <expr> " Qtx('"')

Ý tưởng là tận dụng cú pháp cho bộ đệm ở vị trí con trỏ. Điều này có lẽ có thể được giải quyết tốt hơn. Nhưng hy vọng một sự khởi đầu.


Lý do đằng sau tên chức năng là Qtxgì?
Martin Tournoij

@Carpetsmoker: Quouotix Chấm dứt eXitus.
Runium

2

Như đã nói, bạn sẽ phải kiểm tra ngữ cảnh cú pháp. API lh-ngoặc cũ cung cấp các hàm cho mục đích đó: các Map*Context()hàm . Kể từ đó, các định nghĩa ngoặc đã được gói gọn trong :Bracketđó sẽ xem xét bối cảnh (chuỗi hoặc nhận xét).

Theo mặc định, ánh xạ nhận biết ngữ cảnh được xác định cho tất cả các cặp ngoặc thông thường như thế này:

  :Brackets! ( )
  :Brackets! [ ] -visual=0
  :Brackets! [ ] -insert=0 -trigger=<leader>[

  :Brackets! " " -visual=0 -insert=1
  :Brackets! " " -visual=1 -insert=0 -trigger=""
  :Brackets! ' ' -visual=0 -insert=1 -but=function('lh#ft#is_text')
  :Brackets! ' ' -visual=1 -insert=0 -trigger=''

  :Brackets! < > -visual=1 -insert=0 -trigger=<localleader><

  :Brackets! { }
  :Brackets! { } -visual=1 -insert=0 -nl -trigger=<leader>{
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.