Làm cách nào để sử dụng thanh ghi vim?


925

Tôi chỉ biết một trường hợp sử dụng các thanh ghi là thông qua CtrlR*đó tôi dán văn bản từ một bảng tạm.

Công dụng khác của thanh ghi là gì? Làm thế nào để sử dụng chúng?

Mọi thứ bạn biết về các thanh ghi VI (hãy tập trung vào vi 7.2) - chia sẻ với chúng tôi.


22
Tôi đã đưa ra một câu trả lời dài ở đó về việc sử dụng các thanh ghi
Benoit

Câu trả lời:


1185

Các thanh ghi trong Vim cho phép bạn chạy các hành động hoặc lệnh trên văn bản được lưu trữ bên trong chúng. Để truy cập vào một thanh ghi, bạn gõ "atrước một lệnh, atên của thanh ghi. Nếu bạn muốn sao chép dòng hiện tại vào đăng ký k, bạn có thể nhập

"kyy

Hoặc bạn có thể nối vào một đăng ký bằng cách sử dụng chữ in hoa

"Kyy

Sau đó, bạn có thể di chuyển qua tài liệu và dán nó vào nơi khác bằng cách sử dụng

"kp

Để dán từ bảng tạm hệ thống trên Linux

"+p

Để dán từ bảng tạm hệ thống trên Windows (hoặc từ bảng tạm "chuột nổi bật" trên Linux)

"*p

Để truy cập tất cả các loại thanh ghi được xác định hiện tại

:reg

165
"+là một thanh ghi đặc biệt đề cập đến clipboard hệ thống.
Aaron McDaid

17
Trong Windows, Clipboard có thể được truy cập bằng "*; vì vậy lệnh sao chép cho đến hết tập tin trở thành "*yG.
MP Aditya

44
Trong X (Linux, cũng có thể là OS-X), *là bảng tạm "làm nổi bật chuột" và +là bảng tạm Ctrl-XCV.
dotancohen

20
Có cách nào để nối vào thanh ghi clipboard (vì không có vốn +) không?
naitsirhc

8
@dotancohen Về mặt kỹ thuật, nó được gọi là lựa chọn CHÍNH, nhưng tôi đoán "chuột higlight" sẽ dễ dàng hơn cho mọi người :)
kyrias

783

Tôi hài lòng khi phát hiện ra 0đăng ký. Nếu bạn kéo văn bản mà không gán nó vào một thanh ghi cụ thể, thì nó sẽ được gán cho thanh 0ghi đó, cũng như được lưu trong "thanh ghi mặc định . Sự khác biệt giữa 0"thanh ghi là 0chỉ được phổ biến với văn bản kéo mạnh, trong khi đăng ký mặc định cũng là dân cư với văn bản bị xóa sử dụng d/ D/ x/ X/ c/ C/ s/ Slệnh.

Tôi thấy điều này hữu ích khi tôi muốn sao chép một số văn bản, xóa một cái gì đó và thay thế nó bằng văn bản được sao chép. Các bước sau minh họa một ví dụ:

  • Yank văn bản bạn muốn sao chép y[motion]- văn bản này được lưu trong "0đăng ký
  • Xóa văn bản bạn muốn thay thế bằng d[motion]- văn bản này được lưu trong "đăng ký
  • Dán văn bản kéo dài với "0p

trong đó "là lệnh để sử dụng một thanh ghi cho lệnh tiếp theo.

Ở bước cuối cùng, nếu bạn đã dán từ thanh ghi mặc định (với p), nó sẽ sử dụng văn bản mà bạn vừa xóa (có thể không phải là những gì bạn dự định).

Lưu ý rằng phoặc Pdán từ thanh ghi mặc định. Tương đương tay dài sẽ là ""p(hoặc ""P) và "0giữ lần cuối, "1giữ lần xóa hoặc thay đổi cuối cùng.

Để biết thêm thông tin xem :help registers.


17
phoặc Pdán từ thanh ghi mặc định. Tương đương tay dài sẽ là ""p(hoặc ""P).
nelstrom

186
Nhân tiện, cùng một cách "0 giữ lần cuối cùng", 1 giữ lần xóa hoặc thay đổi cuối cùng.
FireAp4

6
"là lệnh sử dụng một thanh ghi cho lệnh tiếp theo. Vì vậy, ""psẽ sử dụng thanh "ghi cho lệnh dán và "0psẽ sử dụng thanh 0ghi.
Ramon Marco L. Navarro

5
0pcó nghĩa là đi đến ký tự đầu tiên của dòng hiện tại và dán từ nội dung của thanh ghi mặc định ( "). "psẽ là một lệnh không đầy đủ vì bạn cần chỉ định sử dụng lệnh nào để đăng ký p.
Ramon Marco L. Navarro

15
Cùng một cách "1 giữ lần xóa cuối cùng", 2 giữ lần xóa thứ hai cuối cùng, "3 giữ lần thứ ba cuối cùng, v.v ... cho đến" 9
James

330

Một trong những phần yêu thích của tôi về các thanh ghi là sử dụng chúng làm macro!

Giả sử bạn đang xử lý tệp giá trị được phân định bằng tab như sau:

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601

Bây giờ bạn quyết định rằng bạn cần thêm dấu phần trăm ở cuối trường% Dev (bắt đầu từ dòng thứ 2). Chúng tôi sẽ tạo một macro đơn giản trong mđăng ký (được chọn tùy ý) như sau:

  1. Nhấn :: qmĐể bắt đầu ghi macro theo mđăng ký.

  2. EE: Đi đến cuối cột thứ 3.

  3. a: Chèn chế độ để nối vào cuối cột này.

  4. %: Nhập dấu phần trăm chúng tôi muốn thêm.

  5. <ESC>: Quay trở lại chế độ lệnh.

  6. j0: Đi đến đầu dòng tiếp theo.

  7. q: Dừng ghi macro

Bây giờ chúng ta có thể chỉ cần gõ @mđể chạy macro này trên dòng hiện tại. Hơn nữa, chúng ta có thể gõ @@để lặp lại, hoặc 100@mlàm điều này 100 lần! Cuộc sống nhìn khá tốt.

Tại thời điểm này, bạn nên nói, " NHƯNG CHỜ ĐỢI, CÁI GÌ NÀY CÓ THỂ LÀM GÌ VỚI NGƯỜI ĐĂNG KÝ ?"

Điểm tuyệt vời. Hãy điều tra những gì trong nội dung của thanh mghi bằng cách gõ "mp. Sau đó chúng tôi nhận được như sau:

EEa%<ESC>j0

Lúc đầu, có vẻ như bạn vô tình mở một tệp nhị phân trong notepad, nhưng qua cái nhìn thứ hai, đó là chuỗi ký tự chính xác trong macro của chúng tôi!

Bạn là một người tò mò, vì vậy hãy làm điều gì đó thú vị và chỉnh sửa dòng văn bản này để chèn !thay vì cũ nhàm chán %.

EEa!<ESC>j0

Sau đó, hãy đưa cái này vào nsổ đăng ký bằng cách gõ B"nyE. Sau đó, chỉ với các cú đá, hãy chạy nmacro trên một dòng dữ liệu của chúng tôi bằng cách sử dụng @n....

OMG, IT THÊM !

Về cơ bản, chạy macro giống như nhấn chuỗi khóa chính xác trong thanh ghi của macro đó. Nếu đó không phải là một thủ thuật đăng ký thú vị, tôi sẽ ăn mũ của tôi.


65
Điều này là hoàn toàn chính. Tôi đã không nhận thấy cho đến bây giờ rằng các thanh ghi giống như các bộ đệm macro. Điều này có nghĩa là bạn chỉ có thể lưu trữ tất cả các macro của bạn trong văn bản, kéo chúng và chạy chúng. Khá tuyệt, và một chút kỳ lạ. Rất Vim.
ness101

1
Đó là một ghi chú biên tập nhỏ, nhưng cái mũ có in đậm ... Nó có thể đã được sửa. Nó khá đáng ghét vào lúc này.
ashrasmun

1
Bạn có thể sử dụng +thay vì j0đi đến ký tự không trống đầu tiên trên dòng tiếp theo.
Gokul

100

Các thanh ghi hữu ích khác:

"*hoặc "+- nội dung của bảng tạm hệ thống

"/ - lệnh tìm kiếm cuối cùng

": - Lệnh cuối cùng.

Lưu ý với macro vim, bạn có thể chỉnh sửa chúng, vì chúng chỉ là một danh sách các tổ hợp phím được sử dụng khi ghi macro. Vì vậy, bạn có thể ghi vào tệp văn bản macro (sử dụng "apđể viết macro a ) và chỉnh sửa chúng, và tải chúng vào một thanh ghi với "ay$. Cách tốt đẹp để lưu trữ các macro hữu ích.


6
Vim mặc định trên OSX không bao gồm tích hợp "*. Bạn có thể cài đặt phiên bản từ homebrew-alt. Kiểm tra với vim --version- -clipboardcó nghĩa là bạn không có nó, +clipboardnghĩa là bạn làm.
Xavier Shay

15
Trong X11, "*"+thậm chí còn tuyệt hơn: "+dán văn bản cuối cùng được sao chép bằng ctrl+c(bộ đệm sao chép) hoặc phím tắt nào bạn sử dụng (hoặc right-click>copy). "*dán văn bản cuối cùng được tô sáng bằng chuột (bộ đệm lựa chọn). Vì vậy, nếu bạn sao chép một cái gì đó bằng ctrl+c, và sau đó làm nổi bật một cái gì đó bằng chuột, bạn có thể chọn cái nào để dán. Điều này không hoạt động trong Windows, nơi hai thanh ghi này đồng nghĩa với nhau.
ness101

1
Ban phước cho bạn, tôi đã tìm kiếm "*"+trong nhiều năm! Tôi nghĩ rằng chỉ có gvim có quyền truy cập vào các clipboard hệ thống, nhưng dường như vim thông thường cũng vậy!
Tarrasch

@Tarrasch Nếu bạn sử dụng bảng điều khiển vim thay vì gvim, bạn sẽ khám phá được nhiều thứ hơn. Tôi nghĩ. truy cập #vim trên freenode quá!
trusktr

1
Làm thế nào để kích hoạt tính năng nếu một người có -xterm_clipboardtrên vim --version. Bất kỳ gói đơn giản để cài đặt? (debian / apt-get). Cảm ơn.
Bác sĩ Beco

77

Thanh ghi lỗ đen _/dev/nullthanh ghi.

Tôi sử dụng nó trong vimrc của mình để cho phép xóa các ký tự đơn mà không cập nhật thanh ghi mặc định:

noremap x "_x

và để dán trong chế độ trực quan mà không cập nhật thanh ghi mặc định:

vnoremap p "_dP

Bản đồ thứ hai cũng rất hữu ích. Xem ở đây để được giải thích: marcorucci.com/blog/#visualModePaste
mrucci

21
ánh xạ để xcó được ít thuận tiện hơn để chuyển đổi ký tự.
hoài nghi

Nhấn x không xóa thứ cuối cùng bạn đã lấy, mà bạn sẽ tìm thấy trong sổ đăng ký 0. Nhấn xa vài lần, sau đó "0p để dán nội dung bạn đã kéo.
trusktr

2
Để mở rộng nhận xét của phía trên: với xánh xạ này, bạn không còn có thể thực hiện xp"lệnh" để chuyển đổi dòng điện với ký tự tiếp theo. Khá hữu ích cho việc sửa lỗi chính tả. Chúng ta cũng phải Xpchuyển đổi dòng điện với ký tự trước đó.
Daniel Andersson

56

Nếu bạn muốn dán nội dung của thanh ghi vào lệnh ex-mode, hãy nhấn <C-r><registerletter>.

Tại sao bạn sẽ sử dụng điều này? Tôi muốn thực hiện tìm kiếm và thay thế cho một chuỗi dài, vì vậy tôi đã chọn nó trong chế độ trực quan, bắt đầu nhập biểu thức tìm kiếm / thay thế :%s/[PASTE YANKED PHRASE]//gvà tiếp tục ngày của tôi.

Nếu bạn chỉ muốn dán một từ duy nhất trong chế độ ex, có thể đảm bảo con trỏ ở trên đó trước khi vào chế độ ex, sau đó nhấn <C-r><C-w>khi ở chế độ ex để dán từ đó.


6
Dán văn bản trong :dòng lệnh là điều tốt nhất tôi học được hôm nay
Shahbaz

1
Bạn cũng có thể sử dụng <CR> <đăng ký> trong chế độ chèn
Floegipoky

1
Tôi thích viết find / thay thế regexes trước bằng chỉ /[write out your regex]<cr>và sau đó thay thế chỉ s/<C-R>//replacement/. Bằng cách này bạn sẽ nhận được lợi ích của phản hồi trực tiếp trên regex của mình trước khi chạy thay thế.
GabeIsman

44

Tôi nghĩ rằng đăng ký guru bí mật là biểu thức = đăng ký. Nó có thể được sử dụng cho ánh xạ sáng tạo.

:inoremap  \d The current date <c-r>=system("date")<cr>

Bạn có thể sử dụng kết hợp với hệ thống của mình như trên hoặc nhận phản hồi từ các chức năng VimL tùy chỉnh, v.v.

hoặc chỉ những thứ ad hoc như

<c-r>=35+7<cr>

3
Hãy xem [video về cách sử dụng thanh ghi biểu thức] của Derek Wyatt ( derekwyatt.org/vim/vim-tutorial-video/iêu )
Jeromy Anglim

1
Liên kết từ @JeromyAnglim hiện có tại đây: derekwyatt.org/vim/tutorials/advified/#expression-register
Djizeus

39

Một mẹo hay là sử dụng "1pđể dán lần xóa / thay đổi cuối cùng (và sau đó sử dụng .để lặp đi lặp lại để dán các lần xóa tiếp theo. Nói cách khác, "1p...về cơ bản là tương đương với "1p"2p"3p"4p.

Bạn có thể sử dụng điều này để sắp xếp ngược lại một số dòng: dddddddddd"1p....


aha điều này thật tuyệt vời Những gì tôi thực sự muốn mặc dù là hành vi tương tự cho yanks
RyanM

18

Từ trang trợ giúp của vim:

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>

17
  • q5 hồ sơ chỉnh sửa vào đăng ký 5 (tiếp theo q dừng ghi)
  • : reg hiển thị tất cả các thanh ghi và bất kỳ nội dung nào trong đó
  • @ 5 thực hiện đăng ký 5 macro (chỉnh sửa được ghi lại)

15
Tôi không thích phím @ để khởi chạy macro (ba tổ hợp phím). Vì vậy, tôi đã ánh xạ F2 để khởi chạy macro được lưu trữ trong thanh ghi q: nmap <F2> @q Tôi sử dụng thanh ghi q, vì sau đó để lưu macro cho F2 để phát lại, tôi chỉ cần nhấn qq. lưu macro nhanh chóng và phát lại.
Andrej Panjkov

16

Tôi sử dụng thanh ghi mặc định để grep cho văn bản trong cửa sổ vim của tôi mà không cần phải lấy chuột.

  1. văn bản yank
  2. :!grep "<CTRL-R>0"<CR>

12

Sử dụng các thanh ghi trong các lệnh với @. Ví dụ:

echo @a
echo @0
echo @+

Đặt chúng trong lệnh:

let @a = 'abc'

Bây giờ "apsẽ dán abc.


8

Một nguồn gây nhầm lẫn lớn là thanh ghi mặc định ". Điều quan trọng là phải biết cách nó hoạt động. Sẽ tốt hơn nhiều nếu hầu hết các lần đăng ký mặc định được tránh. Giải thích từ tài liệu Vim:

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

Vì vậy, thanh ghi mặc định thực sự là một con trỏ đến thanh ghi được sử dụng cuối cùng. Khi bạn xóa, hoặc lấy một cái gì đó, thanh ghi này sẽ trỏ đến các thanh ghi khác. Bạn có thể kiểm tra điều đó bằng cách kiểm tra các thanh ghi. Luôn có một thanh ghi khác giống hệt như thanh ghi mặc định: thanh ghi yank ( "0), thanh ghi xóa đầu tiên ( "1), thanh ghi xóa nhỏ ( "-) hoặc bất kỳ thanh ghi nào khác được sử dụng để xóa hoặc yank.

Ngoại lệ duy nhất là thanh ghi lỗ đen. Vim doc nói:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

Thông thường, bạn đang tắt tốt hơn nhiều bằng cách sử dụng trực tiếp: "0, "-"1-"9đăng ký mặc định hoặc tên đăng ký.


8

Một thanh ghi bị bỏ qua là '.' thanh ghi dấu chấm chứa văn bản được chèn cuối cùng bất kể nó được chèn như thế nào, ví dụ: ct] (thay đổi cho đến khi]). Sau đó, bạn nhận ra rằng bạn cần chèn nó vào nơi khác nhưng không thể sử dụng phương pháp lặp lại dấu chấm.

 :reg .
 :%s/fred/<C-R>./

7

Đăng ký yêu thích của tôi là ':'đăng ký. Chạy @:ở chế độ Bình thường cho phép tôi lặp lại lệnh ex đã chạy trước đó.


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.