Vim yanking nhiều dòng


83

Tôi là nhà phát triển C # vừa mới quyết định mở rộng kiến ​​thức về các công cụ có sẵn cho tôi. Công cụ đầu tiên tôi quyết định học là Vi / Vim. Mọi thứ vẫn diễn ra tốt đẹp cho đến nay, nhưng có một vài câu hỏi mà tôi dường như không thể tìm ra câu trả lời:

  1. Giả sử tôi muốn kéo một loạt các dòng. Tôi biết có nhiều cách để làm như vậy, nhưng tôi muốn làm theo số dòng. Tôi đã nghĩ rằng nó sẽ tương tự như cách các lệnh thay thế hoạt động, giống như vậy 81,91y. Có cách nào để làm việc này không?

  2. Tôi hơi bối rối về glệnh ở chế độ bình thường. Nó dường như thực hiện vô số thứ và tôi thực sự không thể xác định được lệnh g làm gì ở cốt lõi của nó. Tôi bối rối không biết đó là lệnh chuyển động hay một loại "bắt tất cả" cho các lệnh khác chạy qua chế độ bình thường. Ai đó có thể vui lòng giải thích điều này hoặc chỉ cho tôi một tài liệu tham khảo có giải thích tốt về glệnh không?


1
Bạn có biết về lệnh ": help" trong vim (1) không?
Steve Emmerson

Có, nhưng tôi không thể tìm thấy nó trong tất cả các tài liệu tham khảo. Hóa ra tôi đã nghĩ rằng tôi sẽ làm điều đó từ chế độ bình thường, nhưng hometoast đã chỉ ra cách nó phải được thực hiện từ chế độ lệnh. Đối với lệnh g, tôi chỉ thấy rằng sự trợ giúp không kết nối mọi thứ lại với nhau như tôi mong đợi từ các lệnh khác.
jnadro52

3
Ngoài ra, tôi có thể bạn muốn tạo một bài cho mỗi câu hỏi.
Dana

1
Tôi sẽ làm như vậy trong tương lai. Tôi quan tâm hơn đến câu hỏi đầu tiên, tôi chỉ nghĩ đến câu kia khi tôi đang gõ câu đầu tiên.
jnadro52

Câu trả lời:


139

Yank dòng 81-91

:81,91y<enter>

Nếu ngón tay của bạn không muốn tìm phím :,, điều này cũng sẽ hoạt động (chuyển đến dòng 81, kéo 11 dòng)

81gg11yy 

Công dụng duy nhất của tôi g5gg. Để đi đến dòng thứ 5. 22gg: Dòng thứ 22. Như jimbo đã nói, nó thực sự chỉ là công cụ sửa đổi cho một số lệnh khác.

Để hoàn thiện, ( http://vim.wikia.com/wiki/Power_of_g ) giải thích rất nhiều cách ghoạt động trong chế độ lệnh.


2
Sử dụng chữ in hoa cũng cung cấp các biến thể: ggsẽ đi đến dòng đầu tiên, trong khi Gsẽ đi đến dòng cuối cùng. Ngoài ra, 5Gchuyển đến dòng 5. Dấu có thể được sử dụng thay cho số dòng (tốt cho macro), tức là: :'a,52y
NVRAM

1
Nếu bạn không sợ phím Shift, 81G11Ythậm chí còn "ngắn" hơn.
Jens

1
Nhược điểm của phương pháp chế độ bình thường là bạn mất "chỗ đứng" của mình; bạn có thể hình dung mxtrước và 'xsau nhưng sau đó phiên bản chế độ lệnh trở nên cô đọng hơn rất nhiều. Humm ... ngay sau khi tôi viết điều này mà tôi đã thấy câu trả lời từ @Asta.
Eric Smith

1
@WilliamRoss điều này thực sự đặt các dòng trong một bộ đệm để sử dụng trong vim, không nhất thiết phải nằm trong Clipboard hệ thống của bạn, nơi bạn có thể dán vào Notepad bằng CTRL + V. Xem câu hỏi liên quan: Làm thế nào để sao chép / dán văn bản từ vi cho các ứng dụng khác nhau
hometoast

1
Điều này khiến tôi thích thú vì toàn bộ lý do tôi tìm kiếm giải pháp đầu tiên là để tránh đếm dòng hoặc thực hiện một phép trừ trong đầu.
Paul Parker

22

Bạn cũng có thể sao chép các dòng hiện tại vào vị trí con trỏ hiện tại của mình bằng cách sử dụng 't'.

:81,91t.<enter>

Thao tác này sẽ dán các dòng 81-91 dưới dòng con trỏ đang bật.

Tôi học được điều này từ http://vimcasts.org , đây là một tài nguyên tuyệt vời trên VIM.


Ý t.nghĩa ở đây là gì?
CivFan

2
Từ sự hiểu biết của tôi tcó thể được coi là tbệnh hoặc to và .là địa chỉ của dòng hiện tại.
Asta

1
@CivFan nó là một từ đồng nghĩa với:copy
D. Ben Knoble

11

Tôi cũng thích sử dụng tùy chọn số dòng tương đối của vim có nghĩa là tôi có thể chỉ cần nhập:

:-10,-7ya a

để kéo văn bản vào vùng đệm có tên a.

NB Chỉ định A sẽ nối những gì bạn đang kéo vào nội dung hiện tại của bộ đệm a.

Đừng quên rằng bạn cũng có thể sao chép các khối văn bản và di chuyển các khối văn bản xung quanh bằng các lệnh tương tự:

:-10,-7co .

có nghĩa là sao chép bốn dòng văn bản 10 dòng ở trên xuống dưới dòng hiện tại và

:-10,-7mo .

nghĩa là chuyển bốn dòng văn bản 10 dòng trên xuống dưới dòng hiện tại.


8

Các Glệnh đi đến một số dòng nhất định, nếu nó kèm theo một giá trị đếm. 81Gđưa bạn vào dòng 81.

Các ylệnh có thể được kết hợp với một phong trào, giống như G. Vì vậy, để kéo mọi thứ cho đến dòng 91, bạn có thể sử dụng y91G.

Cùng nhau bạn nhận được:

81Gy91G

Đi đến dòng 81, sau đó kéo mạnh trong khi đi đến dòng 91.


1
Tôi ước tôi có thể ủng hộ điều này nhiều hơn một lần. Cái gì đó đã giúp tôi đã sử dụng điều này để yank đến một thanh ghi (trong trường hợp của tôi, đăng ký + ie, clipboard):81G"+y91G
mgarey

1
@mgarey không có cách nào để kéo trực tiếp vào thanh ghi bằng cú pháp phạm vi dòng? 81,91yvà bằng cách nào đó nhắm mục tiêu đăng ký?
diplosaurus

1
@diplosaurus Có thể, nhưng tôi không biết. Đó có vẻ giống như một câu hỏi bạn có thể hỏi trên vi.stackexchange.com, nếu nó chưa có ở đó hoặc ở đây trên SO. Tôi muốn quan tâm. Tôi không phải là chuyên gia Vim.
mgarey

2
@mgarey Phải sáng tạo với tìm kiếm google nhưng tôi đã tìm thấy nó ở đây: stackoverflow.com/questions/16225366/… . :81,91y +
diplosaurus

@diplosaurus :81,91y +không hoạt động. Nó hoạt động cho các thanh ghi khác như :81,91y aví dụ nhưng dường như không thích thanh +ghi. Điều này có chắc chắn làm việc cho những người khác?
ojunk

4

gkhông tự làm bất cứ điều gì. Đó là một trong một vài lệnh meta chứa một loạt các lệnh không liên quan đến sắp xếp.

z là một lệnh khác như vậy.


Cảm ơn bạn. Bây giờ tôi hiểu rằng nó chỉ được sử dụng cho các mục đích khác nhau. Khi tôi cố gắng học những công cụ này, tôi cố gắng liên kết các lệnh với một cái gì đó mà tôi có thể trừu tượng hóa để tôi nhớ cách sử dụng nó đúng cách. Có vẻ như lệnh g chỉ là một trong những thứ mà bạn cần ghi nhớ để sử dụng đúng cách.
jnadro52

2

Vim's :help indexmô tả glà:

|g|             g{char}            extended commands, see |g| below

Cuộn xuống (hoặc :help g) để xem danh sách.


1
Tôi đã quen với: help nhưng tôi KHÔNG quen với: help (lệnh). Điều đó sẽ rất hữu ích trong tương lai. Xin trân trọng cảm ơn.
jnadro52

2

Giải pháp tốt nhất là vào "chế độ trực quan", bằng cách nhấn v. Và sau khi chọn các dòng chỉ cần sao chép chúng bằng cách nhấn y. Sau đó, dán các dòng đã sao chép bằng cách nhấn p.


Không đồng ý, nhưng chỉ có chế độ hình ảnh bc đôi khi rất chậm.
D. Ben Knoble

1

Ngoài các :91,96y ayan ( y) dòng 91 đến 96 vào thanh ghi a, (dán với "ap), các dòng đã kéo có thể được nối vào thanh ghi với:

:91,96y A

Tức là viết hoa của thanh Aghi gây ra một hoạt động nối vào thanh ghi athay vì ghi đè. Viết hoa của sổ đăng ký luôn hoạt động như thế này, ví dụ: :let @A=';'thêm một ;để đăng ký a.

Sử dụng các dòng tham chiếu dấu cộng (+) hoặc dấu trừ (-) liên quan đến vị trí con trỏ hiện tại:

:-10,+10y b

Tức là nó sẽ kéo ( y) 21 dòng xung quanh vị trí con trỏ hiện tại và đưa chúng vào thanh ghi b.

Sự vắng mặt của đầu vào cũng đại diện cho vị trí con trỏ hiện tại, điều này có nghĩa là:

:-5,y a

sẽ kéo văn bản từ 5 dòng ở trên đến vị trí con trỏ hiện tại vào vùng đệm được đặt tên avà:

:,+5y a

sẽ kéo 5 dòng sau vị trí con trỏ hiện tại vào bộ đệm a.

Lưu ý: Nếu bạn có macro trong bộ đệm, anó chỉ bị ghi đè bởi yank trước đó, vì thanh ghi yank và thanh ghi macro thực sự giống nhau. Đó là lý do tại sao, ngẫu nhiên, bạn có thể dán một macro, chỉnh sửa nó và sau đó kéo nó trở lại thanh ghi của nó. Cá nhân tôi sử dụng các chữ cái bằng tay trái của tôi cho các phím, và các chữ cái bằng tay phải của tôi cho các macro.

Di chuyển các khối văn bản xung quanh, trông giống như sau:

:+10,+13m.

có nghĩa là di chuyển bốn dòng có vị trí 10 dòng trước con trỏ hiện tại, xuống dưới dòng hiện tại.

Phụ lục

Tôi trước đây bị nhầm lẫn yatrong :91,95ya alà bằng cách nào đó đồng nghĩa với ya{motion}nơi mà các chuyển động được cung cấp bởi 91,95. Điều này không chính xác và "a" trong yalà hoàn toàn không cần thiết. Để bảo vệ tôi, tôi help yankkhông truyền đạt rằng đó yalà một bí danh có thể có yank.


1
:yalà viết tắt của :yank, vì vậy tôi không chắc mình cảm thấy thế nào về yanks tất cả các dòng . Nhưng công việc tốt ngưng tụ một số thông tin rải rác
D. Ben Knoble

Tôi cũng nghĩ như vậy, cho đến khi tôi nhìn vào :help yank. Không có bí danh yacho yank. Mặc dù vậy, bạn đúng, akhông viết tắt cho "tất cả", về mặt kỹ thuật, nó là viết tắt của "a". Tôi vẫn thích nói "tất cả" hơn, vì nó có ý nghĩa hơn đối với tôi.
Paul Parker,

2
:[range]y[ank] [x] Yank [range] lines [into register x]dấu ngoặc vuông y[ank]cho biết rằng [ank]tùy chọn. :y, :ya:yanđang ngầm bí danh cho:yank
D. Ben Knoble

Tôi đứng sửa lại :) Các a là không cần thiết. Sẽ chỉnh sửa câu trả lời để phản ánh.
Paul Parker

1
Phụ lục của bạn là tốt đẹp, nhưng tôi đã đề cập đến dòng đầu tiên của bạn, nơi bạn sử dụng lệnh cũ :yavà không phải là lệnh bình thườngy
D. Ben Knoble

0

Trong một thời gian dài người dùng Vi / Vim, tôi có xu hướng sử dụng 'dấu' thay vì số dòng (hoặc 'dấu dòng'). Nó hoạt động như thế này: mlà ký tự 'mark'; sau đó sử dụng bất kỳ chữ cái nào để xác định / đặt tên cho nhãn hiệu. Để quay lại một dấu, hãy đặt tên cho dấu đã đặt tên bằng một 'adấu ngoặc kép ( ) Các dấu này có thể được sử dụng làm phạm vi. Ví dụ:

File:
    <line 1>
    <line 2>
    <line 3>
    <line 4>
    <line 5>

Khi ở chế độ lệnh, hãy di chuyển con trỏ đến dòng 2, nhập ma. di chuyển đến dòng 4, nhập mb. Để kéo từ dấu a đến dấu b, gõ:

    :'a,'byank

Để xóa từ đánh dấu a đến đánh dấu b, gõ:

    :'a,'bdel

Để tìm kiếm từ dấu a đến dấu b và thay thế 'ine' bằng 'ink':

    :'a,'bs/ine/ink/g

Để sao chép từ đánh dấu a đến dấu b và dán bên dưới vị trí hiện tại ('dấu chấm' luôn tham chiếu đến dòng nơi con trỏ hiện đang được định vị):

    :'a,'bco . 

Dịch chuyển các dòng mã, giữa dấu a đến dấu b , một tab sang bên phải (sử dụng chữ cái đối diện <, để di chuyển sang trái):

    :'a,'b> 

Trong chế độ lệnh, bạn có thể di chuyển trở lại các dấu bằng cách chỉ cần gõ 'ađể di chuyển trở lại dòng được đánh dấu a. Đánh máy'' sẽ di chuyển bạn trở lại vị trí cũ (tiếc là chỉ nhớ vị trí trước đó, không phải hai trở lại).

Bạn có thể kéo đến các vùng đệm đã đặt tên, sao chép, xóa các dòng, chỉ tìm kiếm và thay thế các phần mã của mình, v.v. mà không cần biết số dòng.


0

Để kéo các dòng từ dòng số 81 đến số 91:

cách tiếp cận 1: 81gg11yy

không tệ nhưng bạn phải làm một chút phép toán để tìm ra bao nhiêu dòng để giật

cách tiếp cận 2: 81ggsau shift+vđó 91ggsau đóy

TỐT NHẤT TRONG Ý KIẾN CỦA TÔI bởi vì điều này là thẳng về phía trước, bạn chỉ phải biết một điều hiển nhiên, tức là từ số dòng nào đến số dòng nào bạn muốn kéo

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.