Vim тягнуть діапазон рядків


84

Я розробник C #, який нещодавно вирішив розширити свої знання про доступні мені інструменти. Перший інструмент, який я вирішив вивчити, - це Vi / Vim. Наразі все йшло добре, але є кілька питань, на які я не можу знайти відповідь:

  1. Скажімо, я хотів порвати ряд рядків. Я знаю, що існує багато способів зробити це, але я хотів би зробити це за номером рядка. Я вважав, що це буде схоже на те, як працюють замінні команди, щось на зразок 81,91y. Чи є спосіб зробити це?

  2. Я трохи збентежений gкомандою в звичайному режимі. Здається, це робить безліч речей, і я не можу насправді визначити, що робить команда g по суті. Мене бентежить, чи це команда руху або нічого типу "зловити всіх" для інших команд, які працюють у звичайному режимі. Хтось може пояснити це чи вказати мені посилання, яке дає гарне пояснення gкоманди?


1
Чи знаєте ви про команду ": help" у vim (1)?
Steve Emmerson

Так, але мені не вдалося знайти його у всіх посиланнях. Виявляється, я думав, що зроблю це в звичайному режимі, але Hometoast показав, як це потрібно робити в командному режимі. Що стосується команди g, я просто виявляю, що довідка не пов’язує все, як я очікував від інших команд.
jnadro52

3
Окрім того, я можу зробити одне повідомлення на кожне запитання.
Дана

1
Я буду робити це в майбутньому. Мене більше хвилювало перше питання, я просто думав про інше, набираючи перше.
jnadro52

Відповіді:


140

Янкові лінії 81-91

:81,91y<enter>

Якщо ваші пальці не люблять знаходити клавіші :та ,, це також спрацює (перейдіть до рядка 81, відтягніть 11 рядків)

81gg11yy 

Моє єдине використання gis 5gg. Перейти до 5-го рядка. 22gg: 22-й рядок. Як сказав Джимбо, це насправді лише модифікатор для деяких інших команд.

Для повноти ( http://vim.wikia.com/wiki/Power_of_g ) багато пояснюється, як gпрацює в командному режимі.


2
Використання великих літер також забезпечує варіації: ggпереходить до першого рядка, тоді як Gдо останнього. Крім того, 5Gпереходить до рядка 5. Позначки можна використовувати замість номерів рядків (добре для макросів), тобто: :'a,52y
NVRAM

1
Якщо ви не боїтеся клавіші Shift, 81G11Yце ще "коротше".
Йенс

1
Недоліком способу звичайного режиму є те, що ви втрачаєте своє "місце"; можна було б уявити mxдо і 'xпісля, але тоді версія командного режиму стає набагато коротшою. Хамм ... щойно я написав це, я побачив відповідь від @Asta.
Ерік Сміт

1
@WilliamRoss це фактично поміщає рядки в буфер для використання у vim, не обов'язково у вашому системному буфері обміну, куди ви можете вставити, скажімо, Блокнот за допомогою CTRL + V. Дивіться відповідне запитання: Як скопіювати / вставити текст з vi у різні програми
hometoast

1
Це мене розважає, тому що цілою причиною, за якою я шукав перше рішення, було уникати підрахунку рядків або віднімання в голові.
Пол Паркер,

22

Ви також можете скопіювати поточні рядки у своє поточне розташування курсору, використовуючи 't'.

:81,91t.<enter>

Буде вставлено рядки 81-91 під рядком, на якому знаходиться курсор.

Я дізнався про це з http://vimcasts.org, який є чудовим ресурсом про VIM.


Що t.тут означає?
CivFan

2
З мого розуміння, це tможна сприймати як tхворий чи tо, і .це адреса поточного рядка.
Аста

1
@CivFan це синонім:copy
D. Ben Knoble

11

Я також люблю використовувати параметр відносного номера рядка vim, що означає, що я можу просто ввести:

:-10,-7ya a

витягнути текст у названий буфер a.

NB Зазначення A додає те, що ви тягнете, до поточного вмісту буфера a.

Не забувайте, що ви також можете копіювати блоки тексту та переміщувати блоки тексту за допомогою подібних команд:

:-10,-7co .

означає копіювати чотири рядки тексту на 10 рядків зверху нижче під поточний рядок, і

:-10,-7mo .

означає переміщення чотирьох рядків тексту на 10 рядків зверху нижче під поточний рядок.


8

GКоманда йде на певний номер рядка, якщо вона супроводжується значенням лічильника. 81Gставить вас на рядок 81.

yКоманда може поєднуватися з рухом, як G. Тож тягнути все до рядка 91 ви можете використовувати y91G.

Разом ви отримуєте:

81Gy91G

Перейдіть до рядка 81, потім потягніть, переходячи до рядка 91.


1
Я хотів би, щоб я міг підтримати це ще не раз. Щось, що мені допомогло, було використати це, щоб притягнути до реєстру (у моєму випадку зареєструй + тобто буфер обміну):81G"+y91G
mgarey

1
@mgarey чи немає способу затягнути безпосередньо до реєстру, використовуючи синтаксис діапазону рядків? 81,91yі якось орієнтуватися на реєстр?
диплозавр

1
@diplosaurus Можливо, але я не знаю. Це звучить як запитання, яке ви можете задати на сайті vi.stackexchange.com, якщо його там ще немає або тут на SO. Мені було б цікаво. Я не фахівець Vim.
mgarey

2
@mgarey Довелося проявити творчість із пошуком у Google, але я знайшов його тут: stackoverflow.com/questions/16225366/… . :81,91y +
диплозавр

@diplosaurus :81,91y +не працює. Це працює для інших реєстрів, :81,91y aнаприклад, але, схоже, не подобається +реєстру. Це точно працює для інших людей?
ojunk

4

gнічого не робить сам по собі. Це одна з декількох мета-команд, що містить купу команд, не пов’язаних з сортою.

z - це ще одна така команда.


Дякую. Зараз я розумію, що він просто використовується для різних цілей. Коли я намагаюся вивчити ці інструменти, я намагаюся пов’язати команди з чимось, що я можу абстрагувати, щоб я запам’ятав, як правильно ним користуватися. Здається, команда g - це лише одна з речей, яку потрібно запам’ятати, щоб правильно використовувати.
jnadro52

2

Vim's :help indexописує gяк:

|g|             g{char}            extended commands, see |g| below

Прокрутіть вниз (або :help g), щоб переглянути список.


1
Я був знайомий з: help, але НЕ був знайомий з: help (команда). Це буде дуже корисно в майбутньому. Дякую, сер.
jnadro52

2

Найкращим рішенням буде ввести "візуальний режим", натиснувши v. А після виділення рядків просто скопіюйте їх, натиснувши y. Потім вставте скопійовані рядки, натиснувши p.


Не погоджуюсь, але лише донорський візуальний режим іноді так повільний.
Д. Бен Нобле,

1

На додаток до того, :91,96y aякі yрядки yanks ( ) з 91 по 96 реєструються a(вклеєні "ap), потерті рядки можуть бути додані до реєстру за допомогою:

:91,96y A

Тобто капіталізація Aреєстру спричиняє операцію додавання до реєстру aзамість перезапису. Регістр великих літер завжди працює так, наприклад, :let @A=';'додає a ;до реєструa .

Використання рядків посилань плюс (+) або мінус (-) відносно поточної позиції курсору:

:-10,+10y b

Тобто він би потягнув ( y) 21 рядок навколо поточної позиції курсору і поставив їх у реєстріb .

Відсутність введення фактично також відображає поточну позицію курсора, а це означає, що це:

:-5,y a

витягне текст із 5 рядків вище до поточної позиції курсору в названий буфер a, і:

:,+5y a

витягне 5 рядків після поточної позиції курсору в буфер a.

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

Переміщення блоків тексту навколо виглядає так:

:+10,+13m.

що означає перемістити чотири рядки, розташовані на 10 рядків перед поточним курсором, нижче поточного рядка.

Додаток

Я раніше сплутати yaв :91,95ya aбути як - то синонімом , ya{motion}де рух було поставлено 91,95. Це було неправильно, а буква "a" yaзовсім непотрібна. На мій захист я help yankне повідомляю, що yaце можливий псевдонім yank.


1
:ya- це абревіатура :yank, тому я не впевнений, як я ставлюсь до всіх рядків . Але хороша робота конденсує частину розпорошеної інформації
Д. Бен Нобле

Я теж так думав, поки не подивився :help yank. Псевдоніма yaдля yank. Правда, ти aне означає "все", технічно означає "а". Однак я волію сказати "все", хоча це має для мене більше сенсу.
Пол Паркер,

2
:[range]y[ank] [x] Yank [range] lines [into register x]квадратні дужки y[ank]вказують, що [ank]необов’язкові. :y, :yaІ :yanнеявно псевдоніми для:yank
Д. Бен Knoble

Стою виправлений :) А не потрібно. Редагуватиме відповідь для відображення.
Пол Паркер,

1
Ваш додаток приємний, але я мав на увазі саме ваш перший рядок, де ви використовуєте команду ex, :yaа не звичайну командуy
D. Ben Knoble

0

Як давній користувач Vi / Vim, я, як правило, використовую "позначки" замість номерів рядків (або "маркери рядків"). Це працює так: mє символом "позначка"; потім використовуйте будь-яку літеру, щоб ідентифікувати / назвати знак. Для повернення до позначки передмовою названої марки з однією лапкою ( 'a) Ці позначки можна використовувати як діапазон. Приклади:

File:
    <line 1>
    <line 2>
    <line 3>
    <line 4>
    <line 5>

У командному режимі перемістіть курсор на рядок 2, введіть ma. прокрутіть до рядка 4, введіть mb. Щоб витягнути від позначки а до марки б тип:

    :'a,'byank

Щоб видалити з позначки a в позначку b введіть:

    :'a,'bdel

Щоб здійснити пошук від позначки a до позначки b і замінити слово «ine» на «чорнило»:

    :'a,'bs/ine/ink/g

Щоб скопіювати позначку від a до позначки b та вставити її під поточну позицію («точка» завжди посилається на рядок, де в даний момент знаходиться курсор):

    :'a,'bco . 

Зміщення рядків коду, між позначкою від а до позначки б , одна вкладка вправо (використовуйте протилежний шеврон,, <для переміщення вліво):

    :'a,'b> 

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

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


0

Потягніть лінії від рядків від 81 до 91:

підхід 1: 81gg11yy

непогано, але для того, щоб дізнатись, скільки рядків потягнути, вам доведеться трохи попрацювати

підхід 2: 81ggто shift+vпотім, 91ggтоy

НАЙКРАЩЕ НА МОЄМУ ДУМКІ, оскільки це прямо вперед, вам потрібно знати лише очевидне, тобто з якого номера рядка на який номер рядка ви хочете потягнути

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