Từ nghiên cứu của tôi về điều này, bạn cần xác định ít nhất hai chuyển động tùy chỉnh. Cái đầu tiên sẽ chỉ để di chuyển con trỏ và cái thứ hai sẽ được sử dụng trong các toán tử. Đối với một thiết lập chức năng đầy đủ, nó phức tạp hơn nhiều và tôi khuyên bạn nên xem mã trong CamelCaseMotion của Ingo Karkat , điều này cho thấy nhiều suy nghĩ về việc làm điều này đúng hơn tôi làm dưới đây. Hầu hết câu trả lời của tôi dựa trên thông tin nhanh được tìm thấy trong trợ giúp và thử nghiệm của Vim.
Trong ví dụ sau đây, tôi sẽ remap các )
và (
chuyển động để làm mỗi đầu của một câu. Bạn có thể sử dụng các ký tự khác như bạn muốn bằng cách sửa đổi ví dụ. Tôi cũng lấy ví dụ của bạn vis<ESC>
là tùy chọn mạnh mẽ hơn (so với )T.
). Khi làm như vậy, nếu bạn đã ở cuối câu, cuối cùng bạn sẽ ở lại cuối thay vì chuyển đến cuối sau câu này, vì cách is
làm việc. Bạn có thể thử thay thế nó as
cho các kết quả khác nhau. Điều này thực sự sẽ làm việc để biến một trong hai bên của một đối tượng văn bản thành một chuyển động.
Đầu tiên, chuyển động chế độ bình thường
Lưu ý Điều này không hoạt động ở chế độ trực quan hoặc chế độ chờ toán tử
function! MoveToEnd(type, ...)
exe "normal `]"
endfunction
map <silent> \) :set opfunc=MoveToEnd<CR>g@
nmap ) \)is
Đầu tiên, chúng tôi xác định một hàm mới được gọi là MoveToEnd
công việc duy nhất của nó là đặt con trỏ ở "ký tự cuối cùng của văn bản đã thay đổi hoặc được ]
đánh dấu trước đó", đó là dấu (xem :help ']
).
Tiếp theo, chúng tôi tạo một toán tử tùy chỉnh \)
gọi MoveToEnd
hàm của chúng tôi trên bất kỳ chuyển động nào được đưa ra cho nó. Theo cách này, ]
nhãn hiệu trở thành kết thúc của lựa chọn được cung cấp cho toán tử mới của chúng tôi. (xem :help map-operator
)
Cuối cùng, chúng tôi ánh xạ )
để gọi toán tử tùy chỉnh của chúng tôi với is
hầu hết, do đó có hiệu quả tương đương vis<ESC>
mà không thay đổi lựa chọn hình ảnh cuối cùng và không thay đổi chế độ.
Ngược lại là tương tự, chỉ cần sử dụng các hướng khác:
function! MoveToBeginning(type, ...)
exe "normal `["
endfunction
map <silent> \( :set opfunc=MoveToBeginning<CR>g@
:nmap ( \(is
Thứ hai, phong trào điều hành
Điều này là khó khăn hơn. Chuyển động của chúng tôi ở trên phá hủy vị trí bắt đầu, vì vậy các nhà khai thác như 'cuối cùng' không làm việc gì. Điều chúng ta cần là có thể lưu vị trí bắt đầu và thêm vị trí kết thúc. :help omap-info
(ánh xạ đang chờ xử lý của nhà điều hành) đưa ra một mẹo để thực hiện điều này, đó là thực sự sử dụng chế độ trực quan.
Những gì chúng ta sẽ làm sau đó là lưu vị trí của chúng ta vào một đầu của thanh ghi lựa chọn trực quan, sử dụng chuyển động chế độ bình thường của chúng ta từ phía trên, đặt thanh ghi lựa chọn hình ảnh khác, rồi kích hoạt chế độ trực quan:
function! SelectToEnd()
normal m< "Set start point of visual selection
normal ) "Move to end of sentance (relies on mapping from earlier)
normal m> "Set end point of visual selection
normal gv " 'Go Visual' activate visual mode using selection marks
endfunction
omap ) :call SelectToEnd()<CR>
Và cho chuyển động trở lại của chúng tôi:
function! SelectToBeginning()
normal m> "Set end point to current position (since we are moving backwards)
normal ( "Move to beginning of sentence (relies on mapping from earlier)
normal m< "Set start point
normal gv "Activate visual mode based on our new marks
endfunction
omap ( :call SelectToBeginning()
Với điều này, bạn có thể làm d)
để xóa đến cuối câu (thay vì xóa bản gốc sang đầu câu tiếp theo). Tất cả các nhà khai thác khác nên làm việc là tốt.
<esc>
s? Bạn chỉ cần một.