Vim: различия между версиями

6 байт добавлено ,  2 года назад
Нет описания правки
{{wikipedia}}
[[File:Vim.png|thumb|Vim]]
Продвинутый текстовый редактор — кошмар для случайного пользователя. Если его удаетсяудаётся в конце концов закрыть, то вздыхаешь с облегчением и твердойтвёрдой уверенностью, что больше не будешь запускать эту программу ни разу в жизни.
 
Пожалуй, Vim нельзя просто запустить и начать работать — требуется определеннаяопределённая подготовка. Зато стоит раз испытать его в деле и поражаешься тому, как можно было без него обходиться.
 
:Для быстрого ознакомления с функциональностью Vim запустите команду vimtutor.
nwr1ZZ
 
В данном случае задачей было изменить значение определенногоопределённого параметра конфигурации apache. В обычном редакторе подобный результат достигается следующими действиями:
 
# editor_name httpd.conf
Объяснение команд VIM:
* / — Перейти в режим поиска
* KлавишаКлавиша '''Enter''' — Искать'.
* n — Перейти к следующему вхождению искомой строки
* w — Переместить курсор к следующему слову
— А что, что-то есть ещё?</blockquote>
 
Диалог симпатичный, но несколько несвязный. Давайте изменим его — для этого необходимо перейти в режим ввода. Самый простой способ — из обычного режима нажатие клавиши «i». После чего можно смело приступать к вводу текста. <ESC> вернетвернёт нас к обычному режиму.
 
''Вводное замечание.'' Поскольку заглавные и строчные буквы команд соотвествуютсоответствуют разным командам, следует быть внимательным к регистру ввода, например, не нажата ли случанослучайно клавиша <code><CAPS LOCK></code>. Чтобы отменить ошибочные действия используйте команду <code>U</code>.
 
Другие важные команды:
* <code>o</code> — перейти в режим ввода с новой строки под курсором
* <code>O</code> — перейти в режим ввода с новой строки над курсором
* <code>s</code> - заменяет указанное количество символов (удалетудаляет указанное число символов и переходит в режим ввода). В отличии от команды <code>с</code> которая может удалить кусок текста размером не меньше слова (<code>cw</code>), командой <code>s</code> можно удалить любое число символов. Например <code>4s</code> удалит четыре символа начиная с того который находится под курсором. Эта команда применяется для замены одного или нескольких символов другими символами.
* <code>S</code> - удаляет всю текущую строку и переходит в режим ввода. Число перед командой показывает сколько нужно удалить строк начиная с текущей. Например <code>4S</code> удалит четрыечетыре строки включая текущую.
* <code>R</code> — перейти в режим ввода с заменой текста (аналог insert). Символы под курсором заменяются на вводимые. Команда применяется когда неизвестно сколько придетсяпридётся изменить символов на другие (иначе можно было бы использовать команду <code>s</code> с указанием числа заменяемых символов, например, <code>7s</code>). При удалении вводимых символов возвращаются те которые были до ввода команды. Такой режим сохраняется до конца строки. При вводе новой строки (по нажатию Enter), происходит не переход на другую строку с тем же режимом замены текста, а создание новой строки.
* <code>r</code> — заменить один символ. Заменяет символ находящийся под курсором на символ который следует за командой. При этом не происходит выхода из командного режима (не надо нажимать ESC после изменения текста). Например, команда <code>ry</code> - символ под курсором меняется на "y". Числовой показатель указывает сколько символов необходимо заменить на данный. Например, <code>3ry</code> вставляет три символа "y".
 
* <code>y<число>y</code> — копирование числа строк начиная с текущей в неименованный буфер
* <code>p</code> — вставка содержимого неименнованного буфера под курсором. Поскольку в vim девять ячеек буфера удаления. Можно вставить не только последнее удаление но и удаления сделанные ранее. Например "<code>4p</code> вставит под курсор содержимое четвертого удаления начиная с последнего. Также чтобы поменять местами два символа можно использовать комбинацию команд "удалить" -<code>x</code> (удаление в буфер) и "вставить" - <code>p</code> (вставить из буфера). Таким образом, поставив курсор на первую букву из двух которые необходимо поменять местами и нажав комбинацию клавиш <code>xp</code> мы совершим необходимые действия.
* <code>P</code> — вставка содержимого неименнованногонеименованного буфера перед курсором
* <code>J</code> — слияние текущей строки со следующей. Числовой аргумент перед командой показывает сколько следующих линий необходимо объединить с текущей. Например <code>2J</code> объединить две следующие строки с текущей, на которой расположен курсор.
 
Команды <code>u</code> и <code>U</code> могут отменять друг друга.
 
* <code><Ctrl-r></code> или <code>:redo</code> впередвперёд по изменениям
* <code>.</code> — повтор последней команды, включая ввод текста.
* <code>~</code> - тильда меняет символы под курсором на противоположный регистр (заглавные в прописные и прописные в заглавные) может применяться числовой показатель. например, команда <code>5~</code><code></code> поменяет пять символов начиная с текущего под курсором на противоположный регистр.
 
:w!<CR> - записать файл.
Эта команда может помочь, если файл открыт в режиме "read-only" (с опцией -R), если файл заблокирован другим пользователем, либо отсутствуют такие привилегии, либо ещеещё какая беда. При попытке записи без «!» будет выдано соответствующее предупреждение.
 
:w new_file<CR>
Создать новый файл «new_file» и записать в него текущее содержимое. Если файл существует, будет показано предупреждение. Дальше вы продолжаете работать со старым файлом — mamapapa.txt
 
Если при попытке сохранения появляется сообщение, что места на диске не осталось можно выйти в командную оболочку и освободить место на диске стерев ненужные файлы. Для этого применяется команда
этог применяется команда
 
:sh<CR> - переход в командную оболочку.
 
:q<CR> - выйти из редактора.
Если файл был измененизменён, у вас ничего не получится. В таких случаях необходимо добавлять после команды «!»:
 
:q!<CR> - выйти из файла, не сохраняя изменения
* Подсветка синтаксиса.
* Редактирование командной строкой.
* Достраивание именимён файлов.
* Визуальное редактирование.
* Кроссплатформенность.
Это существенное расширение возможностей Vi, без которого не обходится ни один «нормальный» текстовой редактор. Режим предназначен для выделения блока текста и дальнейшей работы с ним и состоит из 3-х последовательных шагов:
# Пометка начала блока с помощью «v», «V» или CTRL-V. Блок помечается с того символа на котором находится курсор(по умолчанию).
# Перемещение курсора в конец необходимого блока. Последний символ также будет включенвключён в выделенный блок.
# Вызов необходимой команды.
 
==== Можно добавить привычное поведение и привычные сочетания клавиш. ====
 
* Например, можно будет прокручивать (скроллить) текст колесикомколёсиком мыши и вставлять выделенное в X`ах мышкой в Vim нажатием средней кнопки мыши (нажать на колесикоколёсико мыши):
<pre>
set mouse=a
imap <F3> <Esc>:read
map <F3> <Esc>:read
Также возможен интересный приемприём работы:
:read !ls -la
Эта команда вставит в текущую позицию редактируемого текста весь вывод указанной после "<code>!</code>" команды (в нашем случае: <code>ls -la</code>).
cmap <F12> ^^
 
Кроме этого, в версии для Windows Vim по умолчанию не настроен на использование кодировок клавиатуры, содержащих символы кириллицы, например CP1251 и KOI8-R (в версии же для Linux настройка по умолчанию корректна). Как следствие этого, Vim при редактировании русского текста будет неправильно обрабатывать команды перемещения по тексту, основанные на поиске слова, такие как '''w''' (одно слово впередвперёд), '''b''' (одно слово назад), '''*''' (найти в тексте слово под курсором) и т. п. Чтобы настроить Vim для корректной работы с этими командами независимо от языка, достаточно добавить в файл конфигурации [[Vim#~/.vimrc|_vimrc]] следующую строку:
set iskeyword=@,48-57,_,192-255
 
(Так как в Mac-раскладке символы под цифрами вводят другие символы, соответствующие английским, например, нажатие Shift+4 вводит "%" вместо "$", их не получится переназначить, поэтому способ 1 подходит лучше.)
 
После этого Vim будет нормально понимать команды, вводимые при включеннойвключённой русской раскладке.
 
Если у вас локаль UTF, то данный способ не работает в старых версиях Vim. Необходимо каждый символ назначить индивидуально:
Более конкретный пример:
:vimgrep /translator/ R:\projects\**\*.txt | :copen
Команда vimgrep ищет строку или регулярное выражение заключенноезаключённое между символами // в файле или файлах и сбрасывает результаты в специальный буфер. А так же открывает файл с первым найденным результатом. Команда copen открывает буфер с результатами поиска.
Путь к файлам может указывать как на один файл так и на набор файлов. Чтобы путь указывал на несколько файлов надо использовать символы ? и *. Значение этих символов такое же как и в командной строке операционной системы. Чтобы поиск прошелпрошёл по всем подпапкам указанной папки можно использовать две звездочкизвёздочки **. Пример использования **:
/usr/inc**/*.h
может означать:
set fileencoding=utf-8 " set save encoding
set fileencodings=utf8,koi8r,cp1251,cp866,ucs-2le " список предполагаемых кодировок, в порядке предпочтения
К сожалению Vim не всегда удаетсяудаётся определить кодировку файла правильно, и вместо осмысленного текста мы можем наблюдать кракозябры.
 
=== Можно указать кодировку текста вручную ===
 
=== Можно предварительно, перед открытием файла, указать ожидаемую кодировку ===
Для этого нужно установить переменную <code>encoding</code> (сокращенносокращённо <code>enc</code>). Например, установить кодировку <code>ucs-2le</code> (unicodeUnicode MS Windows):
:set enc=ucs-2le
После этого можно открывать файл. Он откроется в этой кодировке.
Vim автоматически пытается распознать текущую кодировку открываемого файла, отображает открываемый файл в кодировке отображения терминала, а при сохранении конвертирует в кодировку сохранения файла.
 
* Текущая используемая в Vim кодировка задаетсязадаётся переменной <code>encoding</code> (<code>enc</code>).
* Кодировка отображения задаетсязадаётся переменной <code>termencoding</code> (<code>tenc</code>).
* Кодировка сохранения файла задается переменной <code>fileencoding</code> (<code>fenc</code>).
 
Анонимный участник