2011-09-06 24 views
41

Tôi sử dụng VIM khá thường xuyên nhưng tôi không bao giờ sử dụng lệnh dấu chấm (.) Để lặp lại hành động trước đó. Tôi tiếp tục đọc về nó tuyệt vời như thế nào nhưng tôi không bao giờ thấy bất kỳ ví dụ thế giới thực nào có ý nghĩa với tôi và cách tôi viết mã trong VIM. Một số ví dụ thế giới thực cho thấy lệnh dấu chấm (.) Tuyệt vời như thế nào?Ai đó có thể giải thích cho tôi tại sao lệnh dấu chấm (.) Hữu ích trong VIM?

+1

Tôi đã sử dụng vi từ trước khi vim tồn tại và đã sử dụng. lệnh khá một chút, nhưng tôi chưa bao giờ nghe ai nói về nó thật tuyệt vời. Có lẽ tôi không đọc các trang fan hâm mộ phù hợp. –

+2

Gần đây tôi đã bắt đầu đọc 'Thực hành Vim bởi Drew Neil'. Cuốn sách bắt đầu với khái niệm về. nhà điều hành, và cố gắng làm cho bạn hiểu lý do tại sao suy nghĩ ito nó có thể có lợi cho năng suất của bạn. Có thể có một cái nhìn. – eugenevd

Trả lời

31

Dưới đây là một số hành động mà tôi thực hiện với lệnh dấu chấm:

  • Đơn giản hơn :%s/\<word\>/replacement/gc* trên từ, sau đó cereplacement<esc> và sau đó lặp lại n.. Điều này là tốt đẹp nếu bạn có hai hoặc ba lần xuất hiện từ của bạn.Nếu bạn có một vài từ mà bạn muốn thay thế, sau đó đi đến từ tiếp theo, nhấn * và một lần nữa n.
  • Khi tôi muốn trái sắp xếp một số khối: <Ctrl-V>jjj<..... hoặc chèn khoảng trống ở phía trước: <ctrl-v>jjjI<space><esc>....
  • sau dd hoặc dw, chấm lệnh sẽ xóa một dòng/chữ

một điều kỳ diệu đó xảy ra với dấu chấm lệnh là nếu nó lặp đi lặp lại một lệnh sử dụng một thanh ghi số, nó sẽ sử dụng sổ đăng ký đánh số tiếp theo (xem :help redo-register).

Giải thích: Nếu bạn đã thực hiện dd trên 9 dòng và muốn khôi phục chúng theo thứ tự mà bạn đã xóa chúng, hãy thực hiện: "1P......... Lưu ý rằng các thanh ghi từ 1 đến 9 là vòng xóa của Vim. "1P sẽ chèn trước con trỏ văn bản đã xóa cuối cùng, "2P sau đó sẽ chèn văn bản đã xóa trước đó đến cuối cùng, v.v.

+0

cảm ơn hai điều này là khá tốt. – rhinoinrepose

+1

Ooh, tôi đã tìm kiếm một cái gì đó như thế này để tăng tốc độ tìm kiếm và thay thế. Vì vậy, nhiều lần tôi đã tìm thấy một cái gì đó và sau đó muốn thay đổi nó và những người khác thích nó một cách nhanh chóng. Cảm ơn vì điều đó. –

11

Tôi sử dụng dw.... khá thường xuyên để xóa một loạt các từ mà không cần đếm chúng trước tiên. Trong ví dụ đó, 5dw có ít ký tự hơn, nhưng tôi nghĩ rằng tôi nhanh hơn khoảng 3ms khi sử dụng lệnh dấu chấm để chỉ lặp lại số delete word khi tính chúng.

Chỉnh sửa Tôi vừa thực hiện một số chỉnh sửa và nhận ra có một tình huống khác mà tôi sử dụng lệnh dấu chấm một số tiền hợp lý. Tôi sẽ tưởng tượng có một cách đơn giản hơn nhiều để xử lý loại điều này trong Vim, nhưng lệnh dấu chấm giúp với các tình huống sau đây và tương tự. Sau đây là một ví dụ về "Tôi đã làm một cái gì đó một lần, bây giờ tôi muốn lặp lại nó một vài lần nữa." Tôi đã viết một bài kiểm tra mới (trong C) và cần phải nhúng vào nó một chuỗi liên tục đại diện cho một kịch bản SQL mà tôi đã sao chép từ một nơi khác. Tập lệnh đa dòng nguyên bản (7 dòng) không được đính kèm trong dấu ngoặc kép, vì vậy tôi đã làm điều này:

  • Dán tập lệnh trực tiếp vào mã (7 dòng mới trong tệp).
  • Định vị con trỏ trên dòng mới đầu tiên.
  • tôigiangiangiangian"esc để chèn không gian và một trích dẫn mở trên dòng hiện tại.
  • j. sáu lần để thêm khai mạc báo giá cho mỗi dòng bổ sung
  • Vị trí lại cho dòng đầu tiên của văn bản được dán.
  • Một\n"esc để đặt một nhân vật thức ăn đường và quote đóng trên dòng hiện tại.
  • j. sáu lần một lần nữa để đưa các báo đóng cửa trên các dòng còn lại
+3

Ví dụ cuối cùng của bạn có thể dễ dàng hơn với Visual Block: Chuyển đến đầu tập lệnh. Sử dụng 'Ctrl-v' hoặc' Ctrl-q' để gọi khối chọn. Nhấn '6j' để di chuyển xuống dòng cuối cùng. Nhấn '$' để chọn đến cuối dòng. Gõ 'I" 'để đặt dấu ngoặc kép. Nhấn' gv' để chọn lại khối của bạn. Gõ 'A \ n" 'để đóng dấu ngoặc kép. – idbrii

+0

@pydave: Thật tuyệt. Tôi nghĩ có lẽ là một cách nhanh hơn. Tôi đang sử dụng SlickEdit với mô phỏng vim, và rằng trick không làm việc cho tôi (nhưng nó có thể là bởi vì tôi đang sử dụng một phiên bản cũ). Có một vài vấn đề với mô phỏng vim mà tôi không thích, nhưng chức năng gắn thẻ trong SlickEdit thực sự tốt và làm cho một vài câu hỏi đáng giá. –

+2

cách khác: ':, + 6s /.*/" & \\ n "' hoặc 'V6j: s /.*/" & \\ n "' ('&' trong phần thay thế được thay thế bằng mẫu phù hợp). – Benoit

2

Giống như các poster trước đó, tôi thường sử dụng nó khi xóa:

  • dw...
  • dd...

Và khi lặp đi lặp lại một hành động trên nhiều dòng:

  • iSomeText:[Esc]j.j.j.
+0

Giống như ví dụ cổ điển. Nhưng tại sao không chỉ làm 'yy' và 'p' một loạt các lần? – rhinoinrepose

+0

Vâng, điều đó không hiệu quả đối với các lệnh sử dụng nhiều lần nhấn phím, chẳng hạn như 'iSomeText [Esc]' hoặc 'cereplacement [Esc]' (từ câu trả lời khác). Trong trường hợp 'p', bạn nói đúng, chỉ cần lặp lại' p'. – paulmelnikow

+0

Ví dụ cuối cùng của bạn, đôi khi bạn có thể sử dụng lựa chọn khối để chọn một cột cho một vài dòng và sử dụng I hoặc A. Giống như 'Ctrl + vjjjISomeTextEsc'. Sử dụng tuyệt vời của dấu chấm mặc dù. –

5
do_something(); 
do_another(); 
third_option(); 

Bây giờ, với con trỏ ở dòng đầu tiên: A<bs><cr>{<cr><cr>}<cr>. Bây giờ nhấn j.j.

do_something() 
{ 

} 

do_another() 
{ 

} 

third_option() 
{ 

} 
3

ví dụ phổ biến nhất của tôi đang thay đổi mức thụt lề của văn bản

>%... 

hoặc chỉ tái làm một sự thay đổi văn bản cụ thể như chèn (char *) trước nhiều biến:

i(char *)<Esc>jjjwwww.jjjbb. 

(hoặc bất kỳ thứ gì)

3

Tất cả câu trả lời khác cung cấp các ví dụ tốt, tôi chỉ muốn thêm rằng dot là rất tốt bởi vì theo cách nó là một macro tự động cho tổ hợp phím cuối cùng của bạn mà chỉ là một chìa khóa đi.

Trong khi macro là tuyệt vời, chúng hơi cồng kềnh để sử dụng, trong khi dot luôn có sẵn, ngay cả khi ít mạnh hơn.

3

Đối với tôi, lệnh chấm đã được nhấn hoặc bỏ lỡ lúc đầu cho đến khi tôi bắt đầu ghi macro bằng bất kỳ tần số nào. Bí quyết để ghi lại các macro hữu ích là biểu diễn vấn đề như các bước lặp lại. Đôi khi dấu chấm là điều duy nhất sẽ làm hoặc ít nhất là làm cho vấn đề dễ dàng hơn nhiều.

Ngoài ra, việc sử dụng lệnh dấu chấm sẽ buộc bạn phải sử dụng một số lệnh nhất định mà bạn có thể không cần nhiều như trước: cw ct; ci "ca) vì chúng thu gọn xóa/thay đổi văn bản thành một" hành động "có thể lặp lại theo dấu chấm.

Ngoài ra, ngoài dấu chấm cũng có; mà tôi sử dụng ít thường xuyên hơn nhiều nhưng khi tôi thực hiện nó rất hữu ích lặp lại chuyển động văn bản cuối cùng. Không hữu ích cho những thứ như w và b nhưng đối với những thứ như f; một mẹo nhỏ của nó.

2

Khi bạn cần phải chuyển đổi này:

instance Movable Position where 
    (x,y) --> Left = (x-1,y) 
    (x,y) --> Right = (x+1,y) 
    (x,y) --> Up = (x,y-1) 
    (x,y) --> Down = (x,y+1) 

vào đây:

instance Movable Position where 
    Position(x,y) --> Left = Position(x-1,y) 
    Position(x,y) --> Right = Position(x+1,y) 
    Position(x,y) --> Up = Position(x,y-1) 
    Position(x,y) --> Down = Position(x,y+1) 

bạn muốn sử dụng lựa chọn khối trực quan cho các trái 'Chức vụ' và một dấu chấm cho bên phải.

Các vấn đề liên quan