Tự động xóa cặp đóng mà không gây ra cặp không cân bằng


8

Tôi viết một hàm VimL đó, trong chế độ chèn, cho phép một <BS>thông qua phần mở đầu của một cặp ( [, {, vv) để xóa các phần bế mạc cặp nếu nó là ký tự tiếp theo sau con trỏ (giống như tự động cặpvim-autoclose ). Hàm này sẽ khác vì phần đóng của cặp sẽ không bị xóa nếu có các cặp không cân bằng.

Ví dụ:

Định dạng là <initial> => <result-after-backspace>nơi con trỏ của tôi ở phía trước |.

((|)    =>   (|)

((|))   =>   (|)

(|)     =>   |

(defn   =>   (defn
  (|)          |)

Làm cách nào để xác định xem các cặp có bị mất cân bằng hay không trước khi tôi tiếp tục và xóa cặp kết thúc?

Tôi đã thử nghiệm cả hai cặp tự độngvim-autoclose . Với cả hai plugin, phần đóng của cặp luôn bị xóa.


Bạn có thể làm rõ lời nói đầu của bạn? Bạn có muốn tránh tất cả các plugin, hoặc chỉ những plugin tương tự như hai bạn đề cập không? Nếu sau này, những gì về hai bạn không thích?
Tom

Tôi không muốn sử dụng bất kỳ plugin nào cho việc này. Tôi đã cập nhật lời nói đầu.

1
Tôi đã bỏ phiếu để đóng câu hỏi này. Tôi nghĩ rằng chủ đề cơ bản như vậy là tốt, nhưng những hạn chế của bạn làm cho nó trở thành một câu hỏi "xin vui lòng viết một số mã cho tôi plz kthxbye" ngay bây giờ. Tôi không nghĩ rằng chúng tôi muốn cho phép những loại câu hỏi này ở đây ...
Martin Tournoij

1
@Carpetsmoker Ngoài cách diễn đạt câu hỏi này là một vấn đề vẫn chưa được giải quyết trong bất kỳ plugin nào mà tôi đã thấy. Tôi thấy rõ ràng rằng một khi câu hỏi này được trả lời thành công, mọi plugin loại tự động đóng hoặc tự động ghép đôi sẽ có thể được hưởng lợi từ giải pháp của nó. Làm thế nào bạn có thể đề nghị tôi thay đổi từ ngữ để làm cho nó được chấp nhận?

2
@merb, plugin paredit thực hiện chính xác những gì bạn muốn. Nếu bạn muốn chức năng đó mà không thực sự sử dụng plugin thì tôi khuyên bạn nên kiểm tra nguồn trên github. Tôi nghĩ rằng nó sẽ mang tính hướng dẫn nhiều hơn là tôi cố gắng tái tạo một phiên bản của nó ở đây. github.com/kovisoft/paredit
Quincy Bowers

Câu trả lời:


1

Nếu tôi hiểu chính xác câu hỏi của bạn, điều quan trọng là xác định xem ký tự trên con trỏ có phải là dấu phân cách phù hợp hay không.

Hãy xem xét các lệnh chế độ bình thường v%"zyv%%"zy.

  • Nếu con trỏ nằm trên một dấu phân cách trùng khớp, thì lệnh đầu tiên sẽ kéo một chuỗi có độ dài ít nhất là 2 Lít của dấu phân cách, cặp của nó và bất kỳ văn bản nào ở giữa @z. Cái thứ hai sẽ kéo lại một chuỗi có độ dài chính xác 1 lần nữa, dấu phân cách chính nó vào @z.
  • Nếu con trỏ nằm trên một dấu phân cách chưa từng có, thì lệnh đầu tiên sẽ kéo theo một chuỗi có độ dài 1 @z. Huỷ bỏ.
  • Nếu con trỏ không nằm trên một dấu phân cách và có một dấu phân cách trong dòng, thì lệnh thứ hai sẽ kéo một chuỗi có độ dài lớn hơn 1 vào @z. Huỷ bỏ.
  • Nếu con trỏ không nằm trên một dấu phân cách và không có dấu phân cách nào khác trong dòng, thì lệnh đầu tiên sẽ tạo ra một chuỗi có độ dài chính xác bằng 1 1 bản thân ký tự @z. Huỷ bỏ.

Như vậy chúng ta có kết quả sau:

Con trỏ nằm trên một dấu phân cách phù hợp khi và chỉ khi lệnh chế độ bình thường kéo v%"zymột chuỗi có độ dài ít nhất 2 vào @zvà lệnh chế độ bình thường sẽ đưa v%%"zymột chuỗi có độ dài chính xác 1 vào @z.

Gợi ý cho VimL: :norm ...strlen(@z)sẽ giúp ở đây.


Điều này trả lời câu hỏi của bạn, hoặc tôi đang thiếu một cái gì đó?
wchargein

Việc xác định xem ký tự trên con trỏ có khớp hay không không chính xác là khóa. Điều quan trọng là xác định xem một hình thức nhất định có được cân bằng hay không. Nếu biểu mẫu được cân bằng và chúng tôi thấy mình ở vị trí này (|):, nhấn <BS>nên xóa cả hai. Tuy nhiên, nếu hình thức cấp cao nhất không cân bằng, như thế này : (defn (|), nhấn <BS>chỉ nên xóa những gì thường sẽ bị xóa - trong trường hợp này để lại cho chúng tôi (defn |).

1

Ok, cuối cùng tôi đã đi qua paredit.vim và rút ra một số chức năng để tạo ra điều này: vim-lê . Nó chèn và xóa các dấu phân cách theo cặp trong khi duy trì trạng thái cân bằng.


Thật tuyệt :-) Làm thế nào để tôi sử dụng nó? Tôi chỉ có thể cài đặt nó và nó sẽ được kích hoạt theo mặc định? Có phải cũng có thể bật / tắt tính năng này cho các kiểu tệp cụ thể không?
Martin Tournoij 23/2/2015

Kích hoạt cho mọi thứ theo mặc định. Gửi một PR nếu bạn muốn bất cứ điều gì như thế. Tôi có thể tự làm điều đó tại một số điểm.

Liên kết là (hiện tại) bị hỏng.
Giàu có
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.