Які темні куточки Віма, про які вам ніколи не розповідала мама? [зачинено]


799

Є безліч питань, де люди говорять про загальні хитрощі, зокрема " підказки та рекомендації Vim + ctags ".

Однак я не посилаюсь на часто використовувані ярлики, які хтось новий у Vim знайде класно. Я говорю про досвідченого користувача Unix (будь то розробник, адміністратор, обидва тощо), який вважає, що знає щось, про що 99% з нас ніколи не чули і не мріяли. Щось, що не тільки полегшує їх роботу, але також є COOL і хакі . Зрештою, Vim проживає в найбільш багатій на темні кути ОС в світі, тому він повинен мати тонкощі, про які знають лише деякі привілейовані та хочуть поділитися з нами.


10
: Вікно "Спліт Спліт" та відкритий інтегрований провідник файлів (горизонтальний розкол)
користувач3218088

2
Це питання видається досить конструктивним - дивлячись на кількість оновлених результатів ..., проголосованих за повторне відкриття - можливо, приходить якийсь ще крутіший відповідь - який може бути використаний, якщо корисно - таким чином, надаючи більшу цінність SOF. Упорядковуючи відповіді голосами, я дізнався багато цікавих речей всього за 5 хвилин ... тут справді цінні речі, навіщо закривати щось таке цінне? Як це не конструктивно?
jhegedus

7
Смішно, що це питання закрите. Розмова про легалізм.
Лепідоптерист

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

2
Чому для видалення цього питання є 2 (на сьогодні) голоси? Якого б корисного це могло б зробити?
Акавал

Відповіді:


782

Можливо, це не те, про що 99% користувачів Vim не знають, але я це щодня використовую, і що повинен знати будь-який Linux + Vim poweruser.

Основна команда, але надзвичайно корисна.

:w !sudo tee %

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

Ви, очевидно, повинні бути в системі з встановленим sudo і мати права на sudo.


116
Можливо, це навіть краще, ніж запускати vim як root! Оголошено!
Арафангіон

27
Що для ноб, що саме робить трійник? Хтось міг би розібрати цю команду для мене?
AndyL

41
cmap w !! w! sudo tee%
jm666

58
Ніколи не слід бігати sudo vim. Натомість слід експортувати EDITORяк vim та run sudoedit.
Джерардо Марсет

8
@maximus: vim замінює% на ім'я поточного буфера / файла.
migu

617

Щось я нещодавно виявив, що мені здалося дуже крутим:

:earlier 15m

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


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

39
Також дуже корисним є g + та g- у часі йти назад та вперед. Це набагато більш потужно, ніж стек скасування / повторення, оскільки ви не втрачаєте історію, коли робите щось після скасування.
Etienne PIERRE

9
Ви не втратите історію повторів, якщо внесете зміни після скасування. До нього просто не легко отримати доступ. Існують плагіни, які допоможуть вам візуалізувати це, як Gundo.vim
Ehtesh Choudhury

559
Нічого собі, так що тепер я можу просто робити, :later 8hі я закінчую сьогодні? : P
Ігор Попов

7
Ваша команда передбачає, що один витратить принаймні 15 хвилин на vim !
e2-e4

411

:! [command] виконує зовнішню команду, поки ви знаходитесь у Vim.

Але додайте крапку після двокрапки, :.! [command]і вона скине висновок команди у ваше поточне вікно. Ось так: . !

Наприклад:

:.! ls

Я дуже використовую це для таких речей, як додавання поточної дати до документу, який я набираю:

:.! date

74
Це досить схоже на: r! Наскільки я можу сказати, єдина різниця: r! відкриває новий рядок,:.! перезаписує поточний рядок.
сафсд

6
Альтернативою :.!dateє записати "дату" на рядку, а потім запустити !$sh(альтернативно, команда слідує за порожнім рядком та запустіть !jsh). Це передасть рядок на оболонку "sh" і замінить вихід з команди.
hlovdal

43
:.!насправді є окремим випадком :{range}!, який фільтрує діапазон рядків (поточний рядок, коли діапазон .) за допомогою команди і замінює ці рядки на вихід. Я вважаю :%!корисним для фільтрації цілих буферів.
Нефрубир

2
@sundar: Навіщо передавати рядок до sed, коли ви можете використовувати подібні вбудовані ed/ exкоманди? Спробуйте запустити :.s/old/new/g;-)
jabirali

4
А також зауважте, що "!" це як "y", "d", "c" тощо. тобто ви можете робити: !!, число !!,! рух (наприклад, Gshell_command <cr> замінити з поточного рядка в кінець файлу ("G") на вихід shell_command).
aqn

312

Не зовсім незрозуміло, але є кілька команд "delete in", які є надзвичайно корисними, наприклад.

  • diw щоб видалити поточне слово
  • di( видалити в поточному паролі
  • di" щоб видалити текст між цитатами

Інших можна знайти на :help text-objects


8
dab "видалити дужки arounb", daB для навколо фігурних дужок, t для тегів типу xml, комбінації з нормальними командами - як очікується, cib / yaB / dit / vat тощо
sjh

15
@Masi: yi (va (p видаляє лише дужки
Дон Реба)

42
Це, мабуть, найбільша причина, щоб я залишився з Вімом. Це та його еквівалентні команди "зміни": ciw, ci (, ci), а також dt <space> і ct <space>
thomasrutter

4
@thomasrutter: Чому б не dW / cW замість dt <space>?

9
@Masi: З додатком для об'ємного звучання: ds (.

237

de Видаліть усе до кінця слова, натиснувши. на ваше бажання серця.

ci (xyz [Esc]) - Це дивно. Тут "я" не означає режим вставки. Натомість це означає всередині круглих дужок. Отже, ця послідовність розрізає текст усередині дужок, в якому ви стоїте, і замінює його "xyz". Він також працює у квадратних та фігурних дужках - просто зробіть ci [або ci {відповідно. Природно, ви можете зробити di (якщо ви просто хочете видалити весь текст, не вводячи нічого. Ви можете зробити це aзамість того, iякщо ви хочуть також видалити круглі дужки, а не лише текст всередині них.

ci " - вирізає текст у поточних цитатах

ciw - скорочує поточне слово. Це працює так само, як і попереднє, крім цього( замінено на w.

С - переріжте решту рядка та перейдіть у режим вставки.

ЗЗ - збережіть та закрийте поточний файл (БУДЕ швидше Ctrl-F4, щоб закрити поточну вкладку!)

ддп - переміщення поточного рядка на один рядок вниз

xp - переміщення поточного символу на одну позицію праворуч

U - велика літера, тому viwUслово перекладає слово

~ - перемикає корпус, тому viw~повернеться зворотне обкладинку всього слова

Ctrl + u / Ctrl + d прокрутіть сторінку на пів-екрані вгору або вниз. Це здається більш корисним, ніж звичайні підкачки на повноекранному екрані, оскільки полегшує бачити, як співвідносяться два екрани. Для тих, хто все ще хоче прокручувати весь екран одночасно, є Ctrl + f для Вперед та Ctrl + b для Назад. Ctrl + Y і Ctrl + E прокручуйте вниз або вгору по одному рядку.

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

% знаходить і переходить до відповідних дужок.

de - видалити з курсору до кінця слова (ви також можете зробитиdE видалити до наступного пробілу)

bde - видаліть поточне слово з лівого на правий роздільник

df [пробіл] - видалення до і включення наступного пробілу

дт. - видалити до наступної крапки

dd - видаліть весь цей рядок

ye (або yE) - текст, який злітає звідси до кінця слова

ce - прорізає кінець слова

до побачення - копіює поточне слово (змушує мене замислитися, що робить "привіт"!)

yy - копіює поточний рядок

cc - вирізає поточний рядок, ви також можете зробити це Sзамість цього. Також є нижня шапкаs яка скорочує поточний символ і переходить у режим вставки.

viwy або viwc . Змінити чи змінити поточне слово. Натисніть wкілька разів, щоб продовжувати вибирати кожне наступне слово, використовуйтеb для переміщення назад

vi { - виділіть увесь текст у фігурних дужках. va {- виберіть увесь текст, включаючи {} s

vi (p - виділіть усе, що знаходиться всередині () s, і замініть вставленим текстом

b і e переміщуйте курсор по слову, подібно до того, як зазвичай роблять Ctrl + стрілки . Визначення слова дещо інше, оскільки кілька послідовних дельмітерів трактуються як одне слово. Якщо ви почнете з середини слова, натискання клавіші b завжди приведе вас до початку поточного слова, і кожен наступний b перейде до початку наступного слова. Так само і легко запам'ятовується, eотримує курсор до кінця поточного та кожного наступного слова.

аналогічно b/ e, великим Bі Eпереміщуйте курсор слово за словом, використовуючи лише пробіли як роздільники.

велика D (зроби глибокий вдих) Видаляє решту рядка праворуч від курсору, як і Shift + End / Del у звичайних редакторах (зауважте 2 натискання клавіш - Shift + D - замість 3)


15
zt є досить корисним, якщо ви використовуєте його на початку функції або визначення класу.
Нік Льюїс

9
vityі vitcможе бути скорочений до yitі citвідповідно.
Натан Фелман

33
Все, що ви називаєте "вирізати", - "змінити". наприклад: C змінюється до кінця рядка. Еквівалент Vim "вирізати" - "видалити", виконаний з d / D. Основна відмінність зміни та видалення полягає в тому, що видалення залишає вас у звичайному режимі, але зміна переводить вас у своєрідний режим вставки (хоча ви все ще в команді зміни, яка зручна, оскільки всю зміну можна повторити .).
Лоранс Гонсалвс

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

19
byeне працює, коли ви знаходитесь у першому символі слова. yiwзавжди робить.
Андреа Франсія

204

Те, що я рідко зустрічаю у більшості навчальних посібників Vim, але воно НЕВЕРДОБНО корисне (принаймні для мене), це

g; and g,

для переміщення (вперед, назад) через список змін.

Дозвольте мені показати, як я ним користуюся. Іноді мені потрібно скопіювати і вставити фрагмент коду або рядка, сказати шістнадцятковий кольоровий код у файлі CSS, тому я шукаю, стрибаю (не піклуючись про те, де збіг), копіюю його, а потім стрибаю назад (g;) туди, куди Я редагував код, щоб остаточно вставити його. Не потрібно створювати позначки. Простіше.

Тільки мої 2 центи.


29
аналогічно, '.перейде до останнього відредагованого рядка, і `.піде на останню редаговану позицію
aehlke

8
Ctrl-O і Ctrl-I (вкладка) будуть працювати аналогічно, але не однаково. Вони рухаються назад і вперед у "списку стрибків", який ви можете переглянути, виконуючи: стрибки або: ju Для отримання додаткової інформації зробіть: довідковий список
Kimball Robinson

17
Ви можете перерахувати список змін, виконавши: зміни
Кімбол Робінсон

Гарячий баг, який корисний. Я використовую <C-o>/ <C-i>для цього весь час - або маркуючи своє місце.
Уейн Вернер

187
:%!xxd

Перетворіть vim в шестнадцятковий редактор.

:%!xxd -r

Повернутись.

Попередження: Якщо ви не редагуєте за допомогою двійкового (-b), ви можете пошкодити файл. - Джош Лі в коментарях.


9
І як це повернути назад?
Крістіан

40
:! xxd -r // Повернутися назад з HEX
Naga Kiran

21
Я насправді думаю, що це :%!xxd -rповернути назад
Андреас Греч

@JoshLee: Якщо обережно не переходити нові рядки, чи безпечно не використовувати параметр -b? Я запитую, бо іноді я хочу внести шістнадцяткову зміну, але я не хочу закривати та знову відкривати файл, щоб це зробити.
dotancohen

4
@dotancohen: Якщо ви не хочете закрити / повторно відкрити файл, можете зробити: встановити binary
Bambu


119

Іноді плагін або автокоманда замінять налаштування у .vimrc. Для налагодження цієї корисної хитрості є використання команди: verbose спільно з: set. Наприклад, щоб з’ясувати, де встановлено / знято cindent:

:verbose set cindent?

Це виведе щось подібне:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Це також працює з картами та виділеннями. (Дякую joeytwiddle, що вказали на це.) Наприклад:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim

8
Відмінна порада - саме те, що я шукав сьогодні.
Артем Руссаковський,

Чудовий підказник! Як ти познайомишся з цими видовищними речами?
Рафід

1
:verboseтакож можна використовувати до nmap lабо highlight Normalдізнатись, де останній lчас Normalбули визначені ключова карта чи підсвітка. Дуже корисно для налагодження!
joeytwiddle

@joeytwiddle Дякую! Я додав цю інформацію у відповідь.
Лоранс Гонсалвз

Коли ви ввійдете в створення спеціальних відображень, це врятує вашу дупу стільки разів, мабуть, одне з найкорисніших тут (ІМО)!
SidOfc


98

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

:g/match/y A

внесе (скопіює) всі рядки, що містять "матч", в "a/ @aреєстр. ( Пропис з великої літери як Avim додає янки замість заміни попереднього вмісту реєстру.) Нещодавно я використовував його для створення таблиць стилів Internet Explorer.


рахує, рахує, як я цього не бачив :)

Хороший. Ніколи не чув про це ... Може бути корисним: P
skinp

5
Ви можете використовувати: g! знайти рядки, які не відповідають шаблону, наприклад: g! / set / normal dd (видалити всі рядки, які не містять набір)
tsukimi

3
Іноді краще робити те, що сказав цукімі, і просто відфільтрувати лінії, що не відповідають твою схемі. Скорочена версія цієї команди, хоча: :v/PATTERN/dПояснення: :v- це абревіатура для :g!, і :gкоманда застосовує будь-яку колишню команду до рядків. :y[ank]працює і так :normal, але тут найприродніше, що потрібно зробити :d[elete].
pandubear

Ви також можете зробити це :g/match/normal "Ayy- normalключове слово дозволяє дозволити йому запускати команди в звичайному режимі (які вам, мабуть, більш знайомі).
Кімбол Робінсон

93

Хочете переглянути вашу: історію команд?

q:

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

Ви коли-небудь вносили подібні зміни до двох файлів і перемикалися між ними назад і назад? (Скажіть, вихідні та заголовні файли?)

:set hidden
:map <TAB> :e#<CR>

Потім вкладіть вперед і назад між цими файлами.


131
Мене q:випадково вдарило весь час ...
Джош Лі,

11
Крім того, з колишнього редактора (:), ви можете зробити CTRL-f, щоб спливати вікно історії команд.
Jason Down

6
@jleedev мене теж. Я майже ненавиджу цю команду, просто тому, що я дуже випадково використовую її.
bradlis7

9
q / і q? можна використовувати аналогічну річ для ваших пошукових моделей.
bpw1621

5
Натискання клавіші <Cf> після: або / або будь-який час, коли ви перебуваєте в командному режимі), відкриє те саме меню історії. Таким чином, ви можете переробити q: якщо ви потрапили випадково в нього сильно і все одно отримаєте доступ до цього дивовижного режиму.
idbrii

82

Наприклад, Vim відкриє URL-адресу

vim http://stackoverflow.com/

Приємно, коли вам потрібно витягнути джерело сторінки для довідок.


2
Для мене це не відкрило джерело; натомість він, мабуть, використовував посилання, щоб скинути відображену сторінку в буфер, а потім відкрив її.
Іван Вучиця

є помилка при виконанні цієї команди
Dzung Nguyen

5
Краще працює з косою в кінці. Акуратний трюк!
Томас

@Vdt: Було б корисно, якщо ви опублікували свою помилку. Якщо це: " помилка (netrw), ні wget, ні команда fetch недоступні", очевидно, вам потрібно зробити один із цих інструментів доступним для вашої змінної середовища PATH.
Ісаак Некіттепас

Я вважаю це особливо корисним, коли люди надсилають посилання на службу вставки та забули вибрати виділення синтаксису, я, як правило, просто повинен відкрити посилання в vim після додавання "& raw".
Детторер

68

Макроси можуть називати інші макроси, а також можуть називати себе.

наприклад:

qq0dwj@qq@q

... видалить перше слово з кожного рядка до кінця файлу.

Це досить простий приклад, але він демонструє дуже потужну особливість vim


2
Я не знав, що макроси можуть повторитись. Класно. Примітка: qx починає запис у регістр x (він використовує qq для регістра q). 0 рухається до початку рядка. dw видаляє слово. j рухається вниз по лінії. @q знову запустить макрос (визначивши цикл). Але ви забули закінчити запис остаточним "q", а потім фактично запустити макрос, набравши @q.
Кімбол Робінсон

2
Я думаю, що це навмисно, як вкладений та рекурсивний макрос.
Yktula

7
qqqqqifuu<Esc>h@qq@q
Джерардо Марсет

6
Інший спосіб цього досягти - це записати макрос в регістр a, який здійснює деяку трансформацію в одну лінію, а потім по рядку виділити купу рядків з V та ввести, :normal! @aщоб застосувати свій макрос до кожного рядка у вашому виділенні.
Натан Лонг

Я знайшов цю публікацію в гуглінгу рекурсивних макросів VIM. Я не міг знайти іншого способу зупинити макрос, крім вбивства процесу VIM.
dotancohen

55

Якщо припустити, що у вас зібрана підтримка Perl та / або Ruby, :rubydoі :perldoвона запустить однолінійку Ruby або Perl у кожному рядку в діапазоні (за замовчуванням до всього буфера) з $_прив’язкою до тексту поточного рядка (мінус новий рядок). Маніпуляція$_ змінить текст цього рядка.

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

:perldo $_ = join ' ', reverse split

Щоб вставити випадковий рядок з 8 символів (AZ) в кінці кожного рядка:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

Ви обмежуєтесь діяти в одному рядку, і ви не можете додавати нові рядки.


Що робити, якщо я хочу лише, щоб Perldo запускався у визначеному рядку? або кілька вибраних рядків?
Sujoy

5
Ви можете надати йому діапазон, як і будь-якій іншій команді. Наприклад: 1,5perldo працюватиме лише на лініях 1-5.
Брайан Карпер

Чи можете ви зробити $ _ + = '\ nNEWLINE !!!' щоб отримати новий рядок після поточного?
Грег

На жаль, це просто додає прикольний контрольний символ до кінця рядка. Потім можна використовувати пошук / заміну Vim, щоб змінити всі ці контрольні символи на реальні нові рядки.
Брайан Карпер

3
Аналогічно, pydoі py3doпрацюйте для python, якщо у вас складена необхідна підтримка.
Дерехо

54

^ О і ^ я

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

гі

Перейдіть до положення, де останній час режим зупинки був зупинений. Я часто можу редагувати, а потім щось шукати. Щоб повернутися до місця редагування, натисніть gi.

gf

покладіть курсор на ім'я файлу (наприклад, включіть заголовок файл), натисніть gf і файл відкриється

gF

схожий на gf, але розпізнає формат "[ім'я файлу]: [номер рядка]". Якщо натиснути gF, ви відкриєте [ім'я файлу] та встановите курсор на [номер рядка].

^ Р і ^ Н

Автоматичне завершення тексту під час редагування (^ P - попередня відповідність і ^ N наступна відповідність)

^ X ^ L

Поки редагування завершується в одному рядку (корисно для програмування). Ви пишете код, а потім згадуєте, що у вас є той самий код десь у файлі. Просто натисніть ^ X ^ L і повний рядок завершено

^ X ^ F

Повні назви файлів. Ви пишете "/ etc / pass" Хм. Ви забули ім'я файлу. Просто натисніть ^ X ^ F і ім’я файлу завершено

^ Z або: ш

Переміщення тимчасово до оболонки. Якщо вам потрібно швидке базування:

  • натисніть ^ Z (щоб поставити vi у фоновому режимі), щоб повернутися до початкової оболонки, і натисніть fg, щоб повернутися до vim назад
  • натисніть: sh, щоб перейти до додаткової оболонки, і натисніть ^ D / вихід, щоб повернутися до vi назад

Що ^X^Fстосується мого домашнього улюбленця, те, що файлові =файли містять знаки, змушуючи їх робити гнилі речі в багатьох випадках (файли ini, файли тощо). Я використовую se isfname-==для закінчення цієї неприємності
1212

3
+1 вбудований автозаповнення просто сидить там і чекає його виявлення.
joeytwiddle

48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor

2
Я не бачу, для чого це добре (до того ж виглядає як відповідь жартом). Хтось ще може мене просвітити?
Райан Едвардс

2
відкрити vim, а потім зробити ": для i в діапазоні (1,255) | .put = '10 .0,0.'. i | endfor"
кодигман

2
@RyanEdwards заповнення / тощо / господарі можливо
Руслан

26
Це надзвичайна відповідь. Не біт про створення IP-адрес, а біт, який передбачає, що VIM може використовувати для циклів у командах .
dotancohen

4
Без колишнього режиму:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap

47

Це хороший трюк, щоб знову відкрити поточний файл з іншим кодуванням:

:e ++enc=cp1250 %:p

Корисно, коли вам доведеться працювати зі застарілими кодуваннями. Підтримувані кодування вказані в таблиці під encoding-values(див. help encoding-values). Аналогічна річ працює і для того ++ff, що ви можете знову відкрити файл з кінцями рядків Windows / Unix, якщо ви вперше помилилися (див. help ff).


Ніколи не доводилося використовувати такі речі, але ми обов'язково додамо до мого арсеналу хитрощів ...

чудова порада, дякую. Для бонусних балів додайте список поширених дійсних кодувань.
Адріано Варолі П'яцца

2
Я використовував це сьогодні, але, думаю, мені не потрібно було вказувати "%: p"; просто відкрити файл і: e ++ enc = cp1250 було достатньо. Я
Іван Вучиця

буде: set encoding = cp1250 матиме такий же ефект?
лаз

1
`: e + b% 'аналогічно корисний для повторного відкриття у двійковому режимі (відсутність перенесення нових рядків)
інтуїтивно

47

Введення == виправить відступ поточного рядка на основі рядка вище.

Насправді ви можете зробити знак = =, за яким слідує будь-яка команда руху. = {рух}

Наприклад, ви можете використовувати рух%, який рухається між відповідними дужками. Помістіть курсор на {у наступному коді:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

І натисніть =%, щоб миттєво отримати це:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

Крім того, ви можете робити = {{ в кодовому блоці, а не розміщувати себе прямо на символі {.


Гм, я не знав цього про відступ.
Ehtesh Choudhury

Зазвичай не потрібно бути точно на брекеті. Думаю, що часто я просто =}або vaBaB=тому, що він менш залежний. Крім того, v}}:!astyle -bjкраще відповідає моєму %!astyle -aj
кодовому

7
gg=Gдосить акуратний, коли щось вклеюєш.
kyrias


@kyrias О, я це робив так ggVG=.
Бреден Кращий

42
imap jj <esc>

7
як тоді ви введете jj? : P
hasen

6
Як часто ви набираєте jj? Принаймні англійською?
ojblass

50
Натомість я перевстановив caplock для esc, оскільки це інакше марний ключ. Моє відображення було на широкому рівні ОС, тому воно має додаткову перевагу - ніколи не турбуватися про те, щоб випадково потрапити на нього. Єдиний недолік - НАЙБІЛЬШЕ ЖИТТЯ НА ЛЮДЕЙ. :)
Олексій

7
@ Алекс: безумовно, блокування - це смерть. "зачекайте, wtf? о, це був ZZ? .... лайно."
інтуїтивно

5
@ojblass: Не впевнений , скільки людей ніколи НЕ правильний код MATLAB в Vim, але iiі , jjяк правило , використовуються для змінних лічильника, так iі jзарезервовані для комплексних чисел.
brianmearns

37

Подивимося, якийсь невеликий редактор IDE робить перенесення стовпців.

:%s/\(.*\)^I\(.*\)/\2^I\1/

Пояснення

\(і \)як запам’ятати речі в регекс-ланд. І \1, і \2т.д., як витягти запам'ятовується матеріал.

>>> \(.*\)^I\(.*\)

Запам’ятайте все, за яким слідує ^I(вкладка), за яким все.

>>> \2^I\1

Замініть вищевказані речі на "2-й матеріал, який ви запам'ятали", а потім на "1-й матеріал, який ви запам'ятали" - це, по суті, переміщення.


4
Перемикає між собою пару розділених на вкладку стовпців (роздільник довільний, це все регулярне вираження).
хаос

39
Це просто регулярний вираз; велика кількість ідентифікаторів IDE мають регулярний пошук і заміну.
rlbond

7
@rlbond - Це зводиться до того, наскільки хороший двигун регулярного вибору в IDE. Регекси Віма досить потужні; інші .. не так часто.
romandas

3
* Буде жадібним, тому цей регулярний вираз передбачає, що у вас є лише два стовпці. Якщо ви хочете, щоб це було ненормативно, використовуйте {-} замість * (див. Допомогу не жадібним для отримання додаткової інформації про {} множник)
Кімбол Робінсон

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

30

Не зовсім темний секрет, але я люблю вносити наступне відображення у мій файл .vimrc, щоб я міг натиснути "-" (мінус) у будь-який час, щоб відкрити провідник файлів, щоб показати файли, суміжні з тим, що я просто редагую . У провіднику файлів я можу натиснути інший "-" для переміщення вгору по одній директорії, забезпечуючи безпроблемний перегляд складних структур каталогів (на зразок тих, які використовуються сьогодні в структурах MVC):

map - :Explore<cr>

Вони можуть бути корисними для когось. Мені подобається прокручувати екран і одночасно просувати курсор:

map <c-j> j<c-e>
map <c-k> k<c-y>

Навігація вкладками - я люблю вкладки, і мені потрібно легко переходити між ними:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Тільки на Mac OS X: навігація на вкладках у форматі Safari:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>

Ви також можете переглядати файли в самому Vim, використовуючи: Explore
Roman Plášil

Привіт Романе, саме це робить таке картографування, але призначає його "гарячому клавіші". :)
KKovacs

27

Мені подобається використовувати 'sudo bash', і мій sysadmin ненавидить це. Він заблокував 'sudo', тому його можна було використовувати лише з кількома командами (ls, chmod, chown, vi тощо), але я міг у будь-якому випадку використати vim, щоб отримати кореневу оболонку:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#

9
FWIW, sudoedit (або sudo -e) редагує привілейовані файли, але запускає ваш редактор як звичайний користувач.
RJHunter

12
так ... я теж вас ненавиджу;) вам потрібна буде тільки коренева оболонка ДУЖЕ РІДНО, якщо ви вже не маєте звички виконувати занадто багато команд як root, а це означає, що ваші дозволи дозволені.
Ми всі Моніка

5
Чому ваш sysadmin навіть дає вам корінь? : D
d33tah

26

Часто мені подобається змінювати поточні каталоги під час редагування - тому мені доведеться менше вказувати шляхи.

cd %:h

Що це робить? І чи працює це з autchdir?
Леонард

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

1
: set autochdir // це також працює з тією ж функціональністю, і він змінює поточний каталог на каталог файлу в буфері
Naga Kiran

25

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

map + <C-W>+
map - <C-W>-

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


16
Також є Ctrl-W =, що робить вікна однаковою шириною.
Білл Лінч

2
Не забувайте, що ви можете додати номери, щоб виконати дію кілька разів у Vim. Отже, щоб розширити поточну висоту вікна на 8 рядків: 8 <CW> +
joeytwiddle

23

Не незрозуміла особливість, але дуже корисна та економія часу.

Якщо ви хочете зберегти сеанс відкритих буферів, вкладок, маркерів та інших налаштувань, ви можете опублікувати наступне:

mksession session.vim

Ви можете відкрити сеанс за допомогою:

vim -S session.vim

5
Можна також :so session.vimвсередину vim.
TankorSmash

22
:r! <command>

вставляє вихід зовнішньої команди в буфер.

Займіться математикою і отримайте результат прямо в тексті:

:r! echo $((3 + 5 + 8))

Отримайте список файлів для складання під час написання Makefile:

:r! ls *.c

Не шукайте того факту, який ви читаєте у Вікіпедії, а безпосередньо вставте його в документ, який ви пишете:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever

14
^ R = 3 + 5 + 8 у режимі вставки дозволить вам вставити значення виразу (3 + 5 + 8) у текст із меншою кількістю натискань клавіш.
Судханшу

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


21

Зробіть карту F5, щоб швидко ROT13 вашого буфера:

map <F5> ggg?G``

Ви можете використовувати його як головний ключ :).


14
Я не знаю, про що ви пишете ... Але, безумовно, моєму начальникові було б цікавіше, коли він побачив мене, як я пишу
РОТ13 джемба

або підмінити своїм друзям: nmap i ggg?G`` . Або диявольське: nmap i ggg?G``i!
ромеови

1
@romeovs 2nd - це нескінченна петля, використовуйте nnoremap
Amit Gold

19

Я щойно знайшов цю сьогодні через NSFAQ :

Коментуйте блоки коду.

Увійдіть у режим візуального блоку, натиснувши CTRL-V.

Позначте блок, який ви хочете прокоментувати.

Натисніть I (капітал I) і введіть рядок коментарів на початку рядка. (// для C ++)

Натисніть ESC, і всі вибрані рядки матимуть // попередньо попередню лінію.


Я додав #, щоб прокоментувати блок коду в рубіні. Як це скасувати.
Neeraj Singh

3
Ви можете просто натиснути клавішу ctrl + v ще раз, позначити // 'і натиснути x на "прокоментувати"
нос

6
Для цього я використовую NERDCommenter.
ZyX

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

1
@Pie, оскільки коментований код - це мертвий код . Мертвий код не виконує корисних цілей і створює безлад. Ви думаєте, що ви зберігаєте код, який, можливо, захочете повернути пізніше, але завжди є кращий спосіб. Ви можете використовувати свою історію скасування, ви можете копіювати файл або git, в який вбудована ця функціональність ( git checkout). Що стосується кращого використання для блокової вставки, тут немає жодного встановленого каменя. Ви просто використовуєте його, коли у вас є кілька рядків, де ви хочете вставити одну і ту ж послідовність символів в одне місце.
Бреден Кращий

17

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

:set paste

перед тим, як вставити свої дані. Це не дозволить йому заплутатися.

Зауважте, що вам потрібно буде :set nopasteвідновити автоматичне відступ. Альтернативними способами вставки попередньо відформатованого тексту є регістри буфера обміну ( *і +) та:r!cat (вам доведеться закінчити вставлений фрагмент ^ D).

Також іноді корисно ввімкнути кольорову гаму з високим контрастом. Це можна зробити за допомогою

:color blue

Я помітив, що він працює не у всіх версіях vim, які я використовую, але він працює на більшості.


10
"Спотворення" відбувається тому, що у вас включена певна форма автоматичного відступу. Використання set pasteабо вказівка ​​ключа для pastetoggleпараметра - це поширений спосіб подолати це, але такий же ефект можна досягти set mouse=aі тоді, коли Вім знає, що потоп тексту, який він бачить, - це вставка, викликана мишею.
Jamessan

1
Якщо у вас встановлений gvim, ви можете часто (хоча це залежить від ваших параметрів, з якого компілюється vim), використовуючи буфер обміну X безпосередньо з vim через реєстр *. Наприклад, "*pщоб вставити з Xlipboard. (Це також працює від терміналу vim. Просто вам може знадобитися пакет gvim, якщо вони окремі)
kyrias

2
@kyrias для запису, *є PRIMARY("середнім клацанням") реєстру. Буфер обміну є+
Брейден Best
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.