Cách dán văn bản có dấu vào dòng lệnh Vim


Câu trả lời:


1157

Đúng. Trúng Ctrl- Rrồi ". Nếu bạn có các ký tự điều khiển theo nghĩa đen trong những gì bạn đã kéo, hãy sử dụng Ctrl- R, Ctrl- O, ".

Dưới đây là một lời giải thích về những gì bạn có thể làm với các thanh ghi. Những gì bạn có thể làm với các thanh ghi là phi thường, và một khi bạn biết cách sử dụng chúng, bạn không thể sống thiếu chúng.

Các thanh ghi về cơ bản là vị trí lưu trữ cho chuỗi. Vim có nhiều thanh ghi hoạt động theo nhiều cách khác nhau:

  • 0(thanh ghi yank: khi bạn sử dụng yở chế độ bình thường, không chỉ định thanh ghi, văn bản được kéo ở đó và cả thanh ghi mặc định),
  • 1đến 9(dịch chuyển các thanh ghi xóa, khi bạn sử dụng các lệnh như choặc d, những gì đã bị xóa sẽ chuyển sang đăng ký 1, những gì trong đăng ký 1 sẽ đăng ký 2, v.v. ),
  • "(thanh ghi mặc định, còn được gọi là thanh ghi không tên. Đây là nơi "xuất hiện Ctrl- R, "),
  • ađến zđể sử dụng riêng của bạn (được vốn Ađể Zđược cho phụ thêm vào thanh ghi tương ứng).
  • _(hoạt động như /dev/null(Unix) hoặc NUL(Windows), bạn có thể viết thư cho nó nhưng nó bị loại bỏ và khi bạn đọc từ nó, nó luôn trống),
  • - (đăng ký xóa nhỏ),
  • /(tìm kiếm mẫu đăng ký, cập nhật khi bạn tìm kiếm văn bản với /, ?, *hoặc #ví dụ, bạn cũng có thể viết thư cho nó để tự động thay đổi các mô hình tìm kiếm),
  • :(lưu trữ lệnh gõ VimL cuối cùng thông qua Qhoặc :, chỉ đọc),
  • +*(các thanh ghi clipboard của hệ thống, bạn có thể viết thư cho chúng để đặt bảng tạm và đọc nội dung của bảng tạm từ chúng)

Xem :help registersđể tham khảo đầy đủ.

Bất cứ lúc nào bạn cũng có thể sử dụng :registersđể hiển thị nội dung của tất cả các thanh ghi. Từ đồng nghĩa và tốc ký cho lệnh này là :display, :reg:di.

Trong chế độ Chèn hoặc Dòng lệnh, Ctrl- Rcộng với tên đăng ký, chèn nội dung của thanh ghi này. Nếu bạn muốn chèn chúng theo nghĩa đen (không tự động thụt lề, không chuyển đổi các ký tự điều khiển như 0x08backspace, v.v.), bạn có thể sử dụng Ctrl- R, Ctrl- O, tên đăng ký. Xem :help i_CTRL-Rvà làm theo đoạn văn sau để tham khảo thêm.

Nhưng bạn cũng có thể làm như sau (và có lẽ tôi đã quên nhiều cách sử dụng cho các thanh ghi).

  • Ở chế độ bình thường, nhấn ":p. Lệnh cuối cùng bạn sử dụng trong vim được dán vào bộ đệm của bạn.
    Hãy phân tách: "là một lệnh chế độ Bình thường cho phép bạn chọn đăng ký nào sẽ được sử dụng trong lần thao tác tiếp theo, xóa hoặc dán. Vì vậy, ":chọn thanh ghi dấu hai chấm (lưu trữ lệnh cuối cùng). Sau đó plà một lệnh bạn đã biết, nó dán nội dung của thanh ghi.

    xem :help ",:help quote_:

  • Bạn đang chỉnh sửa tệp VimL (ví dụ: của bạn .vimrc) và muốn thực thi một vài dòng liên tiếp ngay bây giờ : yj:@"Enter.
    Đây,yj sắp xếp dòng hiện tại và dòng tiếp theo (điều này là do j là một chuyển động thẳng hàng nhưng điều này nằm ngoài phạm vi của câu trả lời này) vào thanh ghi mặc định (còn được gọi là thanh ghi không tên). Sau đó, :@lệnh Ex sẽ phát các lệnh Ex được lưu trong thanh ghi được cung cấp dưới dạng đối số và "là cách bạn tham chiếu đến thanh ghi không tên. Cũng xem đầu câu trả lời này, có liên quan.

    Đừng bối rối " được sử dụng ở đây (là tên đăng ký) với "từ ví dụ trước, đó là lệnh Chế độ bình thường.

    xem :help :@:help quote_quote

  • Chèn mẫu tìm kiếm cuối cùng vào tệp của bạn trong chế độ Chèn hoặc vào dòng lệnh, với Ctrl-R , /.

    xem :help quote_/,help i_CTRL-R

    Hệ quả: Giữ mô hình tìm kiếm của bạn nhưng thêm một thay thế: / Ctrl- R, / \|alternative.

  • Bạn đã chọn hai từ ở giữa một dòng trong chế độ trực quan, kéo chúng ra y, chúng nằm trong thanh ghi không tên. Bây giờ bạn muốn mở một dòng mới ngay bên dưới nơi bạn đang ở, với hai từ đó : :pu. Đây là tốc ký cho :put ". Các :putlệnh, giống như nhiều lệnh Ex, chỉ hoạt động linewise.

    xem :help :put

    Bạn cũng có thể đã làm: :call setreg('"', @", 'V')sau đó p. Các setregchức năng thiết lập sổ đăng ký mà tên được đưa ra như là đối số đầu tiên (như là một chuỗi), khởi tạo nó với các nội dung của đối số thứ hai (và bạn có thể sử dụng thanh ghi như biến với tên @xnơi xlà tên đăng ký trong VimL), và biến nó thành chế độ được chỉ định trong đối số thứ ba,V đối với đường thẳng, không có gì cho đặc trưng và nghĩa đen ^Vđối với khối.

    xem :help setreg(). Các chức năng đảo ngược là getreg()getregtype().

  • Nếu bạn đã ghi lại một macro với qa... q, thì nó :echo @asẽ cho bạn biết những gì bạn đã nhập và@a sẽ phát lại macro (có thể bạn đã biết một macro đó, rất hữu ích để tránh các tác vụ lặp đi lặp lại)

    xem :help q,help @

    Hệ quả từ ví dụ trước: Nếu bạn có 8gotrong bảng tạm, thì @+sẽ phát nội dung của bảng tạm dưới dạng macro và do đó chuyển đến byte thứ 8 của tệp của bạn. Trên thực tế điều này sẽ làm việc với hầu hết mọi đăng ký. Nếu chuỗi được chèn cuối cùng của bạn ddở chế độ Chèn, thì @.(vì thanh .ghi chứa chuỗi được chèn cuối cùng) sẽ xóa một dòng. (Tài liệu Vim là sai trong vấn đề này, vì nó khẳng định rằng các thanh ghi #, %, :.sẽ chỉ làm việc với p, P, :putCtrl - R).

    xem :help @

    Đừng nhầm lẫn :@(lệnh phát lệnh Vim từ thanh ghi) và@ (lệnh chế độ bình thường chơi các lệnh chế độ bình thường từ một thanh ghi).

    Ngoại lệ đáng chú ý là @:. Thanh ghi lệnh không chứa dấu hai chấm ban đầu và cũng không chứa trả về vận chuyển cuối cùng. Tuy nhiên, ở chế độ Bình thường, @:sẽ làm những gì bạn mong đợi, diễn giải thanh ghi dưới dạng lệnh Ex, không cố gắng phát ở chế độ Bình thường. Vì vậy, nếu lệnh cuối cùng của bạn là :e, thanh ghi chứa enhưng @:sẽ tải lại tệp, không đi đến cuối từ.

    xem :help @:

  • Hiển thị những gì bạn sẽ làm trong chế độ Bình thường trước khi chạy nó : @='dd' Enter. Ngay khi bạn nhấn =phím, Vim chuyển sang đánh giá biểu thức: khi bạn nhập một biểu thức và nhấn Enter, Vim sẽ tính toán nó và kết quả hoạt động như một nội dung đăng ký. Tất nhiên, thanh ghi =chỉ đọc và một lần bắn. Mỗi khi bạn bắt đầu sử dụng nó, bạn sẽ phải nhập một biểu thức mới.

    xem :help quote_=

    Hệ quả: Nếu bạn đang chỉnh sửa một lệnh và bạn nhận ra rằng bạn cần phải chèn vào dòng lệnh của mình một số dòng từ bộ đệm hiện tại của bạn: đừng nhấn Esc! Sử dụng Ctrl- R =getline(58) Enter. Sau đó, bạn sẽ quay lại chỉnh sửa dòng lệnh, nhưng nó đã chèn nội dung của dòng thứ 58.

  • Xác định mẫu tìm kiếm theo cách thủ công: :let @/ = 'foo'

    xem :help :let

    Lưu ý rằng làm điều đó, bạn không cần phải thoát /trong mẫu. Tuy nhiên, bạn cần phải tăng gấp đôi tất cả các trích dẫn duy nhất của khóa học.

  • Sao chép tất cả các dòng bắt đầu với foo, và sau đó tất cả các dòng có chứa barvào clipboard, chuỗi các lệnh này: qaq(reset các một đăng ký lưu trữ macro rỗng bên trong nó), :g/^foo/y A, :g/bar/y A, :let @+ = @a.

    Sử dụng tên đăng ký vốn làm cho đăng ký hoạt động ở chế độ chắp thêm

    Tốt hơn, nếu Qchưa được ánh xạ lại mswin.vim, hãy khởi động chế độ Ex bằng Q, xâu chuỗi các lệnh dấu hai chấm đó, đó thực sự được gọi là các lệnh Ex của Ex, và quay lại chế độ Bình thường bằng cách gõ visual.

    xem :help :g, :help :y,:help Q

  • Nhân đôi không gian tệp của bạn : :g/^/put _. Điều này đặt nội dung của thanh ghi lỗ đen (trống khi đọc, nhưng có thể ghi, hành xử như thế /dev/null) theo từng dòng, sau mỗi dòng (vì mỗi dòng có một bắt đầu!).

  • Thêm một dòng chứa footrước mỗi dòng : :g/^/-put ='foo'. Đây là một cách sử dụng thông minh của thanh ghi biểu thức. Ở đây, -là một từ đồng nghĩa với .-1(xem :help :range). Vì :putđặt văn bản sau dòng, bạn phải nói rõ ràng để hành động trên dòng trước.

  • Sao chép toàn bộ bộ đệm vào bảng tạm hệ thống : :%y+.

    xem :help :range(đối với %phần) và :help :y.

  • Nếu bạn đã đánh giá sai một macro, bạn có thể nhập :let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter 'và chỉnh sửa nó. Điều này sẽ sửa đổi nội dung của macro được lưu trữ trong thanh ghi avà nó được hiển thị ở đây cách bạn có thể sử dụng thanh ghi biểu thức để làm điều đó.

  • Nếu bạn đã làm dddd, bạn có thể làm uuđể hoàn tác. Với pbạn có thể có được dòng cuối cùng bị xóa. Nhưng thực tế bạn cũng có thể khôi phục tối đa 9 lần xóa với các thanh ghi @1thông qua @9.

    Thậm chí tốt hơn, nếu bạn làm "1P, thì .trong chế độ Bình thường sẽ phát "2P, v.v.

    xem :help .:help quote_number

  • Nếu bạn muốn chèn ngày hiện tại trong chế độ Chèn: Ctrl- R=strftime('%y%m%d')Enter.

    xem :help strftime()

Một lần nữa, những gì có thể gây nhầm lẫn:

  • :@ là một dòng lệnh diễn giải nội dung của một thanh ghi dưới dạng vimscript và nguồn nó
  • @ trong lệnh chế độ bình thường diễn giải nội dung của thanh ghi là tổ hợp phím chế độ bình thường (trừ khi bạn sử dụng :thanh ghi, có chứa lệnh được phát lần cuối mà không có dấu hai chấm ban đầu: trong trường hợp này, nó sẽ phát lại lệnh như thể bạn cũng gõ lại dấu hai chấm và khóa trở về cuối cùng).

  • " trong lệnh chế độ bình thường giúp bạn chọn một thanh ghi cho yank, dán, xóa, sửa, v.v.

  • " cũng là một tên thanh ghi hợp lệ (tên đăng ký mặc định hoặc không được đặt tên) và do đó có thể được chuyển qua làm đối số cho các lệnh mong đợi tên thanh ghi

205
Không có tỷ lệ độ dài 100/1 huy hiệu giữa câu trả lời và câu hỏi? :)
Benoit

8
Đó là một câu trả lời tuyệt vời, nhưng nó ngắn khoảng 900 từ 1400. :)

19
Câu trả lời này đã thay đổi cách tôi sử dụng vim. Cảm ơn Benoit
P. Myer Nore

11
Đừng quên: reg sẽ liệt kê tất cả các thanh ghi cùng với nội dung của chúng
eugenevd

3
Trong các phiên bản gần đây của vim, việc xóa nhỏ hơn một dòng đi vào "thanh ghi xóa nhỏ" thay vì đi vào các thanh ghi được đánh số. Tài liệu tham khảo: Vi và Vim , Vi và Vim , Reddit
Christian Long

48

Để dán một cái gì đó là clipboard hệ thống, bạn chỉ có thể sử dụng SHIFT-INS .

Nó hoạt động trong Windows, nhưng tôi đoán nó cũng hoạt động tốt trong Linux.


7
Yup, cũng hoạt động trong Linux. Đã thử nghiệm dưới Gnome trong cả Vim và GVim.
Teoulas

3
Điều này thực sự cung cấp bảng điều khiển cho Vim làm đầu vào bàn phím, vì vậy nếu bạn ở chế độ bình thường và dán :!rm -rf /<cr>, nó sẽ thực thi điều đó. Sử dụng thanh ghi thay thế!
lericson

4
@lericson Tôi không nói trong câu trả lời của mình rằng điều này hữu ích cho một cái gì đó trong bàn phím hệ thống? Tôi không hiểu downvote. Và cho bạn ví dụ, nghiêm túc? Bạn thực sự có điều đó trong clipboard? Và bạn không nghĩ rằng gõ shift-insdễ hơn ctrl-R+*? Điều này là tất nhiên nếu bạn đang ở trong gvim. Nếu bạn đang ở trong thiết bị đầu cuối được kết nối với một máy khác và bạn muốn dán một cái gì đó từ khay nhớ tạm của bạn, bạn có biết cái gì tốt hơn shift-inskhông? bởi vì các thanh ghi không hoạt động trong tình huống đó. Hãy suy nghĩ trước khi bình luận và làm những việc khác (như hạ cấp).
hoài nghi

Tôi nghĩ đó là thông tin sai lệch và tôi đã hành động theo phán quyết đó.
lericson

1
Không làm việc cho tôi. Tôi chỉ nhận được '<S-Chèn>' vào dòng lệnh của mình. Có lẽ tôi đang thiếu một cái gì đó. (Ubuntu 19.04 / 2: 8.1.0320-1ubfox3.1).
Max Waterman

39

"Tôi muốn dán văn bản được kéo dài vào dòng lệnh Vim."

Trong khi câu trả lời được bình chọn hàng đầu là rất đầy đủ, tôi thích chỉnh sửa lịch sử lệnh.

Trong chế độ bình thường, gõ : q:. Điều này sẽ cung cấp cho bạn một danh sách các lệnh gần đây, có thể chỉnh sửa và tìm kiếm với các lệnh vim bình thường. Bạn sẽ bắt đầu trên một dòng lệnh trống ở phía dưới.

Đối với điều chính xác mà bài viết yêu cầu, dán một dòng có dấu (hoặc kéo bất cứ thứ gì) vào một dòng lệnh, kéo văn bản của bạn và sau đó: q:p(vào chế độ chỉnh sửa lịch sử lệnh, và sau đó (p) sử dụng văn bản được kéo của bạn vào một lệnh mới Chỉnh sửa theo ý muốn, enterđể thực hiện.

Để thoát khỏi chế độ lịch sử lệnh, nó ngược lại. Trong chế độ bình thường trong lịch sử lệnh, gõ: :q+enter


1
nếu bạn đã sửa đổi một lệnh hiện có và không nhấn 'q:' nhấn ctrl + f và nó sẽ tăng khả năng chỉnh sửa lịch sử lệnh.
Clay

14

Để dán một cái gì đó từ bảng tạm hệ thống vào dòng lệnh Vim ("chế độ lệnh"), sử dụng Ctrl+ Rtheo sau +. Đối với tôi, ít nhất là trên Ubuntu, Shift+ Inskhông hoạt động.

PS: Tôi không chắc tại sao Ctrl+ Rtheo sau *, về mặt lý thuyết giống như Ctrl+ Rtheo sau +dường như không hoạt động. Tôi đã tìm kiếm và phát hiện ra +phiên bản và nó dường như luôn hoạt động, ít nhất là trên hộp của tôi.


2
Sự khác biệt giữa Ctrl-r + và Ctrl-r * là trước đây là bảng tạm thông thường, nhưng trong Linux có một loại bảng tạm thứ hai được gọi là "chính" đại diện cho văn bản được chọn gần đây nhất (dán chuột vào nút giữa) . Điều này không có sẵn trong Windows hoặc MAC
Matias Thayer

13

Cũng đáng lưu ý rằng các thanh ghi yank giống như các bộ đệm macro. Nói cách khác, bạn có thể chỉ cần viết toàn bộ lệnh của bạn trong tài liệu của bạn (bao gồm cả đoạn mã đã dán), sau đó "bykéo nó vào thanh bghi, rồi chạy với nó @b.


1

Tôi đã có một vấn đề tương tự. Tôi muốn văn bản được chọn kết thúc bằng một lệnh, nhưng không dựa vào việc dán nó vào. Đây là lệnh tôi đang cố gắng viết ánh xạ cho:

:call VimuxRunCommand("python")

Các tài liệu cho plugin này chỉ hiển thị bằng chuỗi ký tự. Điều sau đây sẽ bị phá vỡ nếu bạn cố gắng chọn văn bản có chứa doublequote:

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

Để giải quyết vấn đề này, bạn chỉ cần tham khảo nội dung của macro bằng cách sử dụng @:

vnoremap y:call VimuxRunCommand(@")<cr>

Truyền nội dung của sổ đăng ký chưa được đặt tên vào và hoạt động với trích dẫn kép và edgecase của tôi.


Tôi nghĩ rằng ví dụ cuối cùng của bạn bị thiếu ". Có lẽ bạn có nghĩa là VimuxRunCommand (" @ ").
kd8azz

Điều đó sẽ gửi @nhân vật đến lệnh vimux. nghĩ về việc @thoát khỏi trích dẫn kép sau đây và nó được coi là một thanh ghi thay vì như một ký tự thông thường. Cái vnoremaptôi đã xác định là hoạt động ở chế độ trực quan, do đó, nó sẽ sắp xếp văn bản đã chọn và sau đó dán nó vào lệnh vimux, gửi nó đến một trình thông dịch đang chạy trong một khung liền kề. thực sự tuyệt vời để làm việc trên một kịch bản và thử nghiệm các phần nhỏ của nó với một vài lần nhấn phím.
Conrad.Dean

1

Hệ điều hành X

Nếu bạn đang sử dụng Vim trong Mac OS X, thật không may, nó đi kèm với phiên bản cũ hơn và không tuân thủ các tùy chọn clipboard. May mắn thay, Homebrew có thể dễ dàng giải quyết vấn đề này.

Cài đặt Vim:

brew install vim --with-lua --with-override-system-vi

Cài đặt phiên bản GUI của Vim:

brew install macvim --with-lua --with-override-system-vi

Khởi động lại thiết bị đầu cuối cho nó có hiệu lực.


Nối dòng sau vào ~/.vimrc
set clipboard=unnamed

Bây giờ bạn có thể sao chép dòng trong Vim yyvà dán nó trên toàn hệ thống.


1

Đối với ngữ cảnh, thông tin này xuất phát từ bên ngoài, không có plugin, không có hành vi .vimrc Vim 7.4 trong Linux Mint với các tùy chọn mặc định.

Bạn luôn có thể chọn văn bản bằng chuột (hoặc sử dụng Vhoặc vvà đặt vùng chọn vào thanh ghi "*) và dán nó vào dòng lệnh với Shift+ Ctrl+v .

Nhập Ctrl+ rtrong dòng lệnh sẽ gây ra lời nhắc cho tên đăng ký. vì vậy gõ :CTRL-r*sẽ đặt thanh ghi nội dung * vào dòng lệnh. Nó sẽ dán bất kỳ thanh ghi nào, không chỉ "*. Xem:help c_CTRL-R .

Hơn nữa, nút chuột giữa sẽ dán vào dòng lệnh.

Xem :help->quote-plus để biết mô tả về cách X Window xử lý lựa chọn. Ngay cả trong một Vim đơn giản, ngoài hộp (một lần nữa, trong Vim 7.4 trong Linux Mint, dù sao đi nữa), bất kỳ lựa chọn nào được thực hiện bằng nút chuột trái đều có thể được dán trong dòng lệnh bằng nút chuột giữa.

Ngoài ra, nút chuột giữa cũng sẽ dán văn bản được chọn trong Vim vào nhiều ứng dụng X Window khác, thậm chí cả GUI (ví dụ: Firefox và Thunderbird ) và dán văn bản vào dòng lệnh cũng có thể trong đó văn bản được chọn từ các ứng dụng khác .

Xem: help-> x11-select để biết thông tin addl.

tl; dr

Hãy thử cách tiếp cận: CTRL-r trước, sau đó sử dụng Shift+ Ctrl+ vhoặc nút chuột giữa nếu bạn cần thứ gì khác.

Nó được thừa nhận rằng nó có thể gây nhầm lẫn.


0
  1. "[a-z]y: Sao chép văn bản vào thanh ghi [az]

  2. Sử dụng :!để đi đến lệnh chỉnh sửa

  3. Ctrl+ R: Thực hiện theo danh tính đăng ký để dán những gì bạn sao chép.

Nó được sử dụng để CentOS 7.


Có nghĩa là gì "Nó dùng để CentOS 7." ?
Peter Mortensen

0

Nếu bạn có hai giá trị được kéo vào hai thanh ghi khác nhau (ví dụ: đăng ký avà đăng ký b) thì bạn có thể chỉ cần đặt một biến cvà thực hiện thao tác trên nó.

Ví dụ, :set c = str2float(@a) + str2float(@b)và sau đó bạn có thể dán nội dung của cbất cứ nơi nào.

Ví dụ: trong khi ở chế độ INSERT, CTRL + Rsau đó nhập =để nhập vào thanh ghi biểu thức và chỉ cần nhập csau dấu bằng và nhấn ENTER. Xong bạn sẽ có tổng số ab đăng ký.

Tất cả những điều này có thể được ghi lại trong một macro và lặp đi lặp lại!

Các str2float chức năng được sử dụng nếu bạn đang làm việc với phao, nếu bạn không, bạn sẽ nhận được số nguyên thay thế.

Tôi không chắc đây có phải là thành ngữ hay không nhưng nó hoạt động cho trường hợp của tôi khi tôi cần thêm 2 số liên tiếp và lặp lại cho 500 dòng nữa.

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.