Chuyển sang lần xuất hiện tiếp theo của từ tôi vừa thay đổi


11

Nếu tôi có những điều sau đây:

function foo(bar) {
    return bar + 1;
}

Và tôi sử dụng cwđể thay đổi cái đầu tiên barthành baz, làm thế nào để tôi chuyển sang kết quả khớp tiếp theo bar, để tôi có thể sử dụng .để thực hiện cùng một thay đổi?

Tôi không thể sử dụng *, vì tìm kiếm từ hiện tại dưới con trỏ và tôi dại dột không tìm kiếm barlần đầu tiên, vì vậy nsẽ không hoạt động.

Có một cách đơn giản để tìm kiếm sự xuất hiện tiếp theo của từ như trước khi tôi thay đổi nó?

Tôi không muốn thực hiện tìm kiếm và thay thế, bởi vì có những sự cố khác bartrong tệp của tôi mà tôi không muốn thay đổi hoặc vì chỉ có hai trường hợp barvà tôi đã quên :%s/bar/baz/trước khi bắt đầu và điều đó cũng vậy nhiều nỗ lực để thay đổi trường hợp duy nhất còn lại.


2
Điều đó không hoàn toàn theo quy trình công việc bạn đã mô tả nhưng vim-xiên cải thiện *tìm kiếm. Đặc biệt nó làm cho *trực quan chọn từ hiện tại mà không di chuyển con trỏ của bạn. Khi nó được cài đặt, bạn có thể làm gì *ciwđể đưa từ cũ vào sổ đăng ký tìm kiếm và thay đổi từ đó. Sau đó, bạn có thể sử dụng n..
statox

Nhấn n sẽ chuyển bạn đến lần xuất hiện tiếp theo của mẫu tìm kiếm cuối cùng. Tại sao bạn không thử điều đó?
SibiCoder

... bởi vì tôi đã không tìm kiếm để đến lần xuất hiện đầu tiên, nên nsẽ không hoạt động.
Roger Lipscombe

Câu trả lời:


13

Văn bản bạn vừa thay đổi cwđã được cắt vào thanh ghi không tên để bạn có thể sử dụng lại nó với:

/<C-r>"<CR>

để chuyển đến lần xuất hiện tiếp theo của văn bản được bao phủ bởi thay đổi cuối cùng của bạn.


4

Để mở rộng romainl như một quy trình công việc hoàn chỉnh ...

Nếu bạn muốn thực hiện chỉnh sửa loại này và sau đó nhận ra rằng bạn cần áp dụng các chỉnh sửa tương tự trên một đoạn / chức năng, bạn có thể sử dụng ".đăng ký.

Trong ví dụ của bạn, bạn có thể thực hiện chỉnh sửa ban đầu của đối số. Nếu bạn vào chế độ trực quan (tôi sẽ sử dụng Visual Line chỉ để đảm bảo bạn chọn mọi thứ chính xác) và sau đó áp dụng tìm và thay thế.

V]] - Visual Line, đến cuối đoạn / hàm.

  • : - Vì bạn đang ở chế độ trực quan nên điều này trở thành :'<,'>
  • s/ - Tìm thấy
  • CTRL+ "- mục yank / xóa cuối cùng (thanh trong ví dụ)
  • / - và Thay thế
  • CTRL+ .- chèn cuối cùng (baz trong ví dụ)

Mẫu này mất một chút thời gian để sử dụng vì bạn phải sử dụng. Hầu hết thời gian bạn muốn chỉ áp dụng tìm và thay thế cho toàn bộ chức năng bao gồm cả đối số, nhưng đó là một cách hay để không thực hiện chống mẫu "Hãy làm việc, nhận ra rằng bạn nên làm tốt hơn, hoàn tác và làm lại chính xác. "


1

Nếu bạn không ngại nhấn một kết hợp khác hơn cw, thì tôi tin rằng bạn có thể có được những gì bạn muốn một cách dễ dàng, bằng cách xác định một phím tắt. Những gì bạn có thể làm là đặt sau đây

nmap <leader>a "1yiw:let @/=@1^Mciw

trong .vimrctập tin của bạn Lưu ý rằng đó ^M là một phím chụp trở lại, và không phải là các ký tự ^M. Bạn nhận được nó bằng cách nhấn Ctrl+ Vtrong chế độ chèn theo sau Enter. Bây giờ, với định nghĩa này, nhấn <leader>asẽ thực hiện tương tự cw, nhưng bây giờ từ (trước khi thay đổi) sẽ nằm trong "đăng ký tìm kiếm cuối cùng" của bạn (nghĩa là /đăng ký), vì vậy hãy nhấn nsau khi bạn đã thực hiện thay đổi và trả lại đến chế độ bình thường sẽ đưa bạn đến lần xuất hiện tiếp theo. Tương tự như vậy, nhấn Nsẽ đưa bạn đến lần xuất hiện trước.

Phím tắt Tất nhiên bạn có thể chọn một phím tắt khác <leader>a, nhưng tôi chỉ thấy rằng đây là một phím tắt rất dễ tiếp cận. Cá nhân tôi đã cài đặt <leader>để ,tôi chỉ cần nhấn ,theo sau a, nhưng điều này là do tôi không sử dụng bàn phím kiểu Mỹ, do đó tôi \bị ẩn đi phần nào (tôi tin \là mặc định <leader>).

Giải thích Ý tưởng thực sự đơn giản. Yank từ dưới con trỏ đến thanh ghi tìm kiếm /và sau đó làm cw. Vì vậy, đó nmap <leader>a "/yciwlà những gì tôi đã nhắm đến, nhưng thật không may, tôi không nghĩ rằng bạn có thể kéo thanh ghi tìm kiếm, vì vậy cách giải quyết là kéo từ dưới con trỏ đến thanh 1ghi, sau đó đặt thanh /ghi bằng với điều đó, rồi làm cw. Vì vậy, "1yiwlà phần mà yanks từ bên trong dưới con trỏ đến thanh ghi 1. Nếu bạn không biết về các từ bên trong, bạn có thể kiểm tra :help iw. Sau đó, :let @/=@1tiếp theo là một Enterbản ghi các nội dung của thanh 1ghi vào /. Tại thời điểm này nNhoạt động như lần xuất hiện tiếp theo và trước đó của từ bên dưới con trỏ, và sau đó a ciwđược thực hiện sao cho từ bên dưới con trỏ bị xóa và Vim được đưa vào chế độ chèn.

từ so với từ bên trong Tôi chỉ nhận ra rằng tôi giả định rằng bạn muốn toàn bộ từ bên dưới con trỏ, và không chỉ từ quan điểm của người nguyền rủa. Đây là lý do tại sao tôi sử dụng iwthay vì wở khắp mọi nơi. Nếu đây không phải là trường hợp, thì bạn nên sử dụng

nmap <leader>a "1yw:let @/=@1^Mcw

thay thế. Nếu con trỏ nằm trên chữ cái đầu tiên của từ, không có sự khác biệt.

từ chối trách nhiệm giải pháp này có thể sẽ không hoạt động tốt nếu bạn cố gắng sử dụng nó trên một cái gì đó có chứa những thứ khác với chữ cái, ví dụ bằng cách đứng con trỏ trên \hoặc bằng cách thay thế iwbằng iW, ib, ishoặc iphoặc một cái gì đó (mặc dù tôi không biết lý do tại sao bạn sẽ muốn tính năng này với toàn bộ câ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.