Який ваш найпродуктивніший ярлик із Vim?


1126

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

Єдині дві речі, про які вам слід піклуватися, коли ви говорите про швидкість (можливо, ви їх недостатньо дбаєте, але вам слід):

  1. Використання лівої та правої руки - це найшвидший спосіб використання клавіатури.
  2. Ніколи не торкатися миші - другий спосіб бути максимально швидким. Рухи руки, захоплення миші, переміщення та повернення її до клавіатури потребують віків (і вам часто доводиться дивитися на клавіатуру, щоб переконатися, що ви правильно повернули руку в потрібне місце)

Ось два приклади, які демонструють, чому я набагато менш продуктивний з Vim.

Скопіюйте / виріжте та вставте. Я роблю це постійно. З усіма сучасними редакторами ви натискаєте Shift лівою рукою, а ви переміщуєте курсор правою рукою, щоб вибрати текст. Потім Ctrl+ Cкопії, ви переміщуєте курсор і Ctrl+ Vвставки.

З Вімом це жахливо:

  • yy скопіювати один рядок (ви майже ніколи не хочете весь рядок!)
  • [number xx]yyкопіювати xxрядки в буфер. Але ти ніколи точно не знаєш, чи вибрав ти те, що хотів. Мені часто доводиться робити [number xx]ddте , uщоб скасувати!

Ще один приклад? Пошук і заміна

  • У PSPad : Ctrl+ fвведіть те, що потрібно шукати, а потім натисніть Enter.
  • У Vim: /введіть те, що потрібно шукати, а якщо \перед кожним спеціальним символом є якісь спеціальні символи, натисніть Enter.

І все з Вімом так: здається, я не знаю, як правильно впоратися з цим.

NB: Я вже прочитав Vim шахрайки лист :)

Моє запитання:

Який спосіб використання Vim робить вас більш продуктивним, ніж із сучасним редактором?


"Використання альтернативно лівої та правої руки - це найшвидший спосіб використання клавіатури." Не для мене, як не дивно. Коли я можу набрати слово однією рукою, я вважаю, що я набагато швидше.
Бен Мордехай

Відповіді:


2860

Ваша проблема з Vim полягає в тому, що ви не громіть vi .

Ви згадуєте різання yyі скаржитеся, що майже ніколи не хочете різати цілі лінії. Насправді програмісти, редагуючи вихідний код, дуже часто хочуть працювати над цілими рядками, діапазонами рядків і блоками коду. Однак yyце лише один із багатьох способів перетягування тексту в буфер анонімної копії (або "реєстрація", як це називається in vi ).

"Дзен" vi полягає в тому, що ти розмовляєш мовою. Початкова y- дієслово. Заява yyє синонімом для y_. Це yвдвічі збільшується для полегшення набору тексту, оскільки це така звичайна операція.

Це також можна виразити як dd P(видалити поточний рядок і вставити копію на місце; залишити копію в анонімному реєстрі як побічний ефект). В yі d«дієслова» приймати будь - якого руху в якості «суб'єкта». Таким чином yW, "yank звідси (курсор) до кінця поточного / наступного (великого) слова" і y'a"yank звідси до рядка, що містить позначку" a ".

Якщо ви розумієте лише основні рухи курсору вгору, вниз, вліво та вправо, то vi буде для вас не продуктивнішим, ніж копія «блокнота». (Гаразд, ви все одно матимете підсвічування синтаксису та можливість обробляти файли, розміри яких більший за загадку ~ 45 Кб або близько того; але працюйте зі мною тут).

vi має 26 "знаків" та 26 "регістрів". Позначення встановлюється в будь-якому місці курсору за допомогою mкоманди. Кожен знак позначається однією малою літерою. Таким чином, maвстановлює позначку ' a ' поточному розташуванню та mzвстановлює позначку ' z '. Ви можете перейти до рядка, що містить позначку, за допомогою команди '(одна цитата). Таким чином, 'aпереходить до початку рядка, що містить позначку ' a '. Ви можете переміститися в точне місце розташування будь-якої марки за допомогою команди `(backquote). Таким чином, `zбуде переміщено безпосередньо до точного місця знака ' z '.

Оскільки це "рухи", вони також можуть бути використані в якості предметів для інших "тверджень".

Отже, одним із способів вирізати довільний відбір тексту буде скидання позначки (я зазвичай використовую " a " як мій "перший" знак, " z " як наступний знак, " b " як інший, і " e " як ще інший (я не пам'ятаю, щоб коли-небудь інтерактивно використовував більше чотирьох знаків за 15 років використання vi ; створюється власна конвенція щодо того, як знаки та регістри використовуються макросами, які не порушують чийсь інтерактивний контекст). на інший кінець потрібного нам тексту; ми можемо починати з будь-якого кінця, це не має значення. Тоді ми можемо просто використовувати d`aдля вирізання або y`aкопіювання. Таким чином, весь процес має 5 натискань клавіш накладними (шість, якщо ми починаємо з "вставити" "режим і потрібноEscвихідний режим команд). Після того, як ми вирізати або копіювати потім вставити в копії є Натискання клавіші: p.

Я кажу, що це один із способів вирізати чи скопіювати текст. Однак це лише одна з багатьох. Часто ми можемо більш коротко описати діапазон тексту, не переміщуючи курсор навколо і не скидаючи позначку. Наприклад, якщо я перебуваю в абзаці тексту, я можу використовувати {і }переміщення до початку або в кінці абзацу відповідно. Отже, для переміщення абзацу тексту я вирізав його за допомогою { d}(3 натискання клавіш). (Якщо у мене вже є перший або останній рядок абзацу, я можу просто використовувати d}або d{відповідно.

Поняття "абзац" є типовим для інтуїтивно зрозумілого. Таким чином, він часто працює як для коду, так і для прози.

Часто ми знаємо деякий шаблон (регулярний вираз), який позначає той чи інший кінець тексту, в якому нас цікавлять. Пошук вперед або назад - це рухи in vi . Таким чином, вони також можуть бути використані як "суб'єкти" в наших "висловлюваннях". Тож я можу використовувати d/fooдля вирізання з поточного рядка до наступного рядка, що містить рядок "foo", і y?barкопіювати з поточного рядка до останнього (попереднього) рядка, що містить "bar". Якщо я не хочу цілі рядки, я все ще можу використовувати рухи пошуку (як власні висловлювання), опускати мітку (и) та використовувати `xкоманди, як описано раніше.

Окрім «дієслів» та «предметів» vi також має «предмети» (у граматичному значенні цього терміна). Поки що я описав лише використання анонімного реєстру. Однак я можу використовувати будь-який з 26 "іменованих" регістрів, префіксуючи посилання "об'єкт" на "(модифікатор подвійної лапки). Таким чином, якщо я використовую, "addя вирізаю поточний рядок у регістрі ' a ', а якщо я використовую, "by/fooто я перебираю копію тексту звідси в наступний рядок, що містить "foo", в регістр ' b '. Щоб вставити з регістра, я просто вставлю префікс в тій же послідовності модифікаторів: вставляє "apкопію " a " регістру"bPвставляє копію з " b " до поточного рядка.

Це поняття "префікси" також додає аналоги граматичних "прикметників" та "прислівників" до нашої мови "маніпулювання текстом". Більшість команд (дієслів) та руху (дієслова чи об'єкти, залежно від контексту) також можуть приймати числові префікси. Таким чином. 3Jозначає "приєднатися до наступних трьох рядків" і d5}означає "видалити з поточного рядка через кінець п’ятого абзацу вниз звідси".

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


Вибірка більш досконалих трюків:

Існує ряд :команд, особливо :% s/foo/bar/gглобальна техніка заміни. (Це не вдосконалено, але інші :команди можуть бути). Весь :набір команд був історично успадкований попередніми втіленнями vi як ed (редактор рядків), а пізніше екс- утиліти (розширений редактор рядків). Насправді vi так названий, тому що це візуальний інтерфейс до колишнього .

:команди зазвичай працюють над рядками тексту. ed та ex були написані в епоху, коли екрани терміналів були рідкісними, і багато терміналів були пристроями "телетайпу" (TTY). Тож було прийнято працювати над друкованими копіями тексту, використовуючи команди через надзвичайно стислий інтерфейс (загальна швидкість з'єднання становила 110 бод, або, приблизно, 11 символів в секунду - що повільніше, ніж швидка друкарка; лаги були поширеними на багатокористувацькі інтерактивні сеанси; крім того, часто виникала мотивація до збереження паперу).

Отже, синтаксис більшості :команд включає адресу або діапазон адрес (номер рядка), за якими слідує команда. Звичайно, можна використати буквальні номери рядків: :127,215 s/foo/barщоб змінити перше виникнення "foo" на "bar" на кожному рядку між 127 та 215. Можна також використовувати деякі абревіатури, такі як .або $для поточного та останнього рядків відповідно. Можна також використовувати відносні префікси +та -посилатися на зсуви після або перед лінією вилікування відповідно. Таким чином: :.,$jозначає "з поточного рядка до останнього рядка, з'єднайте їх усіх в один рядок". :%є синонімом :1,$(усі рядки).

Команди :... gта :... vкоманди несуть певне пояснення, оскільки вони неймовірно потужні. :... gє префіксом "глобально", що застосовує наступну команду до всіх рядків, які відповідають шаблону (регулярний вираз), при цьому :... vзастосовує таку команду до всіх рядків, які НЕ відповідають заданому шаблону ("v" від "conVerse"). Як і у випадку з іншими колишніми командами, вони можуть бути встановлені префіксом шляхом адресації / діапазону посилань. Таким чином, :.,+21g/foo/dозначає "видалити будь-які рядки, що містять рядок" foo ", з поточного через наступні 21 рядок", а :.,$v/bar/dозначає "звідси до кінця файлу, видалити будь-які рядки, які не містять рядок" bar ".

Цікаво, що загальна команда grep для Unix насправді була натхненна цією командою ex (і названа так, як вона була задокументована). Екс команда :g/re/p(Grep) був спосіб , яким вони задокументовані , як «глобально» «друк» рядки , що містять «регулярний вираз» (ре). Коли використовувались ed та ex , :pкоманда була однією з перших, яку хтось дізнався, і часто перша, яка використовується під час редагування будь-якого файлу. Так ви надрукували поточний вміст (як правило, лише одну сторінку, заповнену за один раз, використовуючи :.,+25pчи якийсь такий).

Зауважте, що :% g/.../dабо (його аналог reVerse / conVerse: :% v/.../dнайпоширеніші схеми використання. Однак є кілька інших exкоманд, які варто пам’ятати:

Ми можемо використовувати mдля переміщення ліній і jприєднання ліній. Наприклад, якщо у вас є список і ви хочете відокремити всі речі, що відповідають (або, навпаки, НЕ збігаються з деяким шаблоном), не видаляючи їх, то ви можете використовувати щось на зразок: :% g/foo/m$... і всі рядки "foo" будуть переміщені до кінець файлу. (Зверніть увагу на іншу пораду щодо використання кінця файлу як місця для подряпин). Це збереже відносний порядок усіх рядків "foo", вилучивши їх з решти списку. (Це було б рівнозначно виконувати щось на кшталт: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d(скопіюйте файл у власний хвіст, відфільтруйте хвіст grepі видаліть усі речі з голови).

Для приєднання рядків зазвичай я можу знайти шаблон для всіх рядків, які потрібно приєднати до попередника (наприклад, у всіх рядках, які починаються з "^", а не "^ *" у списку куль). У такому випадку я б використав: :% g/^ /-1j(для кожного відповідного рядка переходьте на один рядок і приєднайтесь до них). (До речі: для маркованих списків , намагаючись знайти кульові лінії і приєднатися до іншого не працює з кількох причин ... він може приєднатися до однієї пулі лінії до іншої, і він не буде вступати в будь-який кульової лінії для всіх з його продовження; він буде працювати тільки в парі на матчах).

Майже непотрібно згадувати, що ви можете використовувати нашого старого друга s(заміну) з командами gта v(global / converse-global). Зазвичай вам цього не потрібно. Однак розглянемо певний випадок, коли потрібно здійснити заміну лише на лініях, що відповідають деякому іншому шаблону. Часто ви можете використовувати складний візерунок із захопленнями та використовувати зворотні посилання, щоб зберегти частини рядків, які НЕ хочете змінювати. Однак, часто буде простіше відокремити матч від заміни: :% g/foo/s/bar/zzz/g- для кожного рядка, що містить "foo", замініть усі "bar" на "zzz". (Щось на зразок:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/gпрацюватиме лише у випадках, коли ті випадки "bar", які були визначені "foo" на тому ж рядку; це вже недостатньо вигідно, і його доведеться ще більше гнати, щоб спіймати всі випадки, коли "бар" передував "foo")

Справа в тому , що є більше , ніж просто p, sі dрядки в exнаборі команд.

В :адресі може також ставитися до позначок. Таким чином, ви можете використовувати: :'a,'bg/foo/jщоб приєднати будь-який рядок, що містить рядок foo, до його наступного рядка, якщо він лежить між рядками між знаками ' a ' та ' b '. (Так, всі попередні exприклади команд можуть бути обмежені підмножинами рядків файлу шляхом префіксації цих видів виразів адресації).

Це досить незрозуміло (я використовував щось подібне лише кілька разів за останні 15 років). Однак я вільно визнаю, що я часто робив ітеративні та інтерактивні речі, які, можливо, могли бути зроблені ефективніше, якби я знайшов час, щоб продумати правильний заклик.

Ще одна дуже корисна команда vi або ex - :rце читати вміст іншого файлу. Таким чином: :r fooвставляє вміст файла під назвою "foo" у поточному рядку.

Більш потужною є :r!команда. Це читає результати команди. Це те саме, що призупиняти сеанс vi , виконувати команду, перенаправляти її вихід у тимчасовий файл, поновлювати сеанс vi та читати вміст із темп. файл.

Ще більш потужними є команди !(bang) та :... !( ex bang) команди. Вони також виконують зовнішні команди та читають результати у поточному тексті. Однак вони також фільтрують виділення нашого тексту за допомогою команди! Це ми можемо сортувати всі рядки у нашому файлі за допомогою 1G!Gsort( Gце команда vi "goto"; вона за замовчуванням переходить до останнього рядка файла, але може бути встановлена ​​префіксом за номером рядка, таким як 1, перший рядок). Це еквівалентно колишньому варіанту :1,$!sort. Письменники часто використовують !з Unix FMT або складіть утиліти для переформатування або «слово» упаковка вибору тексту. Дуже поширений макрос{!}fmt(переформатувати поточний параграф). Інколи програмісти використовують його для запуску свого коду або просто його частини за допомогою відступів чи інших інструментів переформатування коду.

Використання команд :r!і !означає, що будь-яка зовнішня утиліта чи фільтр може розглядатися як розширення нашого редактора. Я періодично використовував їх із сценаріями, які витягували дані з бази даних, або з командами wget або lynx, які витягували дані з веб-сайту, або з командами ssh, які витягували дані з віддалених систем.

Ще одна корисна команда ex:so (скорочена для :source). Це читає вміст файлу у вигляді серії команд. Коли ви запускаєте vi, він нормально, неявно, виконує файл :sourceна ~/.exinitrcфайл (а Vim зазвичай робить це ввімкнено ~/.vimrc, досить природно). Використання цього полягає в тому, що ви можете змінити профіль свого редактора на ходу, просто знайшовши новий набір макросів, скорочень та налаштувань редактора. Якщо ви підлий ви можете навіть використовувати це як трюк для зберігання послідовностей екс редагування команди застосовуються до файлів на вимогу.

Наприклад, у мене є сім-рядковий файл (36 символів), який запускає файл через wc , і вставляє коментар у стилі С у верхній частині файлу, що містить дані про кількість слів. Я можу застосувати цей "макрос" до файлу, використовуючи команду типу:vim +'so mymacro.ex' ./mytarget

(Опція +командного рядка vi та Vim зазвичай використовується для запуску сеансу редагування за заданим номером рядка. Однак маловідомий факт, що можна слідувати +за будь-яким дійсним колишнім командою / виразом, таким як команда "джерело" як Я зробив тут; для простого прикладу я маю сценарії, які викликають: vi +'/foo/d|wq!' ~/.ssh/known_hostsвидалити запис з мого відомого файлу хостів SSH неінтерактивно, поки я повторно зображую набір серверів).

Зазвичай набагато простіше написати такі "макроси" за допомогою Perl, AWK, sed (що, власне, схоже на утиліту grep, натхненну командою ed ).

@Команда, ймовірно, самий заплутаний VI команди. Іноді викладаючи передові курси адміністрування систем протягом майже десятиліття, я зустрічав дуже мало людей, які коли-небудь використовували його. @виконує вміст регістра так, ніби це команда vi або ex .
Приклад: Я часто використовую: :r!locate ...щоб знайти якийсь файл у моїй системі та прочитати його ім’я в моєму документі. Звідти я видаляю будь-які сторонні звернення, залишаючи лише повний шлях до файла, який мене цікавить. Замість того, щоб наполегливо Tabпроходити через кожен компонент шляху (або ще гірше, якщо я трапився на машині без підтримки вкладки Tab у своїй копії vi ) Я просто використовую:

  1. 0i:r(щоб перетворити поточний рядок у дійсну команду : r ),
  2. "cdd (для видалення рядка в регістрі "с") та
  3. @c виконати цю команду.

Це всього 10 натискань клавіш (і вираз "cdd @c- це фактично макрос пальця для мене, тому я можу ввести його майже так само швидко, як будь-яке загальне шість буквене слово).


Твереза ​​думка

Я лише почухав поверхню енергії vi , і жодне з того, що я описав тут, навіть не є частиною "удосконалень", за якими названо vim ! Все, що я тут описав, має працювати на будь-якій старовинній копії vi від 20 до 30 років тому.

Є люди , які значно використовуються більш VI влади «s , ніж я коли - небудь буде.


440
Святі мавпи коду, .. це одна поглиблена відповідь. Що чудово, це те, що ви, ймовірно, писали в vim приблизно в 10 натискань клавіш.
EightyOne Unite

48
@Wahnfieden - grok - це саме те, що я мав на увазі: en.wikipedia.org/wiki/Grok (Це, мабуть, навіть у ЗНО --- найближчий до нас англофонів до канонічного лексикону). "Grok" редактор - це знайти себе, використовуючи його команди вільно ... як би вони були вашою природною мовою.
Джим Денніс

22
вау, дуже добре написана відповідь! Я не міг погодитись більше, хоча я багато використовую @команду (у поєднанні з q: макрос запису)
knittl

63
Чудова відповідь, яка виправдовує справді жахливе запитання. Я збираюся підкреслити це питання, яке, як правило, я б подав заяву, просто щоб цю відповідь стало легше знайти. (І я хлопець Emacs! Але в такий спосіб мені доведеться десь вказати на нових людей, які хочуть добре пояснити, що користувачі енергетики VI веселяться від vi. Тоді я розповім їм про Emacs, і вони можуть вирішити.)
Брендон Родос

8
Чи можете ви створити веб-сайт і помістити цей підручник там, щоб він не поривався тут під stackoverflow. Я ще мав прочитати краще вступ до vi, ніж це.
Марко

504

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

У візуальному режимі ви можете вибирати текст за допомогою команд Vim, тоді ви можете робити все, що завгодно, з вибором.

Розглянемо такі загальні сценарії:

Вам потрібно вибрати до наступної дужки, що відповідає.

Ви можете зробити:

  • v% якщо курсор знаходиться в круглих дужках
  • vib якщо курсор знаходиться в блоці дужок

Ви хочете вибрати текст між цитатами:

  • vi " для подвійних лапок
  • vi ' для одиничних цитат

Ви хочете вибрати фігурний брекет-блок (дуже поширений на мовах стилю C):

  • viB
  • vi{

Ви хочете вибрати весь файл:

  • ggVG

Вибір візуального блоку - ще одна дійсно корисна функція, вона дозволяє вибрати прямокутну область тексту, вам просто потрібно натиснути Ctrl- Vщоб запустити його, а потім вибрати потрібний текстовий блок і виконати будь-який тип операцій, наприклад, викреслити, видалити, вставити, редагувати тощо. Це чудово для редагування тексту, орієнтованого на стовпчик .


2
Кожен редактор має щось подібне, це не конкретно для vim.
finnw

22
Так, але це була конкретна скарга афіші. Візуальний режим - найкращий метод Vim для прямого підбору тексту та маніпуляцій. А оскільки методи обходу буфера vim чудові, я вважаю, що підбір тексту в vim є досить приємним.
гармати

9
Я думаю, що також варто згадати Ctrl-V для вибору блоку - тобто довільного прямокутника тексту. Коли вам це потрібно, це рятувальник.
Гаміш Даунер

6
@viksit: Я використовую Camtasia, але є багато альтернатив: codinghorror.com/blog/2006/11/screencasting-for-windows.html
CMS

3
Крім того, якщо у вас є візуальний вибір і хочете скорегувати його, oперейдіть до іншого кінця. Таким чином, ви можете переміщати як початок, так і кінець вибору скільки завгодно.
Натан Лонг

207

Деякі поради щодо продуктивності:

Розумні рухи

  • *і #шукайте слово під курсором вперед / назад.
  • w до наступного слова
  • W до наступного слова, розділеного пробілом
  • b/ eдо початку / кінця поточного слова. ( B/ лише Eдля простору)
  • gg/ Gперейти до початку / кінця файлу.
  • % перейти до відповідних {..} або (..) тощо.
  • {/ }перейти до наступного абзацу.
  • '. повернутися до останнього редагованого рядка.
  • g; повернутися до останнього відредагованого положення.

Швидке редагування команд

  • I вставити на початку.
  • A додавати до кінця.
  • o/ Oвідкрити новий рядок після / перед поточним.
  • v/ V/ Ctrl+Vвізуальний режим (для вибору тексту!)
  • Shift+R замінити текст
  • C змінити решту частини рядка.

Комбінування команд

Більшість команд приймає кількість та напрямок, наприклад:

  • cW = зміна до кінця слова
  • 3cW = змінити 3 слова
  • BcW = для початку повного слова, змінити повне слово
  • ciW = змінити внутрішнє слово.
  • ci" = змінити внутрішнє між ".."
  • ci( = змінити текст між (..)
  • ci<= змінити текст між <..> (потребує set matchpairs+=<:>vimrc)
  • 4dd = видалити 4 рядки
  • 3x = видалити 3 символи.
  • 3s = замінити 3 символи.

Корисні команди програміста

  • rзамініть один символ (наприклад, rdзамінює поточний знак символом на d).
  • ~ випадок змін.
  • J з'єднує дві лінії
  • Ctrl + A / Ctrl + X із збільшенням / зменшенням числа.
  • . повторити останню команду (простий макрос)
  • == виправити рядковий відступ
  • > блок відступу (у візуальному режимі)
  • < блокуючий блок (у візуальному режимі)

Запис макросу

  • Натисніть, q[ key ]щоб почати запис.
  • Потім натисніть, qщоб зупинити запис.
  • З макросом можна грати @[ key ].

Використовуючи дуже специфічні команди та рухи, VIM може повторити ці точні дії для наступних рядків. (наприклад, A для додавання до кінця b/ / eдля переміщення курсору відповідно до початку або кінця слова)

Приклад добре побудованих налаштувань

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

Параметри можна зберігати в ~/.vimrcабо загальносистемному, /etc/vimrc.localа потім читати з /etc/vimrcфайлу, використовуючи:

source /etc/vimrc.local

(вам доведеться замінити #символ коментаря, "щоб він працював у VIM, тут я хотів надати належне виділення синтаксису).

Команди, які я перерахував тут, є досить основними, і основні я використовую до цих пір. Вони вже роблять мене досить продуктивними, не знаючи всіх химерних речей.


4
Краще, ніж '.є g;, що стрибає назад через changelist. Переходить на останнє відредаговане місце замість останнього відредагованого рядка
naught101

98

Механізм Control+ Rдуже корисний :-) У режимі вставки або в командному режимі (тобто в :рядку під час введення команд) продовжуйте нумерований або іменований регістр:

  • a- zназвані регістри
  • " безіменний реєстр, що містить текст останнього видалення або вибивання
  • % поточне ім'я файлу
  • # альтернативне ім'я файлу
  • * вміст буфера обміну (X11: первинний вибір)
  • + вміст буфера обміну
  • / останній шаблон пошуку
  • : останній командний рядок
  • . останній вставлений текст
  • - останнє невелике (менше, ніж рядок) видалення
  • =5*5 вставити 25 в текст (міні-калькулятор)

Дивіться :help i_CTRL-Rі :help c_CTRL-Rдля більш докладної інформації, а також шпигувати навколо поблизу для більш CTRL-R доброти.


10
FYI, це стосується Ctrl + R у режимі вставки . У звичайному режимі Ctrl + R повторюється.
vdboor

2
+1 для поточного / альтернативного імені файлу. Control-Aтакож працює в режимі вставки для останнього вставленого тексту, а також Control-@для обох вставлених останніх вставлених текстів і негайно переходить у звичайний режим.
Aryeh Leib Taurog

91

Vim Plugins

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

рейки.вім

Rails.vim - плагін, написаний tpope. Це неймовірний інструмент для людей, які займаються розробкою рейок. Це робить магічні контекстно-чутливі речі, які дозволяють легко перейти від методу в контролері до пов'язаного перегляду, до моделі та вниз до одиничних тестів для цієї моделі. Це врятувало десятки якщо не сотні годин як розробник рейок.

gist.vim

Цей плагін дозволяє вибрати область тексту у візуальному режимі та ввести швидку команду, щоб розмістити його на gist.github.com . Це дозволяє легко отримувати доступ до пастбіну, що надзвичайно зручно, якщо ви співпрацюєте з ким-небудь через IRC чи чат.

простір.вім

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

surround.vim

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

supertab.vim

Цей скрипт приносить фантазії функцію завершення вкладок. Інформація про автозаповнення вже є в ядрі vim, але це приводить її до швидкої вкладці, а не до декількох різних клавіш швидкого доступу. Дуже зручно та неймовірно весело у використанні. Хоча це не інтелігенція VS, це чудовий крок і приносить велику кількість функціональних можливостей, які ви хотіли б очікувати від інструменту завершення вкладок.

syntastic.vim

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

втікач.вім

Прямий доступ до git зсередини vim. Знову ж таки, я не використовував цей плагін, але я бачу утиліту. На жаль, я перебуваю в культурі, де svn вважається "новим", тому я, швидше за все, не бачу git на роботі досить довго.

nerdtree.vim

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

FuzzyFinderTextmate.vim

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

Висновок

Існує маса неймовірних інструментів, доступних для vim. Я впевнений, що тут я лише подряпав поверхню, і варто шукати інструменти, застосовні до вашого домену. Поєднання потужного набору інструментів традиційного vi, вдосконалення vim на ньому та плагінів, які ще більше розширюють vim, це один з найпотужніших способів редагування тексту, що коли-небудь задуманий. Vim легко такий потужний, як emacs, затемнення, візуальна студія та текстовий колег.

Дякую

Завдяки duwanis за його конфігурацію vim, з якої я багато чого навчився та запозичив більшість перелічених тут плагінів.


Чарівна навігація по класу навігації в rails.vim - одна з найбільш загальних речей, яку я хотів би, щоб у Віма було те, що TextMate абсолютно нігті на всіх мовах: якщо я працюю над Person.scala і я роблю Cmd + T, як правило, перше у списку - PersonTest.scala.
Том Морріс

5
Я думаю, що настав час FuzzyFinderTextmate почати замінювати на github.com/wincent/Command-T
Гавін Гілмор

2
+1 для Syntastic. Це в поєднанні з JSLint зробило мій Javascript набагато менш схильним до помилок. Див. Superuser.com/questions/247012/… про те, як налаштувати JSLint для роботи з Syntastic.
Натан Лонг

1
@Benson Чудовий список! Я б також кинув у snipMate . Дуже корисна автоматизація звичайних матеріалів кодування. if <tab> миттєвий, якщо блок тощо
AlG

2
Я думаю, nerdcommenter - це також хороший плагін: ось . Як говорить його назва, це для коментування вашого коду.
Стефан

53

. Повторіть останню команду зміни тексту

Я заощаджую багато часу з цим.

Візуальний режим згадувався раніше, але блоковий режим візуалізації заощадив мені багато часу під час редагування стовпців фіксованого розміру в текстовому файлі. (доступ до Ctrl-V)


3
Крім того, якщо ви використовуєте лаконічну команду (наприклад, A для додавання в кінці) для редагування тексту, vim може повторити цю саме дію для наступного рядка, на який натискаєте .клавішу.
vdboor

48

гі

Перейдіть до останнього відредагованого місця (дуже корисно, якщо ви здійснили пошук і хочете повернутися до редагування)

^ Р і ^ Н

Заповніть попередній (^ P) або наступний (^ N) текст.

^ О і ^ я

Перейдіть до попереднього ( ^O- "O"для старого) місця розташування або до наступного ( ^I- "I"недалеко від"O" ). Під час пошуку, редагування файлів тощо ви можете переходити через ці "стрибки" вперед і назад.


4
@Kungi `. приведе вас до останнього редагування, `` поверне вас до позиції, на якій ви були до останнього "стрибка" - яка / може / також буде позицією останнього редагування.
Грант Маклін

46

Я нещодавно (отримав) відкрив цей сайт: http://vimcasts.org/

Це досить нове і справді дуже добре. Хлопець, який працює на веб-сайті, перейшов з "textmate" на "vim" і пропонує дуже хороші та стислі записи на конкретні теми vim. Перевір!


3
Якщо вам подобаються підручники з vim, перегляньте також відео з vim Derek Wyatt . Вони відмінні.
Джеромі Англім

42

CTRL+A збільшує число, на якому стоїш.


19
... декременти CTRL-X
innaM

9
Це акуратний ярлик, але поки що я НІКОЛИ не знайшов для цього користі.
SolutionYogi

8
якщо ви запускаєте vim на екрані і
цікавитеся,

13
@SolutionYogi: Подумайте, що ви хочете додати номер рядка до початку кожного рядка. Рішення: ggI1 <простір> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42

10
Надзвичайно корисно для Vimperator, де він збільшує (або зменшує, Ctrl-X) останнє число в URL-адресі. Корисно для швидкого серфінгу по галереям зображень тощо
синій

38

Усі в звичайному режимі:

f <char> для переходу до наступного примірника конкретного символу в поточному рядку, і ;повторювати.

F <char>, щоб перейти до попереднього екземпляра певного символу в поточному рядку та ; повторювати.

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

* на слово для пошуку наступного екземпляра.

# на слові для пошуку попереднього екземпляра.


6
О, я не знав про * та # (пошук вперед / назад для слова під курсором). Це якось круто. F / F і t / T і; команди - швидкі переходи до символів у поточному рядку. f / F кладе курсор на вказаний символ, тоді як t / T ставить його просто вгору "до" символу (символ безпосередньо перед або після нього відповідно до обраного напрямку.; просто повторюється останній f / F / t / T стрибок (в тому ж напрямку).
Джим Денніс

10
:) Мітка вгорі сторінки з підказками на vim.org: "Чи можете ви уявити, скільки натискань клавіш могло бути збережено, якби я лише вчасно знала команду" * "?" - Juergen Salk, 19.01.2001 "
Юв

1
Як згадував Джим, комбо "t / T" часто так само добре, якщо не краще, наприклад, ct(стерне слово і переведе вас у режим вставки, але збережіть парантези!
puk

34

Сесія

а. зберегти сеанс

: ім'я сесії mks

б. сила збереження сесії

: mks! ім'я сесії

c. сеанс завантаження

gvim або vim -S ім'я сесії


Додавання і віднімання

а. Додавання і віднімання

CTRL-A; Додайте [count] до числа або алфавітного символу за курсором або після нього. {не в Vi

CTRL-X; Відніміть [відлік] від числа або алфавітного символу на або після курсору. {не в Vi}

б. Розібрання віконного ключа

У вікні Ctrl-A вже відображено для вибору всього файлу, який потрібно скасувати карту у файлі rc. позначте mswin.vim CTRL-частину зі відображенням як коментар або додайте файл rc з unmap

c. З макросом

Команда CTRL-A дуже корисна в макросі. Приклад: Для складання нумерованого списку виконайте наступні дії.

  1. Створіть перший запис у списку, переконайтеся, що він починається з числа.
  2. qa - почати запис у буфер 'a'
  3. Y - вибийте запис
  4. p - помістіть копію запису нижче першого
  5. CTRL-A - приріст числа
  6. q - зупинити запис
  7. @a - повторіть час, коли покладіть та зросте

1
Будь-яка ідея, що це ярлики в Windows?
Дон Реба

32

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

У нас було ~ 80 файлів, які потрібно було переробити, щоб бути об'єктно орієнтованими - всі функції перемістилися в класи, змінилися параметри, додано заяви про імпорт тощо. У нас був список близько 20 типів виправлень, які потрібно було зробити для кожного файлу. Я вважаю, що робити це вручну одна людина могла б зробити, можливо, 2-4 на день.

Тому я зробив перший вручну, а потім написав сценарій vim для автоматизації змін. Більшість це був список команд vim, наприклад

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

Останній заслуговує на трохи пояснення:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

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

Після кількох годин роботи над ним у мене був сценарій, який зробить щонайменше 95% конверсії. Я просто відкриваю файл у vim, а потім запускаю:source fixit.vim і файл перетворюється мить очей.

Ми все ще працюємо над тим, щоб змінити решту 5%, що не варто було автоматизувати та перевірити результати, але витративши день на написання цього сценарію, я вважаю, що ми заощадили тижні роботи.

Звичайно, це можна було б автоматизувати такою мовою сценаріїв, як Python або Ruby, але писати це зайняло б набагато більше часу, і було б менш гнучким - останній приклад був би складним, оскільки тільки з регулярним виразом не вдасться впоратися вкладені дужки, наприклад для перетворення bar(foo(xxx))в foo(xxx).bar(). Вім був ідеальним для виконання завдання.


1
Дякую за те, що поділилися, що насправді приємно вчитися на "корисних і не класичних" макросах
Олів'є Понс

%s/\(bar\)(\(.\+\))/\2.\1()/зробив би це теж. (Утечі сумісні з :set magic.) Тільки для запису. :)
Ipsquiggle

1
Якщо вам не подобаються втечі у стилі vim, використовуйте \ v, щоб увімкнути Very Magic:%s/\v(bar)\((.+)\)/\2.\1()/
Ipsquiggle,

@lpsquiggle: ваша пропозиція не обробляє складні вирази з більш ніж одним набором дужок. наприклад, if bar(foo(xxx)) or wibble(xxx): стає те, if foo(xxx)) or wibble(xxx.bar(): що абсолютно неправильно.
Дейв Кірбі

28

Використовуйте вбудований провідник файлів! Команда є, :Exploreі вона дозволяє дуже швидко переміщатися по вихідному коду. Ці карти у мене є .vimrc:

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

Провідник дозволяє також вносити модифікації файлів. Я опублікую кілька моїх улюблених клавіш, натискання <F1>дасть вам повний список:

  • - : Найкорисніше: змінити верхній каталог ( cd ..)
  • mf : Позначте файл
  • D : Видаліть позначені файли або файл, на якому курсор увімкнено, якщо нічого не позначено.
  • R : Перейменуйте файл, на якому курсор увімкнено.
  • d : Створіть новий каталог у поточному каталозі
  • % : Створіть новий файл у поточному каталозі

1
Я завжди вважав, що методи за замовчуванням для перегляду якось висмоктуються для більшості матеріалів. Переглядати це просто повільно, якщо ви знаєте, куди хочете поїхати. LustyExplorer з розділу сценаріїв vim.org - це дуже потрібне вдосконалення.
Свенд

Ваше друге відображення може бути простішим: карта <silent> <S-F8>: Sexplore <CR>
Телець Олсон

8
Я рекомендую NERDtree замість вбудованого провідника. Це змінило те, як я використовував vim для проектів, і зробило мене набагато продуктивнішою. Просто Google для цього.
kprobst

Я ніколи не відчуваю потреби досліджувати вихідне дерево, я просто використовую :find, :tagі різні пов'язані натискання клавіш, щоб стрибати навколо. (Можливо, це тому, що вихідні дерева, над якими я працюю, великі та організовані інакше, ніж я б це зробив? :))
dash-tom-bang

25

Я є членом Американської асоціації криптограм. Щомісячний журнал містить понад 100 різних криптограм. Приблизно 15 - це "криптарітми" - різні типи арифметичних задач з літерами, заміненими цифрами. Два-три з них - судокуси, за винятком букв замість цифр. Коли сітка завершена, дев'ять різних літер будуть писати слово або слова, на деякій лінії, діагоналі, спіралі тощо, десь у сітці.

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

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

Проблема відформатована як дев'ять груп з дев'яти літер, з -s представляють пробіли, написані в два рядки. Перший крок - відформатувати їх у дев'ять рядків по дев’ять символів у кожному. У цьому немає нічого особливого, просто вставивши вісім перерв у відповідні місця.

Результат буде виглядати приблизно так:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

Отже, перший крок у перетворенні цього на цифри - це скласти список різних літер. Спочатку роблю копію блоку. Я розміщую курсор у верхній частині блоку, а потім набираю :y}}p. :переводить мене в командний режим, yперебирає наступну команду руху. Оскільки }це перехід до кінця наступного абзацу, y}янь абзац. }потім переміщує курсор до кінця абзацу і pвставляє те, що ми викрутили відразу після курсору. Таким чином y}}pстворюється копія наступного абзацу і закінчується курсором між двома копіями.

Далі я перетворюю одну з цих копій у перелік різних літер. Ця команда трохи складніша:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:знову переводить мене в командний режим. !вказує, що вміст наступного янка повинен проходити через командний рядок. }yanks наступний абзац, а потім командний рядок використовує trкоманду, щоб викреслити все, крім великих літер, sedкоманда для друку кожної літери в одному рядку, а sortкоманда для сортування цих рядків, видалення дублікатів, а потім trвикреслення нові рядки, залишаючи дев'ять чітких літер в одному рядку, замінюючи дев'ять рядків, які складали абзац спочатку. У цьому випадку листи:ACELNOPST .

Наступний крок - зробити ще одну копію сітки. А потім використовувати ці листи я тільки ідентифіковані для заміни кожного з цих букв з цифрою від 1 до 9. Це дуже просто: :!}tr ACELNOPST 0-9. Результат:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

Потім це можна вирішити звичайним способом або ввести будь-який вирішувач судоку, який ви хочете віддати перевагу. Завершене рішення потім можна перетворити назад в букви:!}tr 1-9 ACELNOPST .

Є сила in vi, яка відповідає дуже мало іншим. Найбільша проблема полягає в тому, що лише небагато книжок, веб-сайтів, файлів довідок тощо, підручники тощо, роблять більше, ніж ледь торкаються поверхні, що можливо.


і роздратування полягає в тому, що деякі дистрибутиви, такі як ubuntu, мають псевдоніми від слова "vi" до "vim", тому люди насправді не побачать vi. Відмінний приклад, треба спробувати ... +1
hhh

1
Чи не перевіряє vim ім'я, з якого воно було розпочате, щоб воно могло з’явитися в потрібному режимі?
Даш-Том-Банг

3
Мене бентежить ця повторна помилка: ви кажете, що вам потрібно :перейти в командний режим, але тоді незмінно ви вказуєте команди звичайного режиму (наприклад y}}p), які не можуть працювати в командному режимі ?!
sehe

Я приймаю на себе унікальний виклик символів: :se tw=1 fo=(підготовка) VG:s/./& /g(вставити пробіли), gvgq(розділити на окремі рядки), V{:sort u(сортувати та видалити дублікати)
sehe

23

Масові текстові маніпуляції!

Або через макроси:

  • Почніть із запису: qq
  • Робіть речі
  • Зупинити запис: q
  • Повторіть: @q(перший раз), @@після цього.
  • Повторіть 20 разів: 20@@

Або через регулярні вирази:

  • Замінити речі: :%s/[fo]+/bar/g

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


5
+1 за довідкою Джеймі Завінського . (Жодних балів не було взято за те, що не вдалося до неї зв’язатися навіть). :)
Джим Денніс

1
@Jim Я навіть не знав, що це цитата Джеймі Завінського :). Я спробую згадати це відтепер.
jqno

Наступний трюк виявляється все більш корисним ... для випадків, коли ви хочете приєднати рядки, які відповідають (або які НЕ відповідають) деяким шаблоном до попереднього рядка: :% g/foo/-1jабо :'a,'z v/bar/-1jнаприклад (де перший - "всі рядки та відповідність шаблону" тоді як остання - це "лінії між позначкою a та позначення z, які не відповідають шаблону"). Частина після скопірування в команді a gабо vex може бути будь-якою іншою ex-командою, -1j - це лише відносний рух лінії та команда приєднання.
Джим Денніс

Звичайно, якщо ви називаєте свій макрос "2", тоді, коли настає час його використовувати, вам навіть не потрібно переміщати палець від клавіші "@" до клавіші "q". Можливо, економить від 50 до 100 мілісекунд щоразу там. = P
JustJeff

@JustJeff Цілком залежить від розкладки вашої клавіатури, моя клавіша @ знаходиться з іншого боку клавіатури від моєї 2 клавіші.
Саймон Стіл

23

Я нещодавно виявив q:. Це відкриває "вікно команд" і показує ваші останні останні команди (режим командного режиму). Ви можете переміщатися, як зазвичай, у вікні, натискаючи на <CR>виконання команди. Ви також можете редагувати тощо. Безцінно, коли ти возишся з якоюсь складною командою чи регулярним виразом, і ти не хочеш повторно вводити всю справу, або якщо складна річ, яку ти хочеш зробити, - це 3 команди назад. Це майже як баш set -o vi, але для самого vim (хе!).

Подивіться :help q:більше цікавих бітів для повернення вперед і назад.


22

Щойно я виявив омоплікацію Віма на днях, і, хоча визнаю, я трохи туманний, що робить, я мав напрочуд гарні результати, просто збиваючи або Ctrl+ x Ctrl+, uабо Ctrl+ n/ Ctrl+ pу режимі вставки. Це не зовсім IntelliSense , але я все ще вчуся цьому.

Спробуй! :help ins-completion


20

Це не ярлики, але вони пов'язані:

  1. Зробіть додатковий ESC (або Ctrl)
  2. лідер карти в "," (кома) з цією командою: нехай mapleader = ","

Вони підвищують мою продуктивність.


Привіт приємний натяк про "\"! Набагато краще набрати "," ніж "\".
Олів'є Понс

2
Щоб зробити Caps Lock додатковим Esc у Windows (для чого потрібний ключ блокування шапки? "Будь-яка клавіша"?), Спробуйте це: web.archive.org/web/20100418005858/http://webpages.charter.net/…
Р. Мартіньо Фернандес

На Mac вам потрібен PCKeyboardHack - деталі на superuser.com/questions/34223/…
Том Морріс

1
У Windows я використовую AutoHotKey зCapslock::Escape
Jeromy Anglim

19

Інший корисний vi "ярлик", який я часто використовую, - "xp". Це поміняє символ під курсором на наступний символ.


3
Xpпіти іншим шляхом
тестер

5
Приблизно в той час, коли вийшов Windows xp, я жартував, що це єдине корисне для нього використання.
kguest

18

<Ctrl> + W, V, щоб розділити екран вертикально
<Ctrl> + W, W для переходу між вікнами

! python% [args] для запуску сценарію, який я редагую у цьому вікні

ZF у візуальному режимі для складання довільних ліній


2
<Ctrl> + W і j / k дозволять вам абсолютно орієнтуватися (j вгору, k вниз, як при звичайному vim). Це чудово, коли у вас 3+ розщеплення.
Ендрю Скагнеллі

1
+1 для zf у візуальному режимі, мені подобається складання коду, але про це не знав.
coder_tim

2
після удару моєї клавіатури я встановив, що <C-w>nабо <C-w>sнове горизонтальне вікно, <C-w>bце праве нижнє вікно, <C-w>cабо <C-w>qзакрите вікно, <C-w>xзбільшується, а потім зменшується ширина вікна (??), <C-w>pце останнє вікно, <C-w>backspaceє переміщення ліворуч (іш) вікно
puk

:help ctrl-wFTW ... зробіть собі послугу і змусьте спробувати ці речі хоча б 15 хвилин!
sjas

18

Візуальний режим

Як сказали кілька інших людей, візуальний режим - це відповідь на вашу проблему копіювання / вирізання та вставки. Vim дає вам "v", "V" та Cv. Нижній регістр 'v' in vim по суті такий же, як клавіша shift у блокноті. Приємно те, що вам не потрібно його утримувати. Ви можете використовувати будь-яку техніку руху для ефективної навігації до початкової (або кінцевої) точки вашого вибору. Потім натисніть «v» і знову використовуйте ефективні прийоми руху, щоб перейти до іншого кінця вибору. Тоді "d" або "y" дозволяє вирізати або скопіювати цей вибір.

Перевага візуального режиму vim перед описом Джима Денніса вирізати / скопіювати / вставити в vi полягає в тому, що вам не доведеться точно визначати розташування. Іноді ефективніше скористатися швидким рухом, щоб дістатися до загального місця, куди ви хочете піти, а потім уточнити це за допомогою інших рухів, ніж придумати більш складну єдину команду руху, яка приведе вас саме туди, куди ви хочете піти.

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

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

Про ефективне використання клавіатури

Я також не згоден з вашим твердженням, що чергування рук - це найшвидший спосіб використання клавіатури. У ньому є елемент істини. Якщо говорити дуже загально, то повторне використання однієї і тієї ж речі відбувається повільно. Цей найзначніший приклад цього принципу полягає в тому, що послідовні натискання клавіш, набрані одним пальцем, дуже повільні. Ваше твердження, ймовірно, випливає із природної тенденції використання перетворення s / finger / hand / трансформації за цією схемою. Певною мірою це правильно, але в надзвичайно високому кінці спектру ефективності це неправильно.

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

Складніша проблема - оптимізація для цього. Досить легко оптимізувати абсолютну відстань на клавіатурі. Вім робить це. Набагато складніше оптимізувати на рівні "запуску", але vi (m) за допомогою модального редагування дає вам більше шансів на те, щоб зробити це, ніж будь-який немодальний підхід (ах, emacs) коли-небудь міг.

На Emacs

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

Vim дає вам неперевершену ефективність редагування сирого тексту. Emacs надає вам неперевершену можливість налаштування та програмування редактора

Сліпі репутації vim стверджують, що vim має мову сценаріїв. Але це незрозуміла, спеціальна мова, розроблена для обслуговування редактора. У Emacs є Lisp! Достатньо сказано. Якщо ви не оцінюєте значення цих останніх двох речень або хочете дізнатися достатньо про функціональне програмування, а Лісп розвивати цю оцінку, то вам слід скористатися vim.

Зловмисники emacs будуть стверджувати, що в emacs працює режим viper, а значить, це суперкомплект vim. Але режим гадюк не стандартний. Я розумію, що режим viper не використовується більшістю користувачів emacs. Оскільки це не за замовчуванням, більшість користувачів emacs, ймовірно, не розуміють переваг модальної парадигми.

На мою думку, ці відмінності є ортогональними. Я вважаю, що переваги vim та emacs, як я вже заявив, є дійсними. Це означає, що остаточного редактора ще не існує. Напевно, правда, що emacs був би найпростішою платформою, на якій можна базувати остаточний редактор. Але модальне редагування не закріплено в режимі мислення Emacs. Спільнота emacs може рухатися таким шляхом у майбутньому, але це не здається дуже ймовірним.

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


17

Витратьте 30 хвилин, роблячи підручник vim (запустіть vimtutor замість vim у терміналі). Ви дізнаєтесь про основні рухи та деякі натискання клавіш, це зробить вас принаймні настільки продуктивними з vim, як і з текстовим редактором, який ви використовували раніше. Після цього добре прочитайте відповідь Джима Денніса ще раз :)


1
Це перше, що я подумав, читаючи ОП. Очевидно, що афіша ніколи цього не виконував; Я пробігав через нього, коли вперше вивчив vim два роки тому, і це зафіксувало перевагу Vim перед будь-яким іншим редактором, який я використовував (включаючи, для мене, Emacs, оскільки ключові комбінації дратують використовувати на Mac) .
dash-tom-bang

16

Який спосіб використання Vim робить вас більш продуктивним, ніж із сучасним редактором?

Вміння виконувати складні, повторювані редагування з дуже невеликим натисканням клавіш (часто використовуючи макроси ). Погляньте на VimGolf щоб стати свідком сили Віма!

Після майже десяти років майже щоденного використання важко уявити використання будь-якого іншого редактора.


16

Використовуйте в \cбудь-якому місці пошуку, щоб ігнорувати регістр (переосмислюючи параметри ігнорування чи смарт-скриньки). Наприклад , /\cfooчи /foo\cбуде відповідати foo, Foo, fOO,FOO і т.д.

Використовуйте \Cбудь-де в пошуку, щоб примусити відповідати регістру. Наприклад, /\Cfooабо /foo\Cбуде відповідати лише foo.


16

Я був здивований, виявивши, що ніхто не згадує про tрух. Я часто використовую його зі списками параметрів у вигляді dt,абоyt,


2
або dfx, dFx, dtx, ytx тощо, де x - це char, +1
hhh

Так! І не забудьте ct (змінити).
markle976

16

Нічого не згаданих ctags. Завантажте "вишукані коти" та поставте її перед шаленою попередньо встановленою версією, яку ви вже маєте на своєму шляху пошуку. Cd до кореня, над чим ви працюєте; наприклад, дистрибутив ядра Android. Введіть "ctags -R." створити індекс вихідних файлів де-небудь під цим dir у файлі під назвою "теги". Тут містяться всі теги, не вказуйте мову ні в редакторі, ні в одному файлі, тому роботу між мовою легко.

Потім відкрийте vim у цій папці і прочитайте: help ctags для деяких команд. Кілька я використовую часто:

  • Покладіть курсор на виклик методу та введіть CTRL-], щоб перейти до визначення методу.

  • Введіть: та ім’я, щоб перейти до визначення імені.


14

Автоматичний відступ:

gg(перейти до початку документа)
=(відступ!)
shift-g(перейти до кінця документа)

У вашому .vimrcфайлі знадобиться "відступ файлу додатка" , а також, можливо, відповідні налаштування "shiftwidth" та "expandtab".


4
Або просто скористайтеся засобом ": set ai" (автовідступ), який знаходиться у vi з самого початку.
xcramps

14

Ви запитували про продуктивні ярлики, але я думаю, що ваше справжнє запитання: чи варто цього vim? Відповідь на це запитання про stackoverflow -> "Так"

Напевно, ви помітили дві речі. Vim потужний, а vim важко вчитися. Велика частина його потужності полягає в її розширюваності та нескінченному поєднанні команд. Не відчувайте себе переповненим. Ідіть повільно. Одна команда, один плагін за раз. Не перестарайтеся.

Усі ті інвестиції, які ви вкладете у vim, окупляться в тисячу разів. Ви будете знаходитись в текстовому редакторі довгі-багато годин, перш ніж помрете. Вім стане вашим супутником.


13

Кілька буферів, зокрема швидкий перехід між ними для порівняння двох файлів із :bpта :bn(належним чином перекомпоновані до одного Shift+ pабо Shift+ n)

vimdiff режим (розбивається на два вертикальних буфера з кольорами для відображення відмінностей)

Копіюйте в області з Ctrl+v

І нарешті, вкладка заповнення ідентифікаторів (пошук "mosh_tab_or_complete"). Це зміна життя.


12

Погоджено з головним плакатом - the : r! команда дуже корисна.

Найчастіше я використовую його для "приклеювання" речей:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

Таким чином я не маю поспішати :set paste.


3
Можливо, краще встановити clipboardпараметр unnamed( set clipboard=unnamedу вашому .vimrc) використовувати системний буфер обміну за замовчуванням. Або , якщо ви все ще хочете, щоб система CLIPBOARD окремо від безіменного регістра, використовуйте відповідну назву регістр буфера обміну: "*p.
Р. Мартінхо Фернандес

2
Любіть це! Після того, як я здивований, вставляючи приклади коду з Інтернету, і я тільки починав відчувати себе vim. Це була команда, про яку я мріяв на місці. Це було коли vim мене повністю підчепив.
kevpie

Якщо ви розробляєте Mac, Command + C і Command + V, скопіюйте та вставте за допомогою системного буфера обміну, не потрібно робити повторний перезапис.
Ben Mordecai

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