Thay thế . với -> ở những nơi cụ thể


7

Đôi khi tôi cần thay thế .bằng ->khi sửa mã.

Thông thường không thể sử dụng tìm kiếm và thay thế bởi vì sẽ có nhiều (hàng trăm) dấu chấm ( .) và chỉ một vài trong số chúng phải được thay đổi.

Tuy nhiên, tôi tìm thấy những cái cần phải thay đổi khi tôi trải qua một thay đổi .

Sử dụng toán tử lặp lại không hoàn toàn hoạt động bởi vì nếu tôi thay đổi một thể hiện và sau đó lặp lại với lệnh dot, thì tôi nhận được điều này:

structBlah->.memberBlah

Nếu sau đó tôi sử dụng xđể xóa dấu chấm không liên quan, thì dán và chấm không còn hoạt động vì thay đổi cuối cùng là xóa.

Vì vậy, về cơ bản, vấn đề là toán tử lặp lại lặp lại một chuyển động và chỉnh sửa, trong khi ở đây chúng ta cần lặp lại hai chỉnh sửa: xóa và chèn.

Có cách nào thuận tiện để làm điều này? Một ý tưởng tôi có thể là sử dụng một macro như thế này:

xi-><ESC>

Những lệnh nào bạn đang sử dụng để thực hiện thay đổi đầu tiên? Lần thử đầu tiên ngây thơ của tôi, các lệnh a<BS>-><Esc>(tương tự i<Del>-><Esc>) hoàn toàn có thể lặp lại đối với tôi.
Random832

Sử dụng sthay vì ixóa một ký tự và chuyển sang chế độ chèn.
Shahbaz

Câu trả lời:


8

Lệnh cw (đổi từ) sẽ giải quyết vấn đề của bạn.

Đặt con trỏ của bạn vào khoảng thời gian và loại cw-><Escape>

một cái gì đó

trở thành

cái gì đó-> cái gì đó

.toán tử vẫn sẽ hoạt động, bởi vì cw là một thao tác thực hiện cả xóa và thay thế.


1
Tôi chưa bao giờ nghĩ đến việc sử dụng từ thay đổi trên một ký tự. Điều đó làm cho ý nghĩa hoàn hảo. Tôi không biết rằng một khoảng thời gian được coi là một "từ". Có lệnh "thay đổi ký tự" (xóa ký tự và vào chế độ nhập) không?
Tyler Durden

1
@Tyler Durden Thay đổi thực sự là một lệnh có thể được theo sau bởi bất kỳ chuyển động nào, giống như lệnh xóa (d). Vì vậy, bạn có thể gõ cl để thay đổi ký tự sang trái, c2l để thay đổi 2 ký tự, c $ để thay đổi đến cuối dòng, ct; để thay đổi thành dấu chấm phẩy, v.v ...
DoYouEvenCodeBro 7/07/2016

8
Sử dụng cw cho một ký tự là quá nhiều gõ. Chỉ cần sử dụng s.
Kevin

1
@Tyler Durden Haha, bạn đã thử giải pháp của tôi chưa? Nó làm điều tương tự với ít nét chính. Thay thế scho cwvà bạn có nó.
Tumbler41

11

Bạn có thể sử dụng stoán tử, xóa ký tự dưới con trỏ và đưa bạn vào chế độ chèn. Sau đó, bạn có thể nhập thay thế và sử dụng sau này .để lặp lại toàn bộ thay thế. Quy trình làm việc trở thành:

  1. /\. để làm nổi bật tất cả các thời kỳ.
  2. n đến dấu chấm đầu tiên
  3. s->và sau đó Esc. Điều này sẽ thay thế dấu chấm và chèn văn bản với một thao tác duy nhất.
  4. n đến dấu chấm tiếp theo
  5. . để thay đổi khi cần thiết.

:h s để biết thêm.


Như tôi đã nói trong câu hỏi của mình, điều này không thực tế vì có hàng trăm dấu chấm và chỉ một vài nơi cụ thể mà việc thay thế cần phải được thực hiện.
Tyler Durden

3
Ok, tại thời điểm đó, vấn đề của bạn trở thành vấn đề lọc, đó không phải là điều bạn yêu cầu. Tôi đã cố gắng trả lời câu hỏi của bạn về hai chỉnh sửa. Bây giờ nó có thể được thực hiện trong một. Tôi khuyên bạn nên sửa câu hỏi của bạn nếu vấn đề là thực sự tìm kiếm dấu chấm để thay thế,
Tumbler41

1
Tôi đặc biệt nói trong câu hỏi của tôi "... không thể sử dụng tìm kiếm và thay thế bởi vì sẽ có nhiều (hàng trăm) dấu chấm (.) Và chỉ một vài trong số chúng phải được thay đổi" . Danh sách thay đổi đang được sử dụng để tìm các trường hợp phải thực hiện thay đổi, như trong câu hỏi của tôi.
Tyler Durden

1
Sau đó thực hiện thay đổi một lần với sgiải pháp được đề xuất ở trên và bạn có thể sử dụng nó cho mục tiếp theo trong danh sách thay đổi của mình.
nobe4

2
@TylerDurden Đây không phải là tìm kiếm và thay thế; @ tumbler41 đề xuất sử dụng tìm kiếm và nđể giúp tìm thấy chúng, nhưng tối ưu hóa chính ở đây là sử dụng s->Esc. Bốn tổ hợp phím đó tạo ra sự thay đổi văn bản bạn cần và bạn có thể sử dụng .để lặp lại hành động đó bất cứ nơi nào bạn muốn.
Desty

7

Tôi khuyên bạn nên sử dụng lệnh thay thế:

:%s/\./->/gc

Điều này sẽ:

:%s     substitute over all lines
/\.     match dot
/->     replace by arrow
/g      replace all on lines
c       ask for confirmation

Điều này sẽ đi qua tất cả .các tập tin của bạn và hỏi mỗi lần nếu bạn muốn thay thế.

Nhấn yđể thay thế, nđể đi đến dấu chấm tiếp theo.

xem :h :s_ccho tất cả các tùy chọn.


1
Như tôi đã nói, điều này không thực tế vì có hàng trăm dấu chấm và chỉ một vài nơi cụ thể mà việc thay thế cần phải được thực hiện.
Tyler Durden

1
Bạn có thể thay thế :%bằng :g/.../chỉ thay thế trên các dòng phù hợp, bằng :'<,'>các dòng hiện được chọn hoặc bằng :.hoặc :cho dòng hiện tại và sử dụng @:để lặp lại lệnh trên các dòng cụ thể mà bạn điều hướng theo một cách khác.
deltab 7/07/2016

7

Nếu bạn không muốn sử dụng lệnh thay thế hoặc lệnh chấm như được đề xuất bởi các câu trả lời khác, thì cách tốt nhất của bạn có lẽ là tạo một macro mà bạn có thể sử dụng khi con trỏ của bạn nằm cạnh dấu chấm.

Bạn có thể ghi lại macro

qaf.vc->^[q

Mà sẽ đi đến dấu chấm sau trên dòng ( f.) trực quan chọn nó ( v) và thay thế nó ( c->).

Bây giờ khi bạn điều hướng mã của mình và bạn phát hiện ra một dấu chấm cần thay đổi, bạn có thể gọi macro bằng @a.

Bạn thậm chí có thể đặt nó vào trong .vimrcđể giữ macro giữa các phiên mã hóa khác nhau:

let @a="f.vc->^["

Chỉnh sửa @grochmal đề xuất trong các nhận xét để sử dụng đăng ký thứ hai để có macro di chuyển ngược có vẻ khá hữu ích:

let @e="F.vc->^["

Đây là những gì tôi sẽ làm. Sự khác biệt duy nhất là tôi sẽ sử dụng hai thanh ghi let @q="F.vc->^["let @w="f.vc->^["", và có một dấu chấm trước và một dấu chấm tiếp theo .
hóa học

@grochmal: Tôi đã không nghĩ về điều này nhưng điều này thật thông minh :-)
statox

Bạn không cần một <ESC>trước khi qtrong macro? (Tôi không có quyền truy cập vào máy tính, vì vậy tôi đã không kiểm tra nó).
Loovjo

@loovjo: bạn nói đúng, tôi sẽ chỉnh sửa nó, cảm ơn!
statox
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.