Як вставити новий рядок з vim?


144

Мені часто доводиться вставляти деякі речі в новий рядок in vim. Що я зазвичай роблю:

o<Esc>p

Який вставляє новий рядок і переводить мене в режим вставки, ніж виходить з режиму вставки і, нарешті, вставляє.

Три натискання клавіш. Не дуже ефективно. Якісь кращі ідеї?


8
3 натискання клавіш неефективні?
gtd

60
1 або 2 було б краще :) Навіщо використовувати vim, якщо не для максимальної ефективності?
static_rtti

2
Це також призводить до додаткового нового рядка, якщо скопійований вміст закінчується в новому рядку.
Джонатан В.

1
@gtd Нормальний редактор працює з <Enter> <CV>. Два натискання клавіш.
користувач4052054

1
@ user4052054 ні, це не робить те ж саме, o / O працює де б ви не знаходилися в рядку, у звичайному редакторі ви повинні спочатку дістатися до початку чи кінця рядка. Крім того, якщо ви копіюєте цілий рядок, то вся справа просто стає одним натисканням клавіші, щоб вставити рядок, що є набагато більш поширеною пропозицією кодування.
gtd

Відповіді:


71

Незабаром після :help pцього написано:

:[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).

На жаль, воно не коротше, ніж ваше поточне рішення, якщо ви не поєднали його з якоюсь клавіатурною картою, як запропоновано в іншій відповіді. Наприклад, ви можете зіставити його на будь-яку клавішу (рівну p):

:nmap p :pu<CR>

2
Я це знаю, і я його використовую, але це не те, про що я прошу, тому що іноді те, що ти копіюєш, просто не містить у собі НЧ. Якби була команда "Вставити в новий рядок", вона працювала б незалежно від вмісту, який ви збираєтеся вставити, тому вам не доведеться думати про це.
static_rtti

5
Гаразд, :pu[t]помістить текст у новий рядок після поточного рядка, :pu[t]!поставить текст у новий рядок перед поточним рядком. Я відповідно відредагую свою відповідь. (Ура за :help p.)
Бомбе

2
Не дуже краще, ніж моє сьогоднішнє рішення, але я думаю, що це найкраща відповідь на моє запитання.
static_rtti

4
Хоча однакова кількість натискань на клавіші, я вважаю, що це відчуває себе більш ефективно. o <Esc> p відчуває себе незграбно, тоді як цього немає.
Позначити історію

2
Ви можете зіставити команду в будь-яку клавішу, включаючи саму p: :nmap p :pu<CR>Помістіть її у свій .vimrc файл і вийдіть :)
Capi Etheriel

55

Параметри:

1) Використовуйте yyдля витягання всього рядка (включаючи символ кінця рядка). pбуде вставити рядок у новий рядок після поточного та P( Shift- P) вставити вище поточного рядка.

2) Зробіть відображення: тоді це лише одна або дві клавіші:

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

3) Версія функції відображення (дійсно непотрібна, але лише для повноти):

: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
Ну, мабуть, я зроблю карту. Я просто сподівався, що може бути стандартне рішення: - / Дякую за вашу відповідь!
static_rtti

2
@AI: Використання ', p' (',' відображено як мій <Лідер>) є найкращим рішенням на мою думку. Ви навіть забезпечили просту у використанні функцію. :) Чудово!
Хтось досі використовує вас MS-DOS

30

Ви можете вставити буфер у режимі вставки, використовуючи <C-R>наступне ім'я буфера для вставки. Буфер за замовчуванням - "це ви зробите

o<C-R>"

Я виявив, що я <C-R>"дуже часто користуюся цим і пов'язаний з цим <C-F>vimrc:

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

2
Це чудово, оскільки він зберігає відступ правильним, якщо скопійований рядок не був відступним.
CornSmith

24

Це все ще використовує три натискання клавіш, але мені здається, що це простіше, ніж Esc:

o<Alt-p>

Оскільки ви знаходитесь в режимі вставки після натискання кнопки o, модифікатор Alt дозволить вам використовувати команду так, як ніби ви не були.


2
Досить зручним способом, коли ви намагаєтеся виграти що-небудь, ви вирізали всередині рядка "d $" у новій лінійці
Serhat Cevikel

Вибачте, але це не зберігає відступ, він вставляється на початку рядка.
Майкл

Чи може хтось розробити цей метод для mac (не alt)?
Li haonan

@Lihaonan Ваше питання від 8 місяців тому, сподіваюся , ви вже бачили stackoverflow.com/q/7501092/5407634
m_mlvx

12

Використовуючи цей плагін: https://github.com/tpope/vim-unimpaired

]pпасти на лінії нижче

[pпасти на лінії вище

переваги:

  • працює над усім викрученим текстом (словом, рядком, символом тощо)
  • відступи вставленого тексту, щоб відповідати відступів тексту навколо нього
  • 2 натискання клавіш замість 3 та багато "легших" ударів
  • швидко

1
Моя улюблена теж. Можливо, варто згадати, що вам це потрібно tpope/vim-unimpairedдля роботи 😉.
alextes

1
ах я встановив, що так давно я забув про це. дякую за нагадування!
крогери

9

Особисто я вказав Enter (CR) так:

nmap <CR> o<Esc>k

... на основі цієї статті Vim Wikia.

Таким чином я можу створювати нові рядки безпосередньо з звичайного режиму, і поєднуючи це з бажанням вставити на новий рядок нижче, я б це зробив:

<CR>jp

Ви також можете пропустити k у nmap вище, залежно від того, яку функціональність ви віддаєте перевагу від Enter , так що це було б просто <CR>p.

Я також знайшов jj до Esc , що також допомогло б у цій справі. Esc є занадто далеко від домашнього ряду, наскільки це важливо в vim.

Не коротше, ніж інші рішення, але я думаю, що він відчуває себе менш незграбним, ніж деякі з них, і він також має інші можливості.


5

Якщо ви копіюєте цілий рядок, потім вставляєте цілу лінію Y, в першу чергу використовуйте для обертання рядка або рядків, включаючи розрив рядка, і pвставте. Можна також використовувати режим Vвізуальної лінії на відміну від звичайного vдля візуального режиму.


3
Проблема полягає в тому, що іноді ви просто не хочете копіювати цілий рядок ... Я хотів би рішення, яке працює, чи скопіював я десять рядків або два слова.
static_rtti

3

У мене є картографування inoremap jj <ESC>. Так легко вставити новий рядок з ojjі Ojjпотім p.

тому ojjpвставте новий рядок. це ще один інсульт, o<esc>pале ojjpмені це легко.


2

Я знайшов для цього елегантне рішення. Якщо ви ставите реєстр yank в буфер обміну вашої ОС (що все одно чудово), з

set clipboard+=unnamed

ніж ти можеш зробити o<Ctl-v>.

Окрім меншої кількості обрисів, це покращується як на обох, так o<Esc>pі :puчерез те, що він зберігає відступ: обидва інші варіанти запускають вас із нульового символу в новому рядку.

Застереження полягає в тому, що це може бути або не залежати від ОС. Все, що я знаю, - це те, що він працює на останній версії OS X, але буфер обміну - це лише один із багатьох способів потрапити в буфер обміну ОС.


1

Якщо ви також хочете закінчити в режимі вставки, можна вставити його, використовуючи режим вставки CTRL-R ". https://stackoverflow.com/a/2861909/461834

Ще три натискання клавіш, але жодного втечі немає, і ви збережете натискання клавіші, якщо хочете все-таки закінчити вставку.


1

У моєму конфігурації Neovim я використовую таке відображення:

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

Невелике пояснення:

  • m`: встановити позначку в поточному положенні курсору.
  • o<Esc>p: створіть новий рядок нижче і вставте текст у цей рядок
  • O<Esc>P: створіть новий рядок вище та вставте текст у цей рядок
  • ``: поставте курсор у вихідне положення

Докладніше :h markпро марки у Vim.


1

Якщо ви хотіли залишитися в режимі вставки, можете зробити це o ctrl+o p

  • o - вставити режим і перейти до нового рядка
  • ctrl+o - запустити одну команду, як у звичайному режимі
  • p - пасти

Це три натискання клавіш, але ви залишаєтесь у режимі вставки, а також o ctrl+oдосить швидко, тому я особисто трактую це як 2,5 натискання клавіш.


0

Це рішення, мабуть, застосовується лише тоді, коли блок скопійованого тексту починається з нового рядка (на відміну від захоплення фрагмента тексту десь у межах рядка), але ви завжди можете запустити свою копію на останньому символі, який ви хочете схопити, а потім перейдіть у режим навігації до останнього символу в кінці рядка до початку бажаного блоку копіювання. Потім, коли ви хочете вставити його, помістіть курсор в кінець рядка, під яким потрібно вставити текст, і натисніть p. Якщо я не накрутив пояснення, це має забезпечити той ефект, який ви шукаєте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.