Dán ở chế độ chèn?


385

Có thể dán ở chế độ chèn trong Vim không?

Câu trả lời:


465

Trong khi ở chế độ chèn nhấn CTRL-R {register}

Ví dụ:

  • CTRL-R * sẽ chèn vào nội dung của clipboard
  • CTRL-R " (thanh ghi không tên) chèn lần xóa hoặc yank cuối cùng.

Để tìm thấy điều này trong loại trợ giúp của vim :h i_ctrl-r


13
Đúng, gần đây tôi mới biết về CTRL-R và nó cực kỳ hữu ích.
Dan

16
CTRL-R *chỉ hoạt động trong GVIM hoặc các phiên bản được biên dịch để tương tác với x. Nhập vim --versionvà tìm kiếm +xterm_clipboard. Nếu bạn không có điều đó, bạn cần một phiên bản khác của vim. ( vim.wikia.com/wiki/Accessing_the_system_clipboard )
Conrad.Dean

10
Bạn thực sự chỉ cần +clipboard, nhưng nếu bạn có +xterm_clipboardbạn nên có điều đó. Trên một số HĐH xterm_clipboardkhông áp dụng được.
Andrew Marshall

1
Hmm, tôi sử dụng C-r + để dán từ bảng tạm hệ thống trên Windows (sử dụng GVim xách tay)? Chưa bao giờ nghe nói về * đăng ký.
Kitsu.eb

6
@ Kitsu.eb Trên *thanh ghi hệ thống X có thể dán được bằng cách nhấp chuột giữa trong khi +là bản sao / dán truyền thống. Standard.freedesktop.org/clipboards-spec/clipboards-latest.txt
amc

235

Nếu bạn không muốn Vim định dạng mangle trong văn bản được dán đến, bạn cũng có thể muốn xem xét sử dụng : :set paste. Điều này sẽ ngăn Vim lập lại mã của bạn. Khi thực hiện dán, :set nopastesẽ trở lại hành vi bình thường.

Bạn cũng có thể chuyển đổi chế độ bằng một phím duy nhất, bằng cách thêm một cái gì đó giống như set pastetoggle=<F2>vào .vimrc của bạn. Thông tin chi tiết về bật tắt tự động thụt lề có ở đây .


47
:set nopastesẽ tắt chế độ dán
James Snyder

24
@JamesSnyder Một cách tốt hơn là :set paste!Có thể thiết lập dán rất gần trong lịch sử lệnh của bạn, vì vậy bạn chỉ cần nhấn ':', sau đó mũi tên lên và thêm '!'.
Rafael Barbosa

6
Chỉ tò mò - những gì tốt hơn hoặc khác về :set paste! Cảm ơn :)
Michael Durrant

33
các !vào cuối lệnh trong vimToggles lệnh và tắt. Bằng cách này, bạn không phải nhập :set nopastethay vào đó bạn có thể cuộn qua lịch sử của mình và chạy lại cùng một lệnh ( :set paste!).
에 ảnh

3
@blockloop Bạn phải kích hoạt nó trong khi dán và vô hiệu hóa nó ngay sau đó.
NieDzejkob

125

Không không trực tiếp. Những gì bạn có thể làm là nhanh chóng thoát khỏi chế độ chèn cho một hoạt động ở chế độ bình thường Ctrl-Ovà sau đó dán từ đó sẽ kết thúc bằng cách đưa bạn trở lại chế độ chèn.

Combo chính: Ctrl-O p

EDIT: Thú vị. Dường như có một cách như một số người khác đã liệt kê.


2
ctrl-r "không hoạt động với tôi (os x, vi trong một thiết bị đầu cuối). ctrl-o p đã làm.
Bob

4
Đây là cách nhanh nhất và dễ nhớ nhất.
pinpox

Thế còn esc + p?
sitilge

2
Chắc chắn nhanh hơn esc + p + ivà chắc chắn dễ gõ hơnCTRL-R + "
lucidbrot

Trên thực tế, điều này đôi khi hành xử khác nhau từ CTRL-R ". Chẳng hạn, mặc dù các cài đặt vimrc có thể thay đổi điều này, nhưng việc dán thứ gì đó vào một dòng mới bằng cách sử dụng CTRL-O plàm cho vết lõm của nó biến mất.
noname

30

Trong khi ở chế độ chèn, bạn có thể sử dụng Ctrl-R {register}, nơi đăng ký có thể là:

  • + cho bảng tạm
  • * cho bảng tạm X (văn bản được chọn cuối cùng trong X),
  • " đối với thanh ghi không tên (xóa lần cuối hoặc yank trong Vim),
  • hoặc một số người khác (xem :h registers).

Ctrl-R {register} chèn văn bản như thể nó được gõ.

Ctrl-R Ctrl-O {register} chèn văn bản với thụt gốc.

Ctrl-R Ctrl-P {register} chèn văn bản và tự động thụt lề nó.

Ctrl-Ocó thể được sử dụng để chạy bất kỳ lệnh chế độ bình thường nào trước khi quay lại chế độ chèn, vì vậy
Ctrl-O "+pcũng có thể được sử dụng, ví dụ.

Để biết thêm thông tin, xem tài liệu với :h i_ctrl-r


4
Câu trả lời này dường như là toàn diện nhất. Nó rất rõ ràng, và theo tôi, là hữu ích nhất. Nó trả lời câu hỏi của OP và sau đó một số, chính xác.
Devvyn 19/03/2015

26

Bạn có thể sử dụng để dán từ clipboard với Ctrlv:

set pastetoggle=<F10>
inoremap <C-v> <F10><C-r>+<F10>

Và điều này để kéo lựa chọn trực quan vào clipboard với Ctrlc:

vnoremap <C-c> "+y

Nếu bạn cũng muốn sử dụng clipboard theo mặc định cho vim yanking / dán cổ điển ( y/ p) ở chế độ bình thường, đây là một tùy chọn cấu hình thực hiện:

set clipboard=unnamedplus

Với cấu hình này, trước tiên bạn có thể kéo dài ở chế độ bình thường và sau đó dán Ctrlvvào ở chế độ chèn. Ngoài ra, bạn có thể dán văn bản từ các trường hợp vim khác nhau và các ứng dụng khác nhau.

Một lựa chọn khác là:

set clipboard=unnamed

Sau đó, bạn sẽ có thể chỉ cần chọn một cái gì đó bằng cách kéo chuột trong môi trường X của bạn và dán nó vào vim sau đó. Nhưng (vì một số lý do) bạn sẽ không thể lấy một cái gì đó ( y) trong Vim và shiftinsertnó ở một nơi khác sau đó, điều này có lẽ khá hạn chế.

Vim tài liệu về điều này: http://vim.wikia.com/wiki/Accessing_the_system_clipboard

Để dán từ các thanh ghi tùy chỉnh, bạn có thể làm theo các câu trả lời khác :). Câu trả lời này chủ yếu là về việc tích hợp Vim với clipboard hệ thống của bạn.


Lưu ý rằng để set clipboard=unnamedplusset clipboard=unnamedđể làm việc, bạn cần sử dụng gvim hoặc vimx ( vim-X11): Chúng được biên dịch với +xterm_clipboard. Bạn có thể tùy ý đặt cái này vào .bashrcbí danh của mình vimbằng vimx:

if [ -e /usr/bin/vimx ]; then
    alias vim='/usr/bin/vimx'; # vim with +xterm_clipboard
fi

Bạn có thể tìm hiểu xem vim của bạn có +xterm_clipboardthông tin được cung cấp hay không vim --version.


7
Điều này thật đúng với gì mà tôi đã tìm kiếm. Đó cũng là câu trả lời hợp lý duy nhất ở đây. Đây là cách người ta mong đợi mọi thứ sẽ làm việc. Có ai biết tại sao hành vi mặc định của :set pastevà byzantine <leader><leader> * ythậm chí còn được mong muốn từ xa không? Không có vẻ quá cam kết, tôi thực sự tò mò những gì triết lý vim này phản ánh, hoặc nếu nó chỉ là một bất hạnh lịch sử.
Aeschylus

Câu trả lời của bạn cho phép tôi sử dụng Shift + Chèn trong Gvim với inoremap <S-Insert> <F12><C-r>+<F12>(Tôi sử dụng F12 làm pastetoggle). Cảm ơn.
sromero

20

Nếu bạn đặt Vim để sử dụng bảng tạm hệ thống ( :set clipboard=unnamed), thì mọi văn bản bạn sao chép trong Vim đều có thể được dán bằng Shift+ Insert. Shift+ Insertchỉ đơn giản là tổ hợp phím dán trên toàn hệ điều hành ( Ctrl+ Insertlà 'bản sao' tương ứng).


1
Không biết về S-Chèn :)
BandGap

Điều này làm việc ngược lại? Sẽ pdán văn bản trong clipboard?
Zaz

Trước khi sử dụng Shift + Insertđể dán văn bản, chúng ta cần ở chế độ chèn.
jdhao

18

Bạn cũng có thể sử dụng nút giữa chuột để dán ở chế độ chèn (chỉ dành cho Linux).


106
Con chuột này bạn nói về cái gì vậy?
Jim Mitchener

19
Những hệ điều hành không phải linux mà bạn nói đến là gì?
Bruno Bronosky

-1: Câu trả lời này phụ thuộc nhiều vào cài đặt phần cứng và thiết bị đầu cuối. Cuối cùng, các nút trên chuột sẽ gửi một chuỗi đặt trước đến terminal và terminal phân tích chuỗi đó để thực thi một lệnh nhất định. Vấn đề là, điều này có thể khác nhau rất nhiều, tùy thuộc vào cài đặt thiết bị đầu cuối. Để cải thiện câu trả lời này, vui lòng cung cấp cho chúng tôi, ít nhất là phiên bản của thiết bị đầu cuối, HĐH, và phiên bản và kiểu chuột bạn đang sử dụng.
melvynkim

Dán nút chuột giữa khá phổ biến trên tất cả các ứng dụng Linux, không bị giới hạn bởi các phiên bản thiết bị đầu cuối hoặc hệ điều hành.
lcltj

Không hoạt động trong Arch Linux + urxvt. Nó chỉ thêm dòng mới.
zygimantus

5

Bạn có thể vào -- INSERT (past) --chế độ thông qua:

  • Tổ hợp bàn phím: y p

hoặc là

  • :set pastevà vào chế độ chèn ( :set nopasteđể tắt)

một lần trong -- INSERT (past) --chế độ chỉ cần sử dụng chức năng dán hệ thống của bạn (ví dụ: CtrlShiftvtrên Linux, Cmdvtrên Mac OS).

Chiến lược này rất hữu ích khi sử dụng vim qua ssh.


4

Đúng. Trong Windows Ctrl+ Vvà trong Linux, nhấn cả hai nút chuột gần như đồng thời.

Trong Windows tôi nghĩ dòng này trong _vimrc của tôi có thể thực hiện được:

source $VIMRUNTIME/mswin.vim

Trong Linux tôi không nhớ tôi đã làm như thế nào. Có vẻ như tôi có thể đã xóa một số dòng từ tệp .vimrc mặc định.


Tôi có thể upvote nhiều lần không ?? Tôi chỉ muốn dán khi tôi đến từ một cửa sổ khác - vì vậy tôi luôn ở trên chuột. Xuất sắc!
dave

Trong Linux, bạn dán bằng cách nhấn nút chuột giữa. Nếu bạn có hai nút chuột và nhấn cả nút trái và phải, thì nó cần "Emulation3Buttons" hoặc tương tự để hoạt động theo cách này.
Cougar

0

Dán trong Chế độ chèn

Một bản đồ tùy chỉnh có vẻ thích hợp trong trường hợp này. Đây là những gì tôi sử dụng để dán các mục đã nhúng trong chế độ chèn:

inoremap <Leader>p <ESC>pa

LeaderChìa khóa của tôi ở đây là \; điều này có nghĩa là nhấn \ptrong chế độ chèn sẽ dán các mục / dòng đã được đánh dấu trước đó.


0

Chỉ cần thêm bản đồ:

" ~/.vimrc
inoremap <c-p> <c-r>*

khởi động lại vim và khi nhấn Crtl+pở chế độ chèn, văn bản đã sao chép sẽ được dán

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.