Каковы темные уголки Вима, о которых ваша мама никогда не рассказывала?
Существует множество вопросов, когда люди говорят об общих трюках, в частности "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, которые я использую, но он работает на большинстве.