Відповіді:
Так. Удар 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 та джерело його@
у звичайному режимі команда, що інтерпретує вміст регістра як звичайний режим натискання клавіш (за винятком випадків, коли ви використовуєте :
регістр, який містить останню відтворену команду без початкової двокрапки: у цьому випадку вона відтворює команду так, як якщо б ви також повторно набрали двокрапку та остаточний ключ повернення).
"
у звичайному режимі команда, яка допомагає вибрати реєстр для вибивання, вставлення, видалення, виправлення тощо.
"
також є дійсним іменем реєстру (реєстр за замовчуванням, або без імені, регістр), і тому його можна передавати як аргументи для команд, які очікують імен регістрівДля вставки чогось, що є буфер обміну системи, ви можете просто використовувати SHIFT- INS.
Він працює в Windows, але я гадаю, що він добре працює і в Linux.
:!rm -rf /<cr>
, це виконає. Використовуйте натомість регістри!
shift-ins
простіше ctrl-R+*
? Це, звичайно, якщо ви знаходитесь у гвімі. Якщо ви знаходитесь в терміналі, підключеному до іншої машини, і хочете щось вставити з буфера обміну, чи знаєте ви щось краще shift-ins
? тому що регістри не працюють у цій ситуації. Будь ласка, подумайте, перш ніж коментувати, та зробіть інші речі (наприклад, зволікання).
"Я хотів би вставити витягнутий текст у командний рядок Vim."
Хоча відповідь у верхній частині голосування дуже повна, я вважаю за краще редагувати історію команд.
У звичайному режимі, введіть: q:
. Це дасть вам список останніх команд, які можна редагувати та шукати за допомогою звичайних команд vim. Ви почнете з пустого командного рядка внизу.
Точно про те, що запитує стаття, вставляючи витягнутий рядок (або витягуючи що-небудь) в командний рядок, витягуйте текст і потім: q:p
( перейдіть в режим редагування історії команд, а потім (p) виведіть свій витягнутий текст у нову команду рядок. Редагувати за бажанням, enterвиконати.
Щоб вийти з режиму історії команд, все навпаки. У звичайному режимі в історії команд введіть: :q
+enter
Щоб вставити щось із системного буфера обміну в командний рядок Vim ("командний режим"), використовуйте Ctrl+, Rпісля чого +. Для мене, принаймні, на Ubuntu, Shift+ Insне працює.
PS: Я не впевнений, чому Ctrl+, Rза яким слідує *, що теоретично те саме, що і Ctrl+ Rза ним, +здається, не завжди працює. Я шукав і виявив +версію, і, здається, працює завжди, принаймні, на моїй коробці.
У мене була подібна проблема. Я хотів, щоб вибраний текст закінчувався командою, але не покладався на його вставлення. Ось команда, для якої я намагався написати відображення:
:call VimuxRunCommand("python")
Документи для цього плагіна відображаються лише за допомогою рядкових літералів. Якщо ви спробуєте вибрати текст, який містить подвійні лапки, буде порушено наступне:
vnoremap y:call VimuxRunCommand("<c-r>"")<cr>
Щоб обійти це, ви просто посилаєтесь на вміст макросу, використовуючи @
:
vnoremap y:call VimuxRunCommand(@")<cr>
Вводить вміст безіменного реєстру в і працює з моєю подвійною цитатою та багаторядковими краями.
@
персонажа команді vimux. подумайте @
як про уникнення наступної подвійної цитати, і це трактується як реєстр, а не як регулярний символ. Визначений vnoremap
я активний у візуальному режимі, тому він перебирає вибраний текст, а потім вставляє його в команду vimux, надсилаючи його до запущеного інтерпретатора в сусідній області. дійсно чудово підходить для роботи над сценарієм і тестування невеликих його частин за допомогою декількох натискань клавіш.
ОС 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
і вставити його на загальну систему.
Для контексту ця інформація надходить із нестандартного пакету, без плагінів, без .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або середньою кнопкою миші, якщо вам потрібно щось інше.
Визнається, що це може заплутати.
"[a-z]y
: Скопіюйте текст до регістра [az]
Використовуйте :!
для переходу до команди редагування
Ctrl+ R: Дотримуйтесь ідентифікації реєстру, щоб вставити те, що ви копіюєте.
Він використовувався в CentOS 7.
Якщо у вас є два значення, об'єднані в два різні регістри (наприклад, зареєструватись a
і зареєструватись b
), ви можете просто встановити змінну c
і зробити операцію над нею.
Наприклад, :set c = str2float(@a) + str2float(@b)
а потім ви можете вставити вміст з c
будь- якого місця.
Наприклад, перебуваючи в режимі INSERT, CTRL + R
тоді введіть, =
щоб увійти до регістра виразів і просто введіть c
після знака рівності та натисніть ENTER. У вас зараз має бути загальна кількість a
і b
регістрів.
Все це можна записати в макрос та повторити!
str2float
Функція використовується , якщо ви працюєте з поплавками, якщо ви цього не зробите, ви отримаєте цілі числа замість цього.
Я не впевнений, чи це ідіоматично, але він працював для мого випадку, коли мені потрібно було додати 2 числа підряд і повторити його ще на 500 рядків.