Каковы темные уголки Вима, о которых ваша мама никогда не рассказывала?

Существует множество вопросов, когда люди говорят об общих трюках, в частности "Vim + ctags советы и рекомендации.

Однако я не отношусь к обычно используемым ярлыкам, которые кто-то новый для Vim найдет круто. Я говорю о закаленном пользователю Unix (будь то разработчик, администратор, и т.д.), Который считает, что они знают, что 99% из нас никогда не слышали и не мечтали. Что-то, что не только облегчает их работу, но также COOL и хакерский. В конце концов, Vim живет в самой богатой темными уголками ОС в мире, поэтому у нее должны быть сложности, о которых знают только несколько привилегий и которые хотят поделиться с нами.

Ответ 1

Не может быть того, что 99% пользователей Vim не знают, но это то, что я использую каждый день и что любой Linux + Vim poweruser должен знать.

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

:w !sudo tee %

Я часто забываю sudo перед редактированием файла. У меня нет прав на запись. Когда я пришел, чтобы сохранить этот файл и получить ошибку разрешения, я просто выдаю эту команду vim, чтобы сохранить файл без необходимости сохранения его в временном файле, а затем снова скопировать его.

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

Ответ 2

Что-то, что я недавно обнаружил, что я подумал, было очень круто:

:earlier 15m

Возвращает документ обратно, как это было 15 минут назад. Может принимать различные аргументы за количество времени, которое вы хотите откат, и зависит от undolevels. Может быть отменено с помощью противоположной команды :later

Ответ 3

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

Но добавьте точку после двоеточия, :.! [command], и она выведет вывод команды в текущее окно. Это : . !

Например:

:.! ls

Я использую это много для таких вещей, как добавление текущей даты в документ, который я печатаю:

:.! date

Ответ 4

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

  • diw, чтобы удалить текущее слово
  • di( для удаления внутри текущего пароля
  • di", чтобы удалить текст между кавычками

Другие можно найти на :help text-objects

Ответ 5

de Удалите все до конца слова, нажав. в твоем сердце.

ci (xyz [Esc] - Это странно. Здесь "i" не означает режим вставки, а означает внутри скобки. Таким образом, эта последовательность разрезает текст внутри скобки, в которых вы находитесь, и заменяет ее "xyz", а также работает внутри квадратного и фигурного скобок - просто сделайте ci [или ci {соответственно. Естественно, вы можете сделать di (если вы просто хотите удалить весь текст без ввода текста вы также можете сделать a вместо i, если вы хотите также удалить круглые скобки, а не только текст внутри них.

ci " - сокращает текст в текущих кавычках

ciw - сокращает текущее слово. Это работает так же, как и предыдущее, за исключением того, что ( заменяется на w.

C - отрежьте остальную часть линии и переключитесь в режим вставки.

ZZ - сохранить и закрыть текущий файл (WAY быстрее, чем Ctrl-F4, чтобы закрыть текущую вкладку!)

ddp - переместить текущую строку на одну строку вниз

xp - переместить текущий символ в одну позицию вправо

U - верхний регистр, поэтому viwU поддерживает слово

~ - переключает регистр, поэтому viw~ будет обращать вспять весь текст

Ctrl + u/Ctrl + d прокрутите страницу полуэкрана вверх или вниз. Это кажется более полезным, чем обычный полноэкранный пейджинг, поскольку он упрощает просмотр того, как связаны два экрана. Для тех, кто по-прежнему хочет прокручивать весь экран за один раз, нажмите Ctrl + f для Forward и Ctrl + b для Backward. Ctrl + Y и Ctrl + E прокручиваются вниз или вверх по одной строке за раз.

Сумасшедшая, но очень полезная команда - zz - она ​​прокручивает экран, чтобы эта линия отображалась посередине. Это отлично подходит для размещения фрагмента кода, над которым вы работаете, в центре вашего внимания. Команды sibling - zt и zb - делают эту строку верхней или нижней на экране, что не так полезно.

% находит и переходит к соответствующей скобке.

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

bde - удалить текущее слово, разделитель слева направо

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

dt. - удалить до следующей точки

dd - удалить всю строку

ye (или yE) - текст yanks отсюда до конца слова

ce - прорезает конец слова

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

yy - копирует текущую строку

cc - сокращает текущую строку, вы также можете сделать S. Там также нижняя крышка S, которая обрезает текущий символ и переключается в режим вставки.

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

vi { - выберите весь текст в квадратных скобках. va {- выберите весь текст, включая {} s

vi (p - выделите все внутри() s и замените вставляемым текстом

b и e перемещайте курсор по слову, аналогично тому, как обычно Ctrl + Arrows. Определение слова несколько отличается, хотя несколько последовательных delmiters рассматриваются как одно слово. Если вы начинаете посередине слова, нажатие b всегда приведет вас к началу текущего слова, и каждый последующий b перейдет к началу следующего слова. Точно так же и легко запомнить, e получает курсор до конца текущего и каждого последующего слова.

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

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

Ответ 6

То, что я редко нахожу в большинстве учебников Vim, но он НЕОБХОДИМ полезен (по крайней мере для меня), это

g; and g,

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

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

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

Ответ 7

:%!xxd

Сделайте vim в шестнадцатеричном редакторе.

:%!xxd -r

Revert.

Предупреждение: если вы не редактируете с двоичным кодом (-b), вы можете повредить файл. - Джош Ли в комментариях.

Ответ 8

gv

Выбирает последний визуальный выбор.

Ответ 9

Иногда параметр в вашем .vimrc будет переопределен плагином или автокомандой. Для отладки этого полезной трюки является использование команды verbose в сочетании с: set. Например, чтобы выяснить, где cident получил set/unset:

: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

Ответ 10

Не уверен, что это вообще считается темно-угловым, но я только что узнал об этом...

:g/match/y A

будет копировать все строки, содержащие "совпадение" в регистр "a/@a. (Капитализация как A делает vim добавлением янки вместо замены предыдущего содержимого регистра.) Я использовал его очень недавно при создании таблиц стилей Internet Explorer.

Ответ 11

:%TOhtml

Создает html-рендеринг текущего файла.

Ответ 12

Хотите посмотреть на свою историю команд?

q:

Затем просмотрите, отредактируйте и, наконец, выполните команду.

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

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

Затем перейдите туда и обратно между этими файлами.

Ответ 13

Vim откроет URL-адрес, например

vim http://stackoverflow.com/

Приятно, если вам нужно подтянуть источник страницы для справки.

Ответ 14

Макросы могут вызывать другие макросы и также могут вызывать себя.

например:

[email protected]@q

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

Это довольно простой пример, но он демонстрирует очень мощную функцию vim

Ответ 15

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

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

:perldo $_ = join ' ', reverse split

Вставить случайную строку из 8 символов (A-Z) в конце каждой строки:

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

Вы ограничены действиями по одной строке за раз, и вы не можете добавлять новые строки.

Ответ 16

^ O и ^ I

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

г

Перейдите в положение, в котором режим вставки был остановлен последним. Я часто нахожусь в редактировании, а затем что-то ищу. Чтобы вернуться в место редактирования, нажмите gi.

гс

поместите курсор на имя файла (например, включите заголовочный файл), нажмите gf и файл откроется

Gf

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

^ P и ^ N

Автоматическое заполнение текста при редактировании (^ P - предыдущее совпадение и ^ N следующее совпадение)

^ Х ^ л

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

^ X ^ F

Заполните имена файлов. Вы пишете "/etc/pass" Хмм. Вы забыли имя файла. Просто нажмите ^ X ^ F и имя файла будет завершено

^ Z или: sh

Переместить временную оболочку. Если вам нужно быстрое избиение:

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

Ответ 17

Это хороший трюк, чтобы повторно открыть текущий файл с другой кодировкой:

:e ++enc=cp1250 %:p

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

Ответ 18

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

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

Ответ 19

Ввод == исправит отступ текущей строки на основе указанной выше строки.

Собственно, вы можете сделать одно = знак, за которым следует любая команда перемещения. = {движение}

Например, вы можете использовать движение%, которое перемещается между соответствующими фигурками. Поместите курсор на {в следующем коде:

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

И нажмите =%, чтобы мгновенно получить это:

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

В качестве альтернативы вы можете сделать = a { внутри блока кода, вместо того, чтобы позиционировать себя прямо на символе {.

Ответ 20

imap jj <esc>

Ответ 21

Давайте посмотрим, какой небольшой редактор IDE выполнит транспонирование столбцов.

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

Объяснение

\( и \) заключается в том, как запомнить материал в regex-land. И \1, \2 и т.д. - это то, как извлекать запоминающиеся вещи.

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

Помните все, за которым следует ^I (вкладка), за которым следует все.

>>> \2^I\1

Замените вышеуказанный материал на "2-й материал, который вы запомнили", а затем "1-й материал, который вы запомнили" - по существу, выполнив транспонирование.

Ответ 22

Не совсем темный секрет, но мне нравится вставлять следующее отображение в мой .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>

Ответ 23

Часто мне нравится изменять текущие каталоги во время редактирования, поэтому мне нужно указывать пути меньше.

cd %:h

Ответ 24

Мне нравится использовать 'sudo bash', и мой системный администратор ненавидит это. Он заблокировал "sudo", поэтому его можно было использовать только с несколькими командами (ls, chmod, chown, vi и т.д.), Но я смог использовать vim для получения корневой оболочки:

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

Ответ 25

Я часто использую много окон, когда я работаю над проектом, и иногда мне нужно изменить их размер. Вот что я использую:

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

Эти сопоставления позволяют увеличить и уменьшить размер текущего окна. Это довольно просто, но быстро.

Ответ 26

:r! <command>

вставляет вывод внешней команды в буфер.

Сделайте некоторую математику и получите результат непосредственно в тексте:

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

Получить список файлов для компиляции при записи Makefile:

:r! ls *.c

Не смотрите на тот факт, что вы читаете в википедии, прямо вставьте его в документ, который вы пишете:

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

Ответ 27

Я нашел этот сегодня через NSFAQ:

Комментировать блоки кода.

Войдите в режим Blockwise Visual, нажав CTRL-V.

Отметьте блок, который вы хотите прокомментировать.

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

Нажмите "ESC", и все выбранные линии будут//добавлены в начало строки.

Ответ 28

Карта F5 для быстрого ROT13 вашего буфера:

map <F5> ggg?G``

Вы можете использовать его в качестве ключа босса:).

Ответ 29

Не скрытая особенность, но очень полезная и экономия времени.

Если вы хотите сохранить сеанс открытых буферов, вкладок, маркеров и других параметров, вы можете сделать следующее:

mksession session.vim

Вы можете открыть сеанс, используя:

vim -S session.vim

Ответ 30

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

:set paste

перед тем, как вставлять ваши данные. Это не позволит ему испортиться.

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

Иногда также полезно включить высококонтрастную цветовую схему. Это можно сделать с помощью

:color blue

Я заметил, что он не работает на всех версиях vim, которые я использую, но он работает на большинстве.