Có thể làm cho một phím nóng có tiền tố số chạy một hàm nhiều lần không?


7

Tôi thấy rằng nếu bạn nhập tiền tố số trước khi thực hiện lệnh ex, quy ước mà nó áp dụng là thiết lập lệnh để chuẩn bị một thao tác trên phạm vi dòng. Nó được giải thích trong tài liệu,

MỘT SỐ DÒNG

Khi bạn biết có bao nhiêu dòng bạn muốn thay đổi, bạn có thể nhập số và sau đó ":". Ví dụ: khi bạn nhập "5:", bạn sẽ nhận được:

    :.,.+4

Bây giờ bạn có thể gõ lệnh bạn muốn sử dụng. Nó sẽ sử dụng phạm vi "." (dòng hiện tại) cho đến khi ". + 4" (bốn dòng xuống). Do đó, nó kéo dài năm dòng.

Bây giờ những gì tôi đang xử lý là một chức năng tùy chỉnh của tôi, cái này:

function! MyAmazingEnhancedDot()
    if v:hlsearch == 1
        :normal! .n
    else
        :normal! .j
    endif
endfun

Đây chỉ là một cách để hợp lý hóa các tác vụ lặp đi lặp lại bao gồm lặp lại một thao tác trên một loạt các dòng hoặc qua một loạt các kết quả tìm kiếm phù hợp.

Chức năng này được liên kết với một phím nóng. Chẳng hạn như Alt+ .hoặc bất cứ điều gì.

Mục tiêu của tôi là có thể làm một cái gì đó rất mạnh mẽ: Tôi sẽ có thể gõ /varName<CR>ciwnew-var<ESC>n9<Alt+.>để đạt được đổi tên 10 trường hợp varNamethành new-var.

Điều thực sự xảy ra nếu tôi làm điều này là nó không thực hiện việc đổi tên và 9 dòng được thao tác với thao tác .chỉnh sửa đã được lưu của tôi từ cột 0.

Tôi chỉ có thể giả sử rằng Vim đang diễn giải tổ hợp phím của mình, do đó : :.,.+8 normal! .n.

Về mặt nửa thủy tinh, :normal! .jtrường hợp của liên kết thực sự hoạt động, bởi vì jchuyển động không có tác dụng là không có hậu quả trong tình huống này. (Tôi vẫn cần jlàm cho nó hoạt động trong trường hợp sử dụng tương tác không có tiền tố).

Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể ghi đè hành vi mở rộng dòng mà Vim áp dụng cho liên kết của tôi? Điều tuyệt vời là nếu tôi có thể đọc trong tiền tố số dưới dạng đối số hoặc đại loại như thế.

Câu trả lời:


6

Theo mặc định, vim xử lý tất cả các hàm như thể chúng là các lệnh ex mặc định, tức là mọi số tiền tố được sử dụng như {range}. Để thay đổi điều này, bạn cần sửa đổi chức năng và bản đồ của mình để sử dụng số đếm.

Bản đồ với số lượng

Bản đồ có thể đếm và được cung cấp qua v:countv:count1. Cái đầu tiên chứa 0 nếu không có số lượng được cung cấp và cái sau chứa 1 làm mặc định. Bạn có thể tạo bản đồ cho chức năng của mình:

nnoremap <M-.> :<C-u>call MyAmazingEnhancedDot(v:count1)<cr>

Để biết thêm thông tin :h v:count

Các lệnh có số lượng

Các lệnh có thể có tùy chọn a {range}hoặc a countlàm tiền tố. Khi tạo lệnh, cờ sẽ -countvô hiệu hóa tùy chọn phạm vi và mặc định <count>biến là 0. Tùy chọn có thể được cung cấp một giá trị mặc định -count=N. Giá trị tiền tố sau đó có sẵn thông qua biến counttrong hàm của bạn.

Một lệnh sử dụng đếm sẽ trông như thế này:

:command -count=1 EDot call MyAmazingEnhancedDot(<count>)

Bây giờ khi bạn gọi 9EDotchức năng của bạn được gọi với số lượng 9thay vì một phạm vi.

Để biết thêm thông tin xem :h command-count

Cả hai ví dụ

Đây là mã của bạn:

function MyAmazingEnhancedDot(count)
  let c = a:count
  while c > 0
    if v:hlsearch == 1
      :normal! .n
    else
      :normal! .j
    endif
    let c -= 1
  endwhile
endfunction

command -count=1 EDot call MyAmazingEnhancedDot(<count>)

nnoremap <M-.> :<C-u>exe v:count1 . "EDot"<CR>

Bây giờ bạn có thể làm ví dụ của bạn

/varName<CR>ciwvar-name<esc>n9<M-.>

1
Mát mẻ. Bây giờ dường như có quá nhiều cách để giải quyết vấn đề của tôi! Tôi hiểu rằng bạn đã kết hợp cả hai cơ chế trong ví dụ bạn đã đưa ra để minh họa cách sử dụng chúng. Nhưng tôi tự hỏi nếu nó không đủ để chỉ sử dụng nnoremap <M-.> :<C-u>call MyAmazingEnhancedDot(v:count1)<cr>và bỏ qua command -count=1 EDot call MyAmazingEnhancedDot(<count>)?
Steven Lu

Bỏ qua tùy chọn lệnh là tốt. Lợi ích duy nhất bạn nhận được từ tùy chọn lệnh là có thể gọi nó từ các lệnh ex như :9EDot. Nếu bạn không sử dụng các lệnh ex nhiều thì hãy bỏ qua nó.
jecxjo

Tuyệt vời. Bây giờ câu trả lời hoàn hảo của bạn đã hoàn tất!
Steven Lu
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.