Як вставити витягнутий текст у командний рядок Vim


601

Я хотів би вставити витягнутий текст у командний рядок Vim. Це можливо?


Щоб дізнатися про особливий випадок безпосереднього виконання витягнутого тексту, див: Як запустити команду vim, що є текстом у буфері? - Супер Користувач .
користувач202729

Відповіді:


1157

Так. Удар Ctrl- Rзначить ". Якщо у вас є літерні символи управління в тому, що ви ривок, використання Ctrl- R, Ctrl- O, ".

Ось пояснення того, що можна зробити з реєстрами. Те, що ви можете зробити з реєстрами, є надзвичайним, і коли ви знаєте, як ними користуватися, ви не можете жити без них.

Реєстри - це в основному місця зберігання рядків. Vim має безліч регістрів, які працюють різними способами:

  • 0(yank register: коли ви використовуєте yв звичайному режимі, не вказуючи реєстр, текст, що закручується, переходить туди, а також до регістру за замовчуванням),
  • 1до 9(зміщення регістрів видалення, коли ви використовуєте команди, такі як cабо d, що було видалено, йде в регістр 1, те, що було в регістрі 1, переходить в регістр 2 і т.д. ),
  • "(Реєстр по замовчуванню, також відомий як безіменний регістр Це де. "Приходить Ctrl- R, "),
  • aщоб zдля власного використання (капіталізуються Aв Zякі для додавання в відповідні регістри).
  • _(діє як /dev/null(Unix) або NUL(Windows), ви можете писати на нього, але він відкидається, і коли ви читаєте з нього, він завжди порожній),
  • - (невеликий регістр видалення),
  • /(Пошук регістр шаблон оновлюється , коли ви подивіться на текст з /, ?, *або #, наприклад, ви також можете написати до нього , щоб динамічно змінювати шаблон пошуку),
  • :(зберігає останню команду, набрану VimL, Qабо через :, лише для читання),
  • +і *(системні регістри буфера обміну, ви можете написати їм, щоб встановити буфер обміну і прочитати вміст буфера обміну з них)

Дивіться :help registersповну довідку.

Ви можете в будь-який момент використовувати :registersдля відображення вмісту всіх регістрів. Синоніми та скорочення цієї команди є :display, :regі :di.

У режимі "Вставити" або "Командний рядок" Ctrl- Rплюс ім'я регістру вставляє вміст цього реєстру. Якщо ви хочете вставити їх буквально (відсутність автоматичного відступу, не перетворення керуючих символів, як 0x08у зворотному просторі тощо), ви можете використовувати Ctrl- R, Ctrl- O, зареєструвати ім’я. Див. :help i_CTRL-RТа наступні параграфи для отримання посилання.

Але ви також можете зробити наступне (і я, мабуть, забув багато застосувань для регістрів).

  • У звичайному режимі натисніть ":p. Остання команда, яку ви використовували в vim, вставляється у ваш буфер.
    Давайте розкладемо: "це команда в звичайному режимі, яка дозволяє вам вибрати, який реєстр буде використовуватися під час наступної операції вибивання, видалення чи вставки. Таким чином ":вибирається реєстр двокрапки (зберігання останньої команди). Тоді pкоманда, яку ви вже знаєте, вона вставляє вміст регістра.

    пор. :help ",:help quote_:

  • Ви редагуєте файл VIML (наприклад ваш .vimrc) і хотіли б виконати кілька послідовних рядки прямо зараз: yj:@"Enter.
    Тут, yjyanks поточний та наступний рядок (це тому, що j є лінійним рухом, але це поза сферою цієї відповіді) в регістр за замовчуванням (також відомий як регістр без назви). Потім команда :@Ex відтворює команди Ex, що зберігаються в реєстрі, наведені як аргумент, і "саме так ви посилаєтесь на неназваний регістр. Також дивіться верх цієї відповіді, яка пов’язана.

    Не плутайте "використане тут (яке є іменем реєстру) з "попереднім прикладом, який був командою у звичайному режимі.

    пор. :help :@і:help quote_quote

  • Вставте останній шаблон пошуку в файл в режимі вставки, або в командному рядку, Ctrl- R, /.

    пор. :help quote_/,help i_CTRL-R

    Слідство: Тримайте шаблон пошуку , але додати альтернативу: / Ctrl- R, / \|alternative.

  • Ви вибрали два слова в середині рядка у візуальному режимі, обмацували їх y, вони знаходяться в регістрі без назви. Тепер ви хочете , щоб відкрити нову лінію трохи нижче , де ви знаходитеся, з цими двома словами: :pu. Це скорочення для :put ". :putКоманда, як і багато команд Ex, працює тільки через підрядник.

    пор. :help :put

    Ви також могли це зробити: :call setreg('"', @", 'V')тоді p. setregФункція встановлює регістр з яких назва дано в якості першого аргументу (у вигляді рядка), ініціалізує його зі змістом другого аргументу (і ви можете використовувати регістри в якості змінних з ім'ям , @xде xце ім'я регістра в VIML), і перетворює його в режим, зазначений у третьому аргументі, Vдля рядкового, нічого для символьного та літерального ^Vдля блочного.

    пор. :help setreg(). Зворотними функціями є getreg()і getregtype().

  • Якщо ви записали макрос за допомогою qa... q, тоді :echo @aвам повідомлять, що ви ввели, і @aповторите макрос (напевно, ви це знали, дуже корисно, щоб уникнути повторюваних завдань)

    пор. :help q,help @

    Висновок з попереднього прикладу: Якщо у вас є 8goбуфер обміну, тоді @+він відтворюватиме вміст буфера обміну як макрос і таким чином перейде до 8-го байту вашого файлу. Насправді це буде працювати майже з кожним реєстром. Якщо ваш останній вставлений рядок був ddу режимі "Вставка", рядок @.(оскільки .реєстр містить останню вставлену рядок) видалить рядок. (Вім документація неправильно в цьому відношенні, так як в ньому говориться , що регістри #, %, :і .буде працювати тільки з p, P, :putі Ctrl- R).

    пор. :help @

    Не плутати :@(команда, яка відтворює команди Vim з реєстру) та @(команда звичайного режиму, яка відтворює команди звичайного режиму з реєстру).

    Помітним винятком є @:. Реєстр команд не містить початкової двокрапки, не містить кінцевого повернення каретки. Однак у звичайному режимі @:буде виконувати те, що ви очікуєте, інтерпретуючи регістр як команду Ex, не намагаючись відтворити його у звичайному режимі. Отже, якщо ваша остання команда була :e, реєстр містить, eале @:перезавантажить файл, а не переходити до кінця слова.

    пор. :help @:

  • Покажіть , що ви будете робити в нормальному режимі перед запуском: @='dd' Enter. Як тільки ви натискаєте =клавішу, Vim переходить до оцінки виразів: коли ви вводите вираз і натискаєте Enter, Vim обчислює його, а результат виступає як вміст реєстру. Звичайно, регістр =є лише для читання та одномоментного. Кожен раз, коли ви починаєте його використовувати, вам доведеться вводити новий вираз.

    пор. :help quote_=

    Висновок: Якщо ви редагуєте команду, і розумієте, що вам потрібно буде вставити у ваш командний рядок якийсь рядок із вашого поточного буфера: не натискайте Esc! Використання Ctrl- R =getline(58) Enter. Після цього ви повернетесь до редагування командного рядка, але він вставив вміст 58-го рядка.

  • Визначте шаблон пошуку вручну: :let @/ = 'foo'

    пор. :help :let

    Зауважте, що для цього вам не потрібно бігти /за схемою. Однак вам потрібно подвоїти всі одиничні цитати.

  • Скопіювати всі рядки , що починаються з foo, а потім все рядки , що містять barв буфер обміну, ланцюги наступні команди: qaq(скидає регістра зберігання порожній макрос всередині нього), , , .:g/^foo/y A:g/bar/y A:let @+ = @a

    Використання імені реєстру капіталів змушує регістр працювати в додатку

    Краще, якщо його Qще не було перезапущено mswin.vim, запустіть режим Ex, за допомогою Qланцюга введіть «команди двокрапки», які насправді краще називати «Ex команди», і поверніться до звичайного режиму, набравши visual.

    пор. :help :g, :help :y,:help Q

  • Двічі простір файл: :g/^/put _. Це ставить вміст реєстру чорної діри (порожній під час читання, але при /dev/nullзаписі, поводиться так ) по рядку, після кожного рядка (адже кожен рядок має початок!)

  • Додайте рядок , що містить fooперед кожним рядком: :g/^/-put ='foo'. Це розумне використання регістра виразів. Тут -є синонім .-1(пор. :help :range). Оскільки :putтекст ставиться після рядка, ви мусите чітко сказати йому, що він діє на попередній.

  • Скопіюйте весь буфер в буфер обміну: :%y+.

    пор. :help :range(для %частини) та :help :y.

  • Якщо ви макрос записали макрос, ви можете ввести :let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter 'та відредагувати його. Це дозволить змінити вміст макросу, що зберігається в регістрі a, і тут показано, як ви можете використовувати регістр виразів для цього.

  • Якщо ви це зробили dddd, ви можете зробити це uuдля того, щоб скасувати. З pвами можна отримати останній видалений рядок. Але насправді ви також можете відновити до 9 делетів за допомогою регістрів @1через @9.

    Ще краще, якщо ви це зробите "1P, то .в звичайному режимі буде грати "2Pтощо.

    пор. :help .і:help quote_number

  • Якщо ви хочете вставити поточну дату в режимі вставки: Ctrl- R=strftime('%y%m%d')Enter.

    пор. :help strftime()

Ще раз, що може бентежити:

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

  • " у звичайному режимі команда, яка допомагає вибрати реєстр для вибивання, вставлення, видалення, виправлення тощо.

  • " також є дійсним іменем реєстру (реєстр за замовчуванням, або без імені, регістр), і тому його можна передавати як аргументи для команд, які очікують імен регістрів

205
Чи немає значка "Відношення довжини 100/1 між відповіддю та питанням?" :)
Бенуа

8
Це чудова відповідь, але це приблизно 900 слів, не вистачає 1400 :) :)

19
Ця відповідь змінила спосіб використання vim. Дякую Бенуа
P. Myer Nore

11
Не забувайте: reg, який перелічить усі регістри разом із їх вмістом
eugenevd

3
В останніх версіях vim видалення, менші за один рядок, переходять до "реєстру малих видалень" замість того, щоб переходити до нумерованих регістрів. Список літератури: Vi і Vim , Vi і Vim , Reddit
Christian Long

48

Для вставки чогось, що є буфер обміну системи, ви можете просто використовувати SHIFT- INS.

Він працює в Windows, але я гадаю, що він добре працює і в Linux.


7
Так, працює і в Linux. Тестували під GNOME як Vim, так і GVim.
Теулас

3
Це фактично подає папір до Vim як введення на клавіатурі, тому, якщо ви перебуваєте у звичайному режимі та вставляєте :!rm -rf /<cr>, це виконає. Використовуйте натомість регістри!
lericson

4
@lericson Чи не сказав я у своїй відповіді, що це корисно для чогось, що є на клавіатурі системи? Я не розумію протиправного голосу. А для вас приклад, серйозно? У вас це справді є в буфері обміну? І ти не вважаєш, що набрати текст shift-insпростіше ctrl-R+*? Це, звичайно, якщо ви знаходитесь у гвімі. Якщо ви знаходитесь в терміналі, підключеному до іншої машини, і хочете щось вставити з буфера обміну, чи знаєте ви щось краще shift-ins? тому що регістри не працюють у цій ситуації. Будь ласка, подумайте, перш ніж коментувати, та зробіть інші речі (наприклад, зволікання).
скептик

Я думаю, що це дезінформація, і я діяв на тому суді.
lericson

1
Не працює для мене. Я просто отримую "<S-Insert>" доданий до мого командного рядка. Можливо, мені чогось не вистачає. (Ubuntu 19.04 / 2: 8.1.0320-1ubuntu3.1).
Макс Вотерман

39

"Я хотів би вставити витягнутий текст у командний рядок Vim."

Хоча відповідь у верхній частині голосування дуже повна, я вважаю за краще редагувати історію команд.

У звичайному режимі, введіть: q:. Це дасть вам список останніх команд, які можна редагувати та шукати за допомогою звичайних команд vim. Ви почнете з пустого командного рядка внизу.

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

Щоб вийти з режиму історії команд, все навпаки. У звичайному режимі в історії команд введіть: :q+enter


1
якщо ви вже змінюєте існуючу команду і не натискали 'q:', натисніть ctrl + f, і це дозволить редагувати історію команд.
Глина

14

Щоб вставити щось із системного буфера обміну в командний рядок Vim ("командний режим"), використовуйте Ctrl+, Rпісля чого +. Для мене, принаймні, на Ubuntu, Shift+ Insне працює.

PS: Я не впевнений, чому Ctrl+, Rза яким слідує *, що теоретично те саме, що і Ctrl+ Rза ним, +здається, не завжди працює. Я шукав і виявив +версію, і, здається, працює завжди, принаймні, на моїй коробці.


2
Різниця між Ctrl-r + і Ctrl-r * полягає в тому, що перший є звичайним буфером обміну, але в Linux існує другий тип буфера обміну, який називається "первинний", який представляє останній обраний текст (середня кнопка вставки миші з нього) . Це не доступно в Windows або MAC, хоча
Matias Thayer

13

Варто також зазначити, що регістри yank такі самі, як макробуфери. Іншими словами, ви можете просто записати всю свою команду у свій документ (включаючи вкладений фрагмент), потім "byвідтягнути її до bреєстру, а потім запустити @b.


1

У мене була подібна проблема. Я хотів, щоб вибраний текст закінчувався командою, але не покладався на його вставлення. Ось команда, для якої я намагався написати відображення:

:call VimuxRunCommand("python")

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

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

Щоб обійти це, ви просто посилаєтесь на вміст макросу, використовуючи @:

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

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


Я думаю, що в вашому останньому прикладі відсутнє ". Можливо, ви мали на увазі VimuxRunCommand (" @ ").
kd8azz

Це надішле @персонажа команді vimux. подумайте @як про уникнення наступної подвійної цитати, і це трактується як реєстр, а не як регулярний символ. Визначений vnoremapя активний у візуальному режимі, тому він перебирає вибраний текст, а потім вставляє його в команду vimux, надсилаючи його до запущеного інтерпретатора в сусідній області. дійсно чудово підходить для роботи над сценарієм і тестування невеликих його частин за допомогою декількох натискань клавіш.
Conrad.Dean

1

ОС X

Якщо ви використовуєте Vim в Mac OS X, він, на жаль, поставляється зі старшою версією та не відповідає варіантам буфера обміну. На щастя, Homebrew може легко вирішити цю проблему.

Встановити Vim:

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

Встановіть GUI-версію Vim:

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

Перезапустіть термінал, щоб він набув чинності.


Додайте наступний рядок до ~/.vimrc
set clipboard=unnamed

Тепер ви можете скопіювати рядок у Vim з yyі вставити його на загальну систему.


1

Для контексту ця інформація надходить із нестандартного пакету, без плагінів, без .vimrc Vim 7.4 в Linux Mint із параметрами за замовчуванням.

Ви завжди можете вибрати текст за допомогою миші (або використовуючи Vабо vрозміщуючи виділення у "* регістрі) та вставити його в командний рядок за допомогою Shift+ Ctrl+v .

Введення Ctrl+ rу командному рядку спричинить запит на ім’я регістра. таким чином, набравши, :CTRL-r*буде розміщувати регістр вмісту * у командному рядку. Він вставить будь-який регістр, а не лише "*. Див:help c_CTRL-R .

Крім того, середня кнопка миші вставить у командний рядок.

Подивитися :help->quote-plus опис того, як X Window стосується вибору. Навіть у звичайному нестандартному Vim (знову ж таки, у Vim 7.4 у Linux Mint, все одно) будь-який вибір, зроблений лівою кнопкою миші, можна вставити у командний рядок із середньою кнопкою миші.

Крім того, середня кнопка миші також вставить текст, вибраний у Vim, у безліч інших програм X Window, навіть у GUI (наприклад, Firefox та Thunderbird ) та вставляти текст у командний рядок, також можливо, коли текст був обраний з інших програм .

Див.: Довідка-> вибір x11 для додаткової інформації.

тл; д-р

Спробуйте спочатку: CTRL-r підхід, а потім скористайтеся Shift+ Ctrl+ vабо середньою кнопкою миші, якщо вам потрібно щось інше.

Визнається, що це може заплутати.


0
  1. "[a-z]y: Скопіюйте текст до регістра [az]

  2. Використовуйте :!для переходу до команди редагування

  3. Ctrl+ R: Дотримуйтесь ідентифікації реєстру, щоб вставити те, що ви копіюєте.

Він використовувався в CentOS 7.


Що означає "Він використовується для CentOS 7." ?
Пітер Мортенсен

0

Якщо у вас є два значення, об'єднані в два різні регістри (наприклад, зареєструватись aі зареєструватись b), ви можете просто встановити змінну cі зробити операцію над нею.

Наприклад, :set c = str2float(@a) + str2float(@b)а потім ви можете вставити вміст з cбудь- якого місця.

Наприклад, перебуваючи в режимі INSERT, CTRL + Rтоді введіть, =щоб увійти до регістра виразів і просто введіть cпісля знака рівності та натисніть ENTER. У вас зараз має бути загальна кількість aі bрегістрів.

Все це можна записати в макрос та повторити!

str2floatФункція використовується , якщо ви працюєте з поплавками, якщо ви цього не зробите, ви отримаєте цілі числа замість цього.

Я не впевнений, чи це ідіоматично, але він працював для мого випадку, коли мені потрібно було додати 2 числа підряд і повторити його ще на 500 рядків.

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