Thoát khỏi chế độ chèn khối với Ctrl-C


8

Trong vim, nếu bạn ở chế độ chèn khối ( Ctrl-V, Shift-I) và thoát bằng cách sử dụng Ctrl-C(thay vì Esc), nó sẽ hủy chỉnh sửa khối (và chỉ chỉnh sửa hàng đầu tiên).

Tại sao lại thế này? Trong hầu hết các bối cảnh khác, Ctrl-CEscđồng nghĩa. (Và lý tưởng nhất là có một cách để khắc phục điều này - Bây giờ tôi đã quen với việc Ctrl-Cđó và sẽ thật xấu hổ nếu tôi phải học lại cách)

Câu trả lời:


9

Ctrl-cEsckhông được đảm bảo là đồng nghĩa, và thường khác nhau. Ví dụ: trong chế độ Chèn , Escsẽ kích hoạt các chữ viết tắt và chuyển sang chế độ Bình thường , trong khi đó Ctrl-csẽ không kích hoạt các chữ viết tắt cũng như InsertLeavetự động và chuyển thẳng sang chế độ Bình thường . Một ví dụ khác là trong vichế độ dòng lệnh cũ , Escsẽ thực sự thực thi lệnh như thể bạn đã nhấn Enter. Vim cố tình thay đổi điều này vì hành vi đó được coi là không trực quan và đáng ngạc nhiên, nhưng bạn vẫn có thể kích hoạt nó bằng cách thêm xvào 'cpoptions'.

Đối với các toán tử trực quan theo khối, blockwise-operatorsthẻ trợ giúp có tài liệu sau:

Visual-block Insert                     *v_b_I*
With a blockwise selection, I{string}<ESC> will insert {string} at the start
of block on every line of the block, provided that the line extends into the
block.  Thus lines that are short will remain unmodified.  TABs are split to
retain visual columns.

Lưu ý rằng chỉ Escđược đề cập, không Ctrl-c.

Vì vậy, không, Ctrl-cEsckhông tương đương. Không bao giờ là xấu hổ khi coi thường bản thân về một quan niệm sai lầm. Một khi bạn đã nhận ra điều đó, bạn có thể quyết định làm gì tiếp theo. Các tùy chọn rõ ràng ngay lập tức là tìm hiểu sự khác biệt và sử dụng khóa chính xác hoặc quyết định rằng bạn không cần chức năng của một trong các phím và ánh xạ lại để khớp với khóa kia.


4
Gotcha. Bây giờ tôi sẽ vnoremap <C-c> <Esc>nhưng tôi sẽ giữ những gì bạn nói trong tâm trí.
Sophie Alpert

@BenAlpert: bạn thực sự cần nnoremap một inoremap có cùng giá trị để chuyển hoàn toàn sang ctrl-c như Esc. Tôi đã sử dụng nó như thế này trong nhiều năm nay và nó hoạt động hoàn hảo với tôi. Thật xấu hổ khi các biến thể vi khác, như vile hay nvi không cho phép cách giải quyết này, vì vậy tôi đã bỏ lỡ chức năng abbr ở đó.
Alex

0

Hãy thử nhập :map ^C esc"^ C" qua CTRL+ vrồi CTRL+ c.


Bạn có thể giải thích tại sao điều này là cần thiết? Những tác dụng phụ khác nó có thể có?
Sophie Alpert

Chúng phục vụ các chức năng hơi khác nhau. CTRL + C theo quy ước có nghĩa là "hủy hành động này" (trong bối cảnh giống như unix). Hủy hành động trong ngữ cảnh vim của bạn có nghĩa là "dừng những gì đang xảy ra và quay lại chế độ bình thường". Thoát trong vim có nghĩa là, "Tôi đã hoàn thành việc quay lại chế độ bình thường".
donothings thành công

Về tác dụng phụ, tôi không nhận thấy bất kỳ. CTRL-C sau khi :!catdường như vẫn có hiệu ứng mong muốn sau bản đồ. Nếu bạn gặp phải sự cố bạn có thể thử, ví dụ: stty intr \^ktại dấu nhắc shell để thay đổi ký tự ngắt của thiết bị đầu cuối thành CTRL-k.
donothings thành công
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.