Làm thế nào để dán vào một dòng mới với vim?


143

Tôi thường phải dán một số thứ trên một dòng mới trong vim. Những gì tôi thường làm là:

o<Esc>p

Mà chèn một dòng mới và đưa tôi vào chế độ chèn, hơn là thoát khỏi chế độ chèn, và cuối cùng là dán.

Ba tổ hợp phím. Không hiệu quả lắm. Còn ý tưởng nào hay hơn không?


7
3 tổ hợp phím không hiệu quả?
gtd

59
1 hoặc 2 sẽ tốt hơn :) Tại sao nên sử dụng vim nếu không cho hiệu quả tối đa?
static_rtti

2
Nó cũng dẫn đến một dòng mới bổ sung nếu nội dung được sao chép kết thúc trong một dòng mới.
Jonathan W.

1
@gtd Một trình soạn thảo bình thường hoạt động với <Enter> <CV>. Hai tổ hợp phím.
dùng4052054

1
@ user4052054 không, điều đó không làm điều tương tự, o / O hoạt động mọi lúc mọi nơi, trong một trình chỉnh sửa bình thường, bạn phải đến đầu hoặc cuối dòng trước. Hơn nữa, nếu bạn đang sao chép toàn bộ một dòng, thì toàn bộ chỉ trở thành một tổ hợp phím để chèn một dòng, đó là một đề xuất phổ biến hơn nhiều trong mã hóa.
gtd

Câu trả lời:


70

Ngay sau khi :help pnó nói:

:[line]pu[t] [x]    Put the text [from register x] after [line] (default
                    current line).  This always works |linewise|, thus
                    this command can be used to put a yanked block as
                    new lines.

:[line]pu[t]! [x]   Put the text [from register x] before [line]
                    (default current line).

Thật không may, nó không ngắn hơn giải pháp hiện tại của bạn trừ khi bạn kết hợp nó với một số bản đồ bàn phím như được đề xuất trong một câu trả lời khác. Chẳng hạn, bạn có thể ánh xạ nó tới bất kỳ khóa nào (chẵn p):

:nmap p :pu<CR>

2
Tôi biết điều đó và tôi sử dụng nó, nhưng đó không phải là điều tôi đang hỏi, bởi vì đôi khi những gì bạn đang sao chép chỉ không có bất kỳ hoạt động nào trong đó. Nếu có lệnh "dán vào dòng mới", nó sẽ hoạt động bất kể nội dung bạn sắp dán, vì vậy bạn sẽ không phải suy nghĩ về nó.
static_rtti

4
Được rồi, :pu[t]sẽ đặt văn bản trong một dòng mới sau dòng hiện tại, :pu[t]!sẽ đặt văn bản trong một dòng mới trước dòng hiện tại. Tôi sẽ chỉnh sửa câu trả lời của tôi cho phù hợp. (Hoan hô :help p.)
Bombe

2
Không thực sự tốt hơn giải pháp hiện tại của tôi, nhưng tôi nghĩ đó là câu trả lời tốt nhất cho câu hỏi của tôi.
static_rtti

4
Trong khi cùng số lượng tổ hợp phím, tôi nghĩ rằng điều này cảm thấy hiệu quả hơn. o <Esc> p cảm thấy cồng kềnh, trong khi điều này thì không.
Câu chuyện đánh dấu

1
Bạn có thể ánh xạ lệnh tới bất kỳ khóa nào, kể cả chính p: :nmap p :pu<CR>Đặt nó vào tệp .vimrc của bạn và tắt đi :)
Capi Etheriel

54

Tùy chọn:

1) Sử dụng yyđể kéo toàn bộ dòng (bao gồm cả cuối dòng ký tự). psau đó sẽ dán dòng trên một dòng mới sau dòng hiện tại và P( Shift- P) sẽ dán phía trên dòng hiện tại.

2) Tạo ánh xạ: sau đó chỉ có một hoặc hai phím:

:nmap ,p o<ESC>p
:nmap <F4> o<ESC>p

3) Phiên bản chức năng của ánh xạ (thực sự không cần thiết, nhưng chỉ để hoàn thiện):

:nmap <F4> :call append(line('.'), @")<CR>

" This one may be a little better (strip the ending new-line before pasting)
:nmap <F4> :call append(line('.'), substitute(@", '\n$', '', ''))<CR>

:help let-register
:help :call
:help append()
:help line()
:help nmap

2
Chà, tôi đoán tôi sẽ tạo một bản đồ. Tôi chỉ hy vọng có thể có một giải pháp chuẩn: - / Cảm ơn câu trả lời của bạn!
static_rtti

2
@AI: Sử dụng ', p' (',' được ánh xạ là <Nhà lãnh đạo> của tôi) là giải pháp tốt nhất theo quan điểm của tôi. YOu thậm chí còn cung cấp một chức năng dễ sử dụng. :) Tuyệt quá!
Ai đó vẫn sử dụng bạn MS-DOS

29

Bạn có thể dán một bộ đệm trong chế độ chèn bằng cách sử dụng <C-R>theo sau là tên của bộ đệm để dán. Bộ đệm mặc định là ", vì vậy bạn sẽ làm

o<C-R>"

Tôi thấy rằng tôi sử dụng <C-R>"rất thường xuyên và ràng buộc điều đó <C-F>trong vimrc của tôi:

inoremap <C-F> <C-R>"

2
Điều này thật tuyệt vì nó giữ cho vết lõm chính xác nếu dòng sao chép không được thụt vào.
CornSmith

23

Điều này vẫn sử dụng ba tổ hợp phím, nhưng tôi thấy nó dễ hơn Esc:

o<Alt-p>

Vì bạn đang ở chế độ chèn sau khi nhấn o, công cụ sửa đổi Alt sẽ cho phép bạn sử dụng lệnh như thể bạn không.


2
Cách khá tiện lợi khi bạn thử yank sth bạn cắt bên trong dòng với "d $" trong một dòng mới
Serhat Cevikel

Xin lỗi, nhưng điều này không giữ vết lõm, thay vào đó, nó dán ở đầu dòng.
Michael Goldshteyn

Bất cứ ai có thể xây dựng phương pháp này cho mac (không có alt)?
Li haonan

12

Sử dụng plugin này: https://github.com/tpope/vim-unimpaired

]pdán trên dòng dưới đây

[pdán trên dòng trên

ưu điểm:

  • hoạt động trên tất cả các văn bản được kéo dài (từ, dòng, ký tự, v.v.)
  • thụt lề văn bản đã dán để khớp với thụt lề của văn bản xung quanh nó
  • 2 tổ hợp phím thay vì 3 và các nét "dễ dàng" hơn nhiều
  • Nhanh

1
Yêu thích của tôi quá. Có thể đáng để đề cập đến bạn cần tpope/vim-unimpairedđiều này để làm việc.
alexte

1
ah tôi đã cài đặt nó rất lâu trước đây tôi quên nó. cảm ơn đã nhắc nhở!
kiêu ngạo

9

Cá nhân tôi đã bước vào Enter (CR) như thế này:

nmap <CR> o<Esc>k

... dựa trên này bài viết Vim Wikia.

Bằng cách này, tôi có thể tạo dòng mới trực tiếp từ chế độ bình thường và kết hợp điều này với việc muốn dán vào dòng mới bên dưới tôi sẽ làm:

<CR>jp

Bạn cũng có thể bỏ qua k trong nmap ở trên, tùy thuộc vào chức năng bạn thích từ Enter , vì vậy nó sẽ như vậy <CR>p.

Tôi cũng đã ghép jj vào Esc , cũng sẽ hỗ trợ trong trường hợp này. Esc là quá xa so với hàng nhà cho tầm quan trọng của nó trong vim.

Không ngắn hơn các giải pháp khác, nhưng tôi nghĩ rằng nó cảm thấy ít cồng kềnh hơn so với một số trong số họ, và nó cũng có những công dụng khác.


5

Nếu bạn đang sao chép toàn bộ một dòng rồi dán toàn bộ một dòng, hãy sử dụng Yđể kéo dòng hoặc dòng, bao gồm ngắt dòng, ở vị trí đầu tiên và pđể dán. Bạn cũng có thể sử dụng V, đó là chế độ đường trực quan , trái ngược với vchế độ trực quan.


3
Vấn đề là, đôi khi bạn chỉ đơn giản là không muốn sao chép toàn bộ một dòng ... Tôi muốn một giải pháp hoạt động cho dù tôi đã sao chép mười dòng hoặc hai từ.
static_rtti

3

Tôi có bản đồ inoremap jj <ESC>. Vì vậy, nó rất dễ dàng để chèn dòng mới với ojjOjjvà sau đó p.

Vì vậy, ojjpdán một dòng mới. Nó có thêm một cú đánh nữa o<esc>pnhưng ojjpthật dễ dàng đối với tôi.


2

Tôi tìm thấy một giải pháp thanh lịch cho việc này. Nếu bạn đang đặt thanh ghi yank vào clipboard của hệ điều hành (dù sao thì cũng tốt), với

set clipboard+=unnamed

hơn bạn có thể làm o<Ctl-v>.

Bên cạnh việc ít đột quỵ hơn, điều này cải thiện cả hai o<Esc>p:pubởi vì nó duy trì thụt lề: cả hai tùy chọn khác bắt đầu bạn ở ký tự số 0 trên dòng mới.

Hãy cẩn thận là điều này có thể hoặc không thể phụ thuộc vào hệ điều hành. Tất cả những gì tôi biết là nó hoạt động trên phiên bản OS X gần đây, nhưng clipboard chỉ là một trong nhiều cách để có được trong bảng tạm của OS.


1

Nếu bạn cũng muốn kết thúc ở chế độ chèn, có thể dán trong khi ở chế độ chèn bằng cách sử dụng CTRL-R ". https://stackoverflow.com/a/2861909/461834

Vẫn có ba tổ hợp phím, nhưng không có lối thoát và bạn lưu một tổ hợp phím nếu bạn muốn kết thúc bằng cách chèn.


1

Tôi sử dụng ánh xạ sau trong cấu hình Neovim của mình:

nnoremap <leader>p m`o<ESC>p``
nnoremap <leader>P m`O<ESC>p``

Một lời giải thích nhỏ:

  • m`: đặt dấu ở vị trí con trỏ hiện tại.
  • o<Esc>p: tạo một dòng mới bên dưới và dán văn bản vào dòng này
  • O<Esc>P: tạo một dòng mới ở trên và dán văn bản vào dòng này
  • ``: đặt con trỏ ở vị trí ban đầu

Xem :h markđể biết thêm thông tin về nhãn hiệu trong Vim.


1

Nếu bạn muốn ở trong chế độ chèn, bạn có thể làm o ctrl+o p

  • o - chèn chế độ và đi đến dòng mới
  • ctrl+o - chạy một lệnh như trong chế độ bình thường
  • p - dán

Đó là ba lần nhấn phím nhưng bạn vẫn ở chế độ chèn và cũng o ctrl+okhá nhanh nên cá nhân tôi coi nó là 2,5 tổ hợp phím.


0

Giải pháp này dường như chỉ áp dụng khi khối văn bản được sao chép bắt đầu trên một dòng mới (trái ngược với việc lấy một đoạn văn bản ở đâu đó trong một dòng), nhưng bạn luôn có thể bắt đầu bản sao của mình trên ký tự cuối cùng bạn muốn lấy, sau đó điều hướng đến ký tự cuối cùng ở cuối dòng trước khi bắt đầu khối sao chép mong muốn của bạn. Sau đó, khi bạn muốn dán nó, đặt con trỏ ở cuối dòng mà bạn muốn văn bản của mình được dán và nhấn p. Nếu tôi không giải thích, điều này sẽ mang lại hiệu quả mà bạn đang tìm kiếm.

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.