Як вставити текст на початку багаторядкового вибору в vi / Vim


423

Як у Vim як вставити символи на початку кожного рядка у виділеному?

Наприклад, я хочу прокоментувати блок коду, передчуваючи //на початку кожного рядка, припускаючи, що система мого коментаря моєю мовою не дозволяє блокувати коментування, як /* */. Як би я це зробив?

Відповіді:


748
  • Натисніть Esc щоб перейти до "командного режиму"
  • Використовуйте Ctrl+, Vщоб увійти в режим візуального блоку
  • Перемістіть Up/, Downщоб вибрати стовпці тексту в рядках, які ви хочете коментувати.
  • Потім натисніть Shift+ iі введіть текст, який ви хочете вставити.
  • Потім натисніть Esc, почекайте 1 секунду, і вставлений текст з’явиться у кожному рядку.

Для отримання додаткової інформації та читання перегляньте " Вставлення тексту в декількох рядках " у Вікі-поради Вім.


6
Єдиний об'єм цього питання полягає в тому, що, здається, Ctrl + V переосмислено в GVIM.
Йордан Пармер

14
Не для мене (на Linux) це не так
pixelbeat

23
Ви можете використовувати Ctrl-Q як заміну в gVim (як: довідка Ctrl-V пояснює), але вам потрібно використовувати hjkl для навігації в цьому режимі, а не клавішами зі стрілками
Гарет

9
Якщо ваш ctrl-v перекрито у Windows gvim, вам слід відредагувати глобальний vimrc, щоб зупинити включення mswin.vim.
сірий

18
Будь-яка ідея, чому це не зробить нічого після натискання esc? Я чекав , як 10 секунд , то станеться менш ніж на сто рядків - Ніколи не заперечуєте, я штовхав Shift + vНЕ CTRL + v. @ vkaul11 Напевно, те саме, що ти робив lol
Tek

186

Це замінює початок кожного рядка на "//":

:%s!^!//!

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

:'<,'>s!^!//!

Зауважте, що gv(у звичайному режимі) відновлюється останній візуальний вибір, це час від часу корисно.


3
Дякую! Має загальний сенс. А вилучення тексту йде так: '<,'> s! ^ // !!
Джордан Пармер

4
Яке значення знаків оклику у наведеній вище відповіді? (:% s! ^! //!)
Генрік К

19
@HKK, як правило, використовується символ прямої косої риски / як деліметр для команди пошуку та заміни. У цьому випадку ми вставляємо пряму косу рису як частину пошуку та заміни, тому використовуємо альтернативний деліметр, а саме знак оклику!
кібермонах

+1 Це працює у VsVim, де (Ctrl + V) (Shiift + I) Esc не працює.
Сет Рено

4
+1, не мав уявлення, що ти можеш використовувати щось інше в якості роздільника регулярних виразів (тут я використовував /і мав бігти //в, :s/^/\/\/а не писати :s!^!//)
Hashbrown

83

Загальна схема пошуку та заміни:

:s/search/replace/

Замінює перше виникнення "пошуку" на "Замінити" для поточного рядка

:s/search/replace/g

Замінює всі випадки "пошуку" на "замінити" для поточного рядка, "g" - скорочення "global"

Ця команда замінить кожне виникнення "пошуку" на "Замінити" лише для поточного рядка. % Використовується для пошуку по всьому файлу. Щоб інтерактивно підтвердити кожну заміну, додайте "c" для підтвердження:

:%s/search/replace/c

Інтерактивне підтвердження, що замінює "пошук" на "Замінити" для всього файлу

Замість символу% ви можете використовувати діапазон номерів рядка (зауважте, що символ '^' є спеціальним символом пошуку для початку рядка) :

:14,20s/^/#/

Вставляє символ "#" на початку рядків 14-20

Якщо ви хочете використовувати інший символ коментаря (наприклад //), то змініть роздільник команди:

:14,20s!^!//!

Вставляє послідовність символів '//' на початку рядків 14-20

Або ви завжди можете просто уникнути // символів, таких як:

:14,20s/^/\/\//

Вставляє послідовність символів '//' на початку рядків 14-20

Якщо ви не бачите в своєму редакторі номери рядків, просто введіть наступне

:set nu

щоб видалити початок #: замість: 14,20s / # / ^ /, слід використовувати: 14,20s / # //
cn1h

1
@ cn1h Я думаю, що це замінить і інші #в рядку. Ви повинні використовувати ^#замість цього.
ankush981

Дякуємо за пояснення основ. Добре знати, чому щось відбувається.
didierCH

38

Ще один спосіб, який може бути простішим для новачків:

 some█
 code
 here

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

gg

і введіть наступне, щоб увійти в режим вставки та додати текст:

I / / Space

 // █some
 code
 here

Натисніть, Escщоб повернутися до командного режиму та скористатися графіком:

j . j .

 // some
 // code
 //█here

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


3
Це дійсно просто :). Якщо у вас виникають проблеми, це може бути через те, що ви набираєте смугу (інший символ вашим \) |замість великої літери I. Я подумав, що це |спочатку.
кокедуд

1
Якщо я роблю "5." він видаляє 5 символів з того самого рядка. Як змусити її видалити відразу 5 символів з кожного рядка?
Рахул Прасад

1
@RahulPrasad Скажімо, у вас є 25 рядків, тоді, починаючи в передній частині першого рядка, просто запишіть 5xj в реєстр і відтворюйте цей реєстр 24 рази, наприклад: qa5xjq25 @ a Але було б краще, якщо ви опублікували це як фактичне запитання якщо він уже не існує ...
дев'ять сіток

26

І ще один спосіб:

  • Перехід до початку рядка
  • увійти в режим візуального блоку ( CTRL- v)
  • виберіть потрібні лінії (рухаючись вгору / вниз з j/ kабо перестрибуючи на лінію з [рядком] G)
  • натиснути I (це капітал i)
  • введіть символ (и) коментарів
  • натиснути ESC

20

Це додається #на початку кожного рядка:

:%s/^/#/

І люди перестануть скаржитися на вашу відсутність належних сценаріїв коментування.


2
Що робити, якщо ви хочете додати номер # лише у вибраних (або декількох) рядках
Рахул Прасад

15

Якщо ви хочете отримати надто фантазії про це, покладіть це у свій .vimrc:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

Потім, коли в візуальному режимі, ви можете натиснути \cна з omment блоку і \uдо ц ncomment його. Звичайно, ви можете змінити ці комбінації клавіш на будь-які.


Оновлено, оскільки воно запровадило щось нове - vmap!
ankush981

11

Ще один спосіб:

:'<,'>g/^/norm I//

/^/це просто макетний шаблон, який відповідає кожному рядку. normдозволяє виконувати наступні команди у звичайному режимі. I//говорить, щоб увійти в режим вставки під час переходу курсору до початку рядка, а потім вставити наступний текст (два косої риски).

:g часто зручно робити щось складне в декількох рядках, де ви можете перейти між декількома режимами, видалити або додати рядки, перемістити курсор навколо, запустити купу макросів тощо. відповідати шаблону.


1
насправді команда: g не потрібна. Це зробить:: <<, '> норма I //
Кібер Олівейра

1
І: s краще використовувати і в цьому випадку.
сірий

Це найкорисніша відповідь.
Мирний

3

Для коментування блоків коду мені подобається плагін NERD Commenter .

Виберіть текст:

Shift-V
...select the lines of text you want to comment....

Коментар:

,cc

Відлучення:

,cu

Або просто перемкніть стан коментаря для рядка чи блоку:

,c<space>

2

Я можу порекомендувати плагін EnhCommentify .

напр. покладіть це на свій vimrc:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

Ви можете коментувати / коментувати (вибрані) рядки за допомогою ", c"


3
Ви також можете скористатися Nerd Commenter за адресою vim.org/scripts/script.php?script_id=1218
Nathan Fellman

1

Позначте область для коментаря як візуальний блок ( <C-V)

і робити c#<ESC>p

  1. cповісити його на "#"
  2. повернути його назад

Якщо ви робите це часто, визначте скорочення (приклад \q) у своєму .vimrc

:vmap \q c#<ESC>p

1

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

  1. vip: виберіть і позначте весь абзац
  2. shift-i: вставити текст на початку рядка
  3. escape: залиште режим вставки / введіть звичайний режим [початок рядка все ще вибрано]
  4. escape: зніміть початок рядка

0

Щоб вставити "ABC" на початку кожного рядка:

1) Перейдіть до командного режиму

2):% норма I ABC


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