Làm thế nào để tôi di chuyển đến ký tự cuối cùng trong một câu?


9

Trong chế độ bình thường ()di chuyển đến ký tự đầu tiên trước hoặc tiếp theo trong câu, tương ứng. Làm thế nào để tôi di chuyển đến nhân vật cuối cùng .

Nếu tất cả các câu của tôi kết thúc bằng một khoảng thời gian tôi có thể sử dụng )T.(ký tự đầu tiên của câu tiếp theo, sau đó ngược lại với giai đoạn đầu tiên) nhưng tôi muốn một giải pháp mạnh mẽ hơn để sử dụng trong macro.

Tôi biết asistrong khi ở chế độ trực quan, do đó vis<ESC>hoạt động (chế độ trực quan, sau đó chọn bên trong câu, sau đó thoát chế độ trực quan), nhưng điều đó có vẻ khá xấu đối với tôi và tôi không thể sử dụng nó như một chuyển động với các lệnh khác.

Tôi thua lỗ. Cứu giúp!


Tại sao hai <esc>s? Bạn chỉ cần một.
Doorknob

Rất tiếc, tôi chỉ bị lẫn lộn vì sự chậm trễ để vim phản hồi. Tôi sẽ chỉnh sửa câu hỏi.
bsmith89

1
Tôi chỉ có thể đề nghị )gE. Tôi biết bạn nói rằng bạn luôn kết thúc câu với một khoảng thời gian, nhưng tốt hơn là không cần phải giả định điều đó.
superjer

Cũng lưu ý rằng asiskhông chỉ làm việc trong chế độ trực quan. Bạn có thể làm dastrong chế độ bình thường để xóa một câu.
superjer

Câu trả lời:


10

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 )(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 islàm việc. Bạn có thể thử thay thế nó ascho 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à MoveToEndcô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 MoveToEndhà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 ishầ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.


4

Chân Ninja

Tôi đã viết một plugin có tên ninja-feet.vim nhằm giúp giải quyết vấn đề này.

Toán tử chuyển động

Nó định nghĩa một số toán tử chuyển động 1 cho phép bạn thao tác trên văn bản từ con trỏ đến một đầu của đối tượng văn bản. Việc sử dụng [hoặc ]giữa toán tử và đối tượng văn bản làm cho toán tử hoạt động trên văn bản từ con trỏ sang ranh giới bên trái hoặc bên phải (tương ứng) của đối tượng văn bản.

Ngoài ra còn có các toán tử chế độ Bình thường để bắt đầu chế độ Chèn ở đầu hoặc cuối của một đối tượng văn bản: z[z], tương ứng.

Ví dụ 1: Thay đổi từ đây đến cuối chuỗi

Trong ví dụ này, hãy |biểu thị vị trí con trỏ.

foo("This is a string| with superfluous text at the end", bar);

d]i"sẽ thay đổi điều này thành:

foo("This is a string", bar);
  1. d: sử dụng toán tử xóa
  2. ]: đến cuối đối tượng văn bản sau
  3. i": trích dẫn đối tượng văn bản chuỗi

Ví dụ 2: Bắt đầu chèn sau câu hiện tại

Một lần nữa, hãy |biểu thị vị trí con trỏ.

Here is |some sentence. And here is another.

z]issẽ bắt đầu chế độ Chèn ở cuối câu đầu tiên.

  1. z]: bắt đầu chế độ Chèn sau đối tượng văn bản sau
  2. is: đối tượng văn bản câu

Hãy cẩn thận

  • Những ánh xạ này không thể lặp lại với .. Nó khá khó khăn và tôi đang cố gắng để làm cho đúng.
  • Các toán tử [](được sử dụng giữa toán tử và đối tượng văn bản) chỉ hoạt động cho các đối tượng văn bản bắt đầu bằng ihoặc a. Về mặt kỹ thuật, mà bởi vì họ đang thực sự bản đồ cho [i, ]i, [a]a. Tôi rất muốn cải thiện điều này, nhưng nó cũng rất khó khăn.
  • Không có chuyển động chế độ Bình thường để chỉ di chuyển con trỏ của bạn đến cuối của một đối tượng văn bản. Tôi đã làm cho nó hoạt động, nhưng với giá của chuyển động thực sự là một nhà điều hành (có nghĩa là .sẽ lặp lại chuyển động). Tôi không thấy hành vi đó được chấp nhận.

1 Tôi gọi chúng là các toán tử chuyển động bởi vì chúng là các toán tử được ánh xạ trong chế độ chờ toán tử, đó là chế độ bạn đang ở giữa khi gõ một toán tử và một chuyển động (ví dụ giữa giữa dwtrong dw).

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.