О каких темных углах Вима твоя мама никогда не говорила? [закрыто]


799

Существует множество вопросов, где люди говорят о распространенных трюках, в частности, « Vim + ctags tips and tricks ».

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


10
: Окно Sex Split и открытый встроенный файловый
менеджер

2
Этот вопрос кажется довольно конструктивным - если посмотреть на количество голосов "за" ... проголосовавших за повторное открытие - возможно, получится какой-то более прохладный ответ - за который можно проголосовать, если он будет полезен - следовательно, придать SOF большую ценность. Упорядочив ответы по голосам, я выучил много интересных вещей всего за 5 минут ... действительно ценный материал, зачем закрывать что-то такое ценное? Как это не конструктивно?
Джегедус

7
Смешно, что этот вопрос закрыт. Разговор о законничестве.
Лепидоптерист

2
Я считаю этот вопрос очень конструктивным, но более подходящим для Quora.
Диого Мело

2
Почему есть 2 (на данный момент) голоса, чтобы удалить этот вопрос? Что хорошего это может сделать?
Akavall

Ответы:


782

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

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

:w !sudo tee %

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

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


116
Возможно, это даже лучше, чем запуск vim от имени root! Upvoted!
Арафангион

27
Для новичка, что именно делает тройник? Будет ли кто-то против разбора этой команды для меня?
AndyL

41
Cmap W! w! sudo tee%
jm666

58
Вы никогда не должны бежать sudo vim. Вместо этого вы должны экспортировать EDITORкак VIM и запустить sudoedit.
Херардо Марсет

8
@maximus: vim заменяет% именем текущего буфера / файла.
Migu

617

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

:earlier 15m

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


6
@skinp: Если вы отмените, а затем внесете дополнительные изменения из отмененного состояния, вы потеряете эту историю повторов. Это позволяет вам вернуться в состояние, которого больше нет в стеке отмены.
ephemient

39
Также очень полезны g + и g-, чтобы идти вперед и назад во времени. Это намного мощнее, чем стек отмены / повторения, поскольку вы не теряете историю, когда делаете что-то после отмены.
Этьен Пьер

9
Вы не потеряете историю повторов, если внесете изменения после отмены. Это просто не легко получить доступ. Есть плагины, которые помогут вам визуализировать это, например, Gundo.vim
Ehtesh Choudhury

559
Вау, так что теперь я могу просто сделать, :later 8hи я сделал на сегодня? : P
Игорь Попов

7
Ваша команда предполагает, что в Vim вы проведете не менее 15 минут !
e2-e4

411

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

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

Например:

:.! ls

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

:.! date

74
Это очень похоже на: r! Насколько я могу судить, единственная разница в том, что: открывает новую строку: перезаписывает текущую строку.
Saffsd

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

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

2
@sundar: Зачем передавать строку sed, если вы можете использовать аналогичные встроенные команды ed/ ex? Попробуйте запустить :.s/old/new/g;-)
Jabirali

4
А также обратите внимание, что '!' это как 'y', 'd', 'c' и т. д. т. е. вы можете сделать: !!, number !!,! motion (например,! Gshell_command <cr> заменить из текущей строки в конец файла ('G') на вывод команды shell_command).
AQn

312

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

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

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


8
dab «удалить квадратные скобки», daB для фигурных скобок, t для тегов типа xml, комбинации с обычными командами соответствуют ожидаемым cib / yaB / dit / vat и т. д.
sjh

15
@Masi: yi (va (p удаляет только квадратные скобки
Дон Реба

42
Возможно, это самая главная причина, почему я остался с Вимом. Это и его эквивалентные команды «изменения»: ciw, ci (, ci ", а также dt <пробел> и ct <пробел>
thomasrutter

4
@thomasrutter: почему бы не dW / cW вместо dt <пробел>?

9
@Masi: с плагином объемного звучания: ds (.

237

де Удалить все до конца слова, нажав кнопку. по желанию вашего сердца.

ci (xyz [Esc] - это странный вариант. Здесь 'i' не означает режим вставки. Вместо этого он означает внутри скобок. Таким образом, эта последовательность обрезает текст внутри скобок, в котором вы находитесь, и заменяет его на . «хуг» Он также работает внутри квадратных и фигурных скобках - просто сделать CI [или CI {соответственно , естественно, вы можете сделать ди (если вы просто хотите , чтобы удалить весь текст без ввода ничего вы также можете сделать.. aа iесли вы Я хочу удалить скобки, а не только текст внутри них.

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

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

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

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

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

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

U - заглавные, поэтому viwUслово переносится вверх

~ - переключает регистр, поэтому viw~обратный регистр всего слова

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

b и e перемещают курсор слово за словом, как обычно делают Ctrl + Arrows . Хотя определение слова немного отличается, так как несколько последовательных разделителей рассматриваются как одно слово. Если вы начинаете с середины слова, нажатие кнопки 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 для «cut» - «delete», сделанный с помощью d / D. Основное различие между изменением и удалением состоит в том, что удаление оставляет вас в обычном режиме, но изменение переводит вас в своего рода режим вставки (хотя вы все еще находитесь в команде изменения, которая удобна, так как все изменение можно повторить .).
Лоуренс Гонсалвес

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

19
byeне работает, когда вы находитесь в первом символе слова. yiwвсегда делает.
Андреа Франсия

204

Тот, который я редко нахожу в большинстве уроков Vim, но он НЕВЕРОЯТНО полезен (по крайней мере для меня), это

g; and g,

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

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

Просто мои 2цента.


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

8
Ctrl-O и Ctrl-I (вкладка) будут работать аналогично, но не одинаково. Они перемещаются назад и вперед в «списке переходов», который вы можете просмотреть, выполнив: jumps или: ju. Для получения дополнительной информации создайте: help jumplist
Kimball Robinson

17
Вы можете перечислить список изменений, выполнив: Изменения
Кимбалл Робинсон

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

187
:%!xxd

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

:%!xxd -r

Revert.

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


9
И как вы вернули его обратно?
Кристиан

40
:! xxd -r // Чтобы вернуться из HEX
Нага Киран

21
Я на самом деле думаю, что это :%!xxd -rвернуть его обратно
Андреас Греч

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

4
@dotancohen: Если вы не хотите закрывать / открывать файл, который вы можете сделать: установите двоичный файл
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 Спасибо! Я добавил эту информацию в ответ.
Лоуренс Гонсалвес

Когда вы приступаете к созданию пользовательских сопоставлений, это много раз спасет вашу задницу, возможно, один из самых полезных здесь (IMO)!
SidOfc


98

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

:g/match/y A

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


считает, считает, как я не видел этого :)

Хороший. Никогда не слышал об этом ... Может быть полезно: P
skinp

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

3
Иногда лучше сделать то, что сказал Цукими, и просто отфильтровать строки, которые не соответствуют вашему шаблону. Хотя сокращенная версия этой команды: :v/PATTERN/dОбъяснение: :vявляется сокращением для :g!, и :gкоманда применяет любую команду ex к строкам. :y[ank]работает и так делает :normal, но здесь самое естественное, что нужно сделать, это просто :d[elete].
pandubear

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

93

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

q:

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

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

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

Затем переключайтесь между этими файлами.


131
Я q:все время случайно попал ...
Джош Ли

11
Кроме того, из редактора ex (:) вы можете нажать CTRL-f, чтобы открыть окно истории команд.
Джейсон Даун

6
@jleedev я тоже. Я почти ненавижу эту команду, просто потому, что использую ее случайно слишком часто.
bradlis7

9
q / и q? может быть использован, чтобы сделать аналогичную вещь для ваших шаблонов поиска.
bpw1621

5
Нажатие <Cf> после: или / (или в любое время, когда вы находитесь в командном режиме) вызовет то же самое меню истории. Таким образом, вы можете переназначить q: если вы сильно ударили по нему и все равно получили доступ к этому классному режиму.
idbrii

82

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

vim http://stackoverflow.com/

Приятно, когда вам нужно подтянуть исходную страницу для справки.


2
Для меня это не открыло источник; вместо этого он, по-видимому, использовал elinks для выгрузки отрисованной страницы в буфер, а затем открыл ее.
Иван Вучица

есть ошибка при выполнении этой команды
Dzung Nguyen

5
Лучше работает с косой чертой в конце. Аккуратный трюк!
Томас

@Vdt: было бы полезно, если бы вы опубликовали свою ошибку. Если это так: « error (netrw), ни wget, ни команда fetch недоступны», вам, очевидно, нужно сделать один из этих инструментов доступным из переменной среды PATH.
Исаак Некиттепас

Я нахожу это особенно полезным, когда люди отправляют ссылки на сервис вставки и забывают выбрать подсветку синтаксиса, я обычно просто открываю ссылку в vim после добавления «& raw».
Dettorer

68

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

например:

qq0dwj@qq@q

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

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


2
Я не знал, что макросы могут повторяться. Круто. Примечание: qx начинает запись в регистр x (он использует qq для регистра q). 0 перемещается в начало строки. DW удаляет слово. J движется вниз по линии. @q снова запустит макрос (определив цикл). Но вы забыли завершить запись последним «q», а затем запустить макрос, набрав @q.
Кимбалл Робинсон

2
Я думаю, что это намеренно, как вложенный и рекурсивный макрос.
Иктула

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, если у вас есть необходимая поддержка, скомпилированная в.
Derecho

54

^ O и ^ I

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

солдат

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

гс

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

Г.Ф.

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

^ P и ^ N

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

^ X ^ L

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

^ X ^ F

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

^ Z или: sh

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

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

С ^X^Fмоим домашним животным мозоль является то , что имена файлов включают в себя =признаки, делая это делать гнилые вещи во многих случаях (INI - файлы, файлы Makefile , и т.д.). Я использую, se isfname-==чтобы положить конец этой неприятности
сехе

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"
codygman

2
@RyanEdwards заполняет / etc / hosts возможно
Руслан

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;
    }
}

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


Хм, я не знал об отступе.
Этеш Чоудхури

Нет необходимости, как правило, быть точно на брекетах. Мысль часто я просто =}или vaBaB=потому что это менее зависимым. Кроме того, v}}:!astyle -bjлучше соответствует моему стилю кода, но я могу вернуть его в ваш стиль с помощью простого%!astyle -aj
sehe

7
gg=Gдовольно аккуратно при вставке во что-то.
Кириас


@kyrias О, я так и делаю ggVG=.
Брэден Бест

42
imap jj <esc>

7
как ты тогда будешь печатать jj? : P
hasen

6
Как часто вам набирают jj? На английском хотя бы?
ojblass

50
Вместо этого я переназначил capslock на esc, так как это бесполезный ключ. Мое сопоставление было доступно для всей ОС, поэтому у него есть дополнительное преимущество: никогда не нужно беспокоиться о случайном попадании в него. Единственный недостаток - это тяжелее кричать на людей. :)
Алекс

7
@ Алекс: определенно, капслок это смерть. "Подожди, что за 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. Регулярные выражения Вима довольно мощные; другие .. не так много иногда.
Романдас

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, и мой системный администратор ненавидит это. Он заблокировал «sudo», чтобы его можно было использовать только с несколькими командами (ls, chmod, chown, vi и т. Д.), Но я все равно смог использовать vim для получения оболочки root:

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

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

12
да ... я бы тоже вас ненавидел;) вам нужна ОЧЕНЬ РЕАЛЬНАЯ оболочка, только если вы уже не привыкли запускать слишком много команд от имени пользователя root, что означает, что все ваши разрешения испорчены.
Мы все Моника,

5
Почему ваш системный администратор даже дает вам root? : 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
Я не знаю, что вы пишете ... Но, конечно, моему боссу было бы более любопытно, когда он увидел, как я пишу беспорядок ROT13 :)
sehe

или подделать своих друзей nmap i ggg?G`` . Или дьявольское nmap i ggg?G``i!
romeovs

1
@romeovs 2-й - бесконечный цикл, используйте nnoremap
Amit Gold

19

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

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

Войдите в блочный визуальный режим, нажав CTRL-V.

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

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

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


Я добавил #, чтобы закомментировать блок кода в ruby. Как мне отменить это.
Нирадж Сингх

3
Вы можете просто снова нажать Ctrl + V, отметить // и нажать x, чтобы «раскомментировать»
nos

6
Я использую NERDCommenter для этого.
ZyX

1
Закомментированный код, вероятно, является одним из худших типов комментариев, который вы могли бы добавить в свой код. Существуют лучшие варианты использования вставки удивительного блока.
Брэден Бест

1
@ Пирог, потому что закомментированный код - мертвый код . Мертвый код не имеет смысла и создает беспорядок. Вы думаете , что сохраняете код, который, возможно, захотите вернуть позже, но всегда есть лучший способ. Вы можете использовать свою историю отмен, вы можете дублировать файл или использовать git, в который встроена эта функция ( git checkout). Что касается лучшего использования для вставки блока, то здесь нет никаких каменных элементов. Вы просто используете его, когда у вас есть несколько строк, где вы хотите вставить одну и ту же последовательность символов в одном месте.
Брэден Бест

17

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

:set paste

перед вставкой в ​​ваши данные. Это будет держать его от путаницы.

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

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

:color blue

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


10
Происходит «искажение», потому что у вас включена некоторая форма автоматического отступа. Использование set pasteили указание ключа для этого pastetoggleпараметра является обычным способом обойти это, но тот же эффект может быть достигнут с помощью того, set mouse=aчто Vim знает, что поток текста, который он видит, представляет собой вставку, вызванную мышью.
Jamessan

1
Если у вас установлен gvim, вы можете часто (хотя это зависит от того, с какими параметрами ваш дистрибутив компилирует vim) использовать буфер обмена X непосредственно из vim через регистр *. Например, "*pчтобы вставить из X Xlipboard. (Он также работает с терминала vim, просто вам может понадобиться пакет gvim, если они разделены)
kyrias

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