Làm thế nào tôi có thể ánh xạ d [tính] d?


18

NB Đây không phải là bản sao của lệnh "d3fg" hoạt động như thế nào? Xin vui lòng đọc nó trước khi bỏ phiếu để đóng!

Tôi đã đi đến một chút bế tắc trong nhiệm vụ của mình để có được các thao tác xóa nhỏ hoạt động như những việc lớn . Vấn đề tôi gặp phải là tôi không thể tìm ra cách sắp xếp lại các lệnh như thế nào d3d. Trên thực tế, tôi thậm chí không thể hiểu cách họ làm việc ở nơi đầu tiên, cũng như không tìm thấy bất kỳ đề cập nào về họ trong sự giúp đỡ của Vim. *

d3jrất đơn giản: nó áp dụng dtoán tử cho 3jchuyển động,

3ddcũng đơn giản: nó chạy ddlệnh với "số đếm" là 3.

d3d Có vẻ như nó nên đơn giản, nó áp dụng dtoán tử cho các nhưng nhưng là 3dgì? Đó không phải là một chuyển động. Nếu bạn tự gõ 3d, Vim coi nó như một số đếm theo sau bởi một toán tử và kiên nhẫn chờ đợi thêm đầu vào.

Và bạn không thể áp dụng toán tử cho các toán tử khác. ddkhông được mô tả trong trợ giúp như một chuỗi hai toán tử. Đó là một lệnh hai phím riêng biệt. (xem dc, không làm gì cả.)

Dường như vị trí của số đếm là linh hoạt đối với các lệnh yêu cầu hai lần nhấn phím: 2gjdi chuyển con trỏ xuống hai dòng màn hình, nhưng g2jloại bỏ hoàn toàn hai lần nhấn phím đầu tiên và di chuyển con trỏ xuống một dòng.

Vì vậy, làm thế nào nó hoạt động? Đây có phải chỉ là một trường hợp đặc biệt trong mã nội bộ của Vim? Có cách nào tôi có thể tạo một d[count]dbản đồ?

EDIT : Nó có phải là một đối tượng văn bản? :h text-objectskhông bao gồm nó trong danh sách các "lệnh lựa chọn đối tượng văn bản", nhưng sau đó nó không bao gồm dd trong danh sách xóa "nhóm từ nhỏ tới các đối tượng lớn". Và d2awkhông xóa từ dưới con trỏ và sau đây. Mặt khác, c2dkhông làm gì cả.

* Tôi chắc chắn một số đề cập đến chúng phải tồn tại, nhưng tôi không thể tìm thấy nó. Tôi đã đọc :help deleting, :help motion.txtvà cố gắng :helpgrep dNdcho tất cả các giá trị của N 1-9 .


2
Tôi nghĩ rằng dhành động cuối cùng như một xác nhận; Vì vậy, nó giống như d3<CR>. y3yc3ccũng hoạt động tương tự ... Tôi không thể tìm thấy bất kỳ tài liệu nào về điều này mặc dù trong Vim: help, vi (1), nvi (1) hoặc thông số POSIX ... Nó hoạt động giống nhau trong vinvibtw .
Martin Tournoij

1
Theo một cách nào đó, ddlà giống hệt với d_. _đưa con trỏ về vị trí không trống đầu tiên trên dòng ( [count]-1), nhưng theo chiều dọc, do đó, khi được ghép nối với một toán tử, nó hoạt động trên toàn bộ dòng. Vì lý do đó, nó có ý nghĩa rằng một số đếm có thể xuất hiện giữa hai ds.
tommcdo

Câu trả lời:


28

Chế độ chờ toán tử

Giữa gõ một nhà điều hành (như d, choặc gU) và một chuyển động (như w, i}hoặc /foo<CR>), Vim đang ở chế độ vận hành đang chờ giải quyết. Bạn có thể tạo ánh xạ cho việc này bằng cách sử dụng :omap:onoremap.

Trong ví dụ của tôi, tôi sẽ để lập bản đồ hành đang chờ giải quyết dcho w. Đây là một lựa chọn ngẫu nhiên, vì tôi không biết bạn thực sự muốn sử dụng nó vào mục đích gì.

Tạo một omap

Hãy tạo một ánh xạ cho dtrong chế độ chờ của Người vận hành. Tôi sẽ giả sử rằng chúng tôi đang viết VimScript ở đây (chẳng hạn như trong của bạn .vimrc), vì vậy tôi sẽ bỏ qua :các s hàng đầu .

onoremap d w

Điều này làm cho ddhành động như thế dw. Nó cũng làm cho d[count]dhành động như thế d[count]w. Nhưng tôi cá là bạn không muốn ảnh hưởng đến hành vi của dd(nghĩa là không [count]được cung cấp).

Ánh xạ biểu thức

Ánh xạ biểu thức cho phép bạn đánh giá biểu thức VimScript để tạo phía bên phải của ánh xạ. Biểu thức nên đánh giá thành một chuỗi. Ánh xạ biểu thức được biểu thị bằng <expr>từ khóa.

Vim cũng có một số biến tích hợp được phổ biến ở nhiều thời điểm khác nhau và thường hữu ích trong quá trình ánh xạ. Một trong số đó là v:count, được [count]cung cấp cho người vận hành hoặc chuyển động.

Chúng ta hãy kết hợp tất cả lại. Nếu không [count]được cung cấp, v:countsẽ được 0. Chúng ta có thể nói ánh xạ của chúng ta chỉ sử dụng dtrong trường hợp đó.

onoremap <expr> d v:count == 0 ? 'd' : 'w'

Bây giờ ddhành xử như mặc định (xóa một dòng), nhưng d[count]dhành xử như thế d[count]w. Mát mẻ!

Hạn chế sử dụng sau khi dvận hành

Bạn có thể nhận thấy một cái gì đó, mặc dù. Bây giờ cdcũng cư xử như thế cw. Điều này có thể không phải là một vấn đề, nhưng để hoàn thiện, chúng ta hãy hạn chế nó để nó chỉ hoạt động sau khi người dvận hành.

Vim có một biến khác, v:operatorchứa toán tử được sử dụng gần đây nhất. Hãy kiểm tra xem, trước khi làm bất cứ điều gì đặc biệt.

onoremap <expr> d (v:count == 0 \|\| v:operator != 'd') ? 'd' : 'w'

LƯU Ý::mapcác lệnh có thể được nối kết với nhau |, chúng ta phải thoát chúng trong biểu thức của chúng ta ở đây. Vì vậy, toán tử OR logic ||trở thành \|\|.

Thật tuyệt, vì vậy cdc[count]dquay lại không làm gì cả, giống như họ đã từng. Điều này là tốt để các plugin khác có thể xác định cd.

Tôi không muốn xóa một số chuyển động khác

Nếu bạn muốn ánh xạ d[count]dtới một cái gì đó hoàn toàn khác, không có gì để xóa văn bản, chúng tôi cũng có thể làm cho nó hoạt động.

Khi bạn đang gõ lệnh ở chế độ Bình thường và bạn bắt đầu nhập sai lệnh, bạn có thể nhấn <Esc>để hủy lệnh đó. Điều tương tự áp dụng cho ánh xạ của bạn.

Hãy d[count]dthay đổi dòng hiện tại thành bất cứ điều gì [count].

onoremap <expr> d (v:count == 0 \|\| v:operator != 'd') ? 'd' : '<Esc>cc' . v:count . '<Esc>'

Phần cuối cùng của ánh xạ là biểu thức VimScript : <Esc>cc' . v:count . '<Esc>'. Đó là <Esc>để hủy dlệnh đang chờ xử lý , sau đó ccthay đổi dòng hiện tại, v:countđể nhập giá trị của [count](trong chế độ Chèn) và <Esc>để trở về chế độ Bình thường. Lưu ý rằng chúng tôi đang xây dựng một chuỗi ở đây bằng cách sử dụng toán tử ghép nối VimScript , ..


Trường hợp sử dụng thực tế của bạn có thể sẽ khác với những gì tôi đã phác thảo ở đây, nhưng hy vọng điều này sẽ giúp bạn có được quả bóng lăn.

Chúc mừng Vinkle!


Câu trả lời chính xác! Nâng cao. Tôi đã liên kết đến trường hợp sử dụng của mình (cũng trên vi.SE) khi bắt đầu câu hỏi, nhưng tôi đoán bạn đã bỏ lỡ nó. Về cơ bản tôi cần phải làm :omap d d(!), Nhưng tiếc là chế độ chờ toán tử không bao giờ thực sự đạt được do ánh xạ của tôi cho d đặt chức năng toán tử tùy chỉnh. Tuy nhiên, hy vọng có thể điều chỉnh mọi thứ để thực hiện d3dcông việc như thế nào. . Cảm ơn!
Giàu

1
Trên thực tế, trên suy nghĩ thứ hai, tôi chấp nhận điều này ngay bây giờ. Bạn đã giải thích cả cách tạo ra một ánh xạ như vậy, và cả cách nó hoạt động dưới mui xe, đó là hai điều tôi đã hỏi.
Giàu
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.