Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Vim

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9

Открыть новую тему     Написать ответ в эту тему

8AleX8



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
 
Vim

 
Vim (Вим) — один из двух существующих в мире текстовых редакторов ;-) свободный, кроссплатформенный, расширяемый текстовый редактор, сколь угодно настраиваемый и автоматизируемый; и вообще, в представлении не нуждающийся.
 



 
Ресурсы:

Документация:
  • Vim documentation
    Официальная документация (та, что :help) онлайн. Подробно и сухо.
     
  • Vim Recipes [HTML Online] [HTML+PDF Tarball] [PDF] [DEB] [SRC]
    С одной стороны, название нас не обманывает: эта небольшая книга — действительно сборник рецептов для решения конкретных задач; с другой — это именно книга, излагающая хорошо подобранный материал связно, цельно и без излишней подробности, свойственной манам. Разобранный круг вопросов: от выхода из Вима :) до кастомизации. Т. о. книжка пригодна в роли первого учебника вполне.
     
  • A Byte of Vim
    (Просто о Vim)

Эссе:
  • ‘Coming Home to Vim’ by Steve Losh
    (Возвращение к Vim)
    Опыт программиста-маковода по переходу на Вим. Изложено авторское видение вимовской «философии», приведены любопытные строчки конфига, сделан обзор необходимых плагинов.

Шпаргалки (cheet sheets, quick reference cards) — распечатать и положить под стекло:
  • VIM Quick Reference Card by Laurent Gregoire
    Шпаргалок по Виму не просто много, а очень много; эта, по крайней мере, неплоха.
     
  • Graphical cheat sheet by ViEmu
    Что делает та или иная клавиша надписано на самой клавише схеме QWERTY-клавиатуры; весьма наглядно.

 
Зачатки FAQ'а:
Q: Как быть с вводом кириллицы?
A: Увы, на настоящий момент наиболее разумным решением будет использовать собственный вимовский механизм переключения раскладок, сиречь переключать раскладки по сочетанию отличному от общесистемного (по-умолчанию: ^6 и ^^, т.е. Ctrl+6 и Ctrl+Shift+6), для чего в .vimrc добавить строку
set keymap=russian-jcukenwin
Мапинг кириллицы (map й q) в силу разного расположения на клавишах присутствующих в обеих раскладках символов оказывается существенно более неудобным.
 
 

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

Всего записей: 1813 | Зарегистр. 11-12-2001 | Отправлено: 14:38 21-05-2003 | Исправлено: Maz, 11:14 19-08-2020
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
latin
В Виме нет умолчаний. Но всегда можно переопределить сочетание клавиш. Например, так:
:cnorea <expr> h getcmdtype() == ":" && getcmdline() == "h" ? "vert h" : "h"
 
Здесь getcmdtype() == ":" требуется для отличия командной строки от, например, строки поиска; а getcmdline() == "h" пресекает замену, к примеру, в приказе :w h.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 08:27 20-04-2013 | Исправлено: ASE_DAG, 08:28 20-04-2013
latin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
 
Но ведь мы переопределяем заданное первоначальное (реализованное в коде или настройках) поведение, так? Соответственно изменяем стандартные, поставляемые в начальной конфигурации, настройки, т.е. меняем поведение заданное по умолчанию. Во всяком случае именно так понимается мной термин "по умолчанию".
 
Благодарю за рекомендацию! Я так понимаю, что в части 'getcmdline() == "h"' для того, чтобы ловило все возможные сокращения команды 'help', следует добавить '|| "he" || "hel" || "help"', так?

Всего записей: 781 | Зарегистр. 01-03-2006 | Отправлено: 12:53 21-04-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
latin
> изменяем стандартные, поставляемые в начальной конфигурации, настройки, т.е. меняем поведение заданное по умолчанию
Если считать умолчанием ввод h по нажатию «h», то конечно.
 
> Я так понимаю, что в части 'getcmdline() == "h"' для того, чтобы ловило все возможные сокращения команды 'help', следует добавить '|| "he" || "hel" || "help"', так?
Нет, конечно. Во-первых, где вы вообще встречали такой синтаксис? А во-вторых, что «ловить», описано здесь в третьем параметре: :cnorea <expr> h..., далее идет то, на что заменять.
 
Если развивать до четырех вариантов именно эту строку — просто повторите ее четыре раза.
:cnorea <expr> he getcmdtype() == ":" && getcmdline() == "he" ? "vert he" : "he"
и т. д.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:36 21-04-2013 | Исправлено: ASE_DAG, 15:48 21-04-2013
DollHack



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vim 7.4 released

Цитата:
Finally, after more than a thousand patches, there is a new version of Vim. This is mostly a bug-fix release. Also, many runtime files have been improved, syntax highlighting and indenting works better. To find out the details, do ":help version7.4" after installing it. Direct link to the MS-Windows installer. For Linux you probably want to use Mercurial for convenient building. For MacVim look here. Otherwise see the download page.

 
http://www.vim.org/download.php

Всего записей: 1935 | Зарегистр. 20-10-2009 | Отправлено: 03:58 13-08-2013 | Исправлено: DollHack, 03:58 13-08-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, господа.
 
Предположим, есть такой скриптик:
#!/bin/sh
xterm -hold -e cat "$1" &

 
Видно, что если его выполнить как $ mytest /tmp/file, то управление немедленно вернется шеллу, а окно икс-терминала останется висеть, пока мы его не закроем. Если его выполнить из Вима как :!mytest %, то будет то же самое.
 
А вот если установить его в качестве makeprg и запустить «сборку»
:set makeprg=mytest\ %
:make

то все исполнится корректно, но управление не вернется — пользоваться Вимом будет нельзя, пока мы не закроем икс-терм или не пошел Виму ^C. Почему? Как исправить?
 
P. S. Вопрос не праздный, на самом деле скрипт на основании кода генерирует картинку и хотелось бы сразу получать ее перед глазами и не закрывать. Просто я иллюстрирую проблему на простейшем примере.
 
Добавлено:
Ага, ну почему — понятно. Я невнимательно посмотрел на вывод. :make исполняет пайп вида !mytest /tmp/ququ  2>&1| tee /tmp/vughsFC/3. Теперь осталось сообразить, что надо сделать. :set makeprg=mytest\ %\ & не подойдет, поскольку вывод ошибки нужен.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:13 04-10-2013 | Исправлено: ASE_DAG, 02:45 04-10-2013
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите, пожалуйста, есть ли в VIM возможность выделять и копировать крупные блоки кода? Сворачивать блоки кода?

Всего записей: 1842 | Зарегистр. 22-03-2003 | Отправлено: 10:38 11-06-2014
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
выделять и копировать крупные блоки кода?

 
Гм. Так же, как и мелкие куски кода. Даже неважно, на каком языке этот код и даже код это или просто текст.
 
Например, если нужно скопировать большой блок строк (целых), можно на первой строке поставить метку t, долистать до нижней строки, поставить метку b (если надо будет вернуться) и нажать y't - весь промежуток строк будет скопирован, причём даже выделять его для этого не надо. Если же надо этот кусок выделить, можно было нажать V't.
 
yi( - скопировать фрагмент, ограниченный парными круглыми скобками (не включая сами скобки)
"zya{ - скопировать фрагмент, ограниченный парными фигурными скобками (включая сами скобки) в регистр z.
 
Ну и куча вариантов.
 

Цитата:
Сворачивать блоки кода?

 
Да. Ключевое слово - fold, например, :help fold.txt. Одна из основным команд сворачивания - zf. Например, zf% сворачивает от текущей скобки до парной, а zfa{ сворачивает текущий блок, ограниченный фигурными скобками. zo разворачивает.

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 13:13 11-06-2014
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Quasus

Цитата:
Гм. Так же, как и мелкие куски кода.

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

Код:
head1[
head2[
head3[
head41[
<...>],
head42[
<...>],
<...>
]]]

При такой структуре весьма проблематично выяснить, где расположена закрывающая квадратная скобка, которая закрывает, к примеру, блок кода с head42. Можно ли, указав лишь начало блока кода, выделить его целиком?  
 

Цитата:
Одна из основным команд сворачивания - zf. Например, zf% сворачивает от текущей скобки до парной, а zfa{ сворачивает текущий блок, ограниченный фигурными скобками. zo разворачивает.

Похоже, это то, что нужно. А VIM умеет работать с файлами огромного размера (вплоть до 1 Гб)?

Всего записей: 1842 | Зарегистр. 22-03-2003 | Отправлено: 15:00 11-06-2014
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Я имел в виду ситуацию, когда найти конец данного огромного блока кода проблематично. Т.е., например, документ имеет глубоко вложенную структуру вроде:  

 
Ну да, смотрите мои примеры с метками и с блоками. Команда y сочетается с движениями, поэтому возможностей скопировать по крайней мере столько же, сколько способов перемещения.
 
Если ваши блоки ограничены квадратными скобками, полезной будет команда % - переход к парной скобке и работа с блоками типа vi[, ya[ и так далее (аналогично можно с предложениями и абзацами).
 
Если у вас типа тегов XML, тогда не знаю, никогда не работал. Может, есть плагин, который ищет парные теги, а нет - несложно (мне кажется) написать функцию.
 

Цитата:
А VIM умеет работать с файлами огромного размера (вплоть до 1 Гб)?

 
Ну, можно попробовать... Хотя если файл сгенерирован, может быть дешевле обойтись sed-ом.
 
 

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 15:12 11-06-2014
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
 Если ваши блоки ограничены квадратными скобками, полезной будет команда % - переход к парной скобке и работа с блоками типа vi[, ya[ и так далее (аналогично можно с предложениями и абзацами).  
Да, действительно удобно. Только Vim почему-то самопроизвольно переключается в режим вставки. Можно это как-то запретить?

Цитата:
"zya{ - скопировать фрагмент, ограниченный парными фигурными скобками (включая сами скобки) в регистр z.

А как потом извлечь из этого регистра? Можно ли просто скопировать в буфер обмена?

Всего записей: 1842 | Зарегистр. 22-03-2003 | Отправлено: 15:37 11-06-2014
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Да, действительно удобно. Только Vim почему-то самопроизвольно переключается в режим вставки. Можно это как-то запретить?  

 
Вот это не понял. Если вы в нормальном режиме делаете vi[ то он переключается в визуальный режим и выделяет. Он не может переключиться в режим вставки, потому что в режиме вставки не может быть выделения. Можно подробнее?
 
(К слову, ci[ как раз убивает внутренность блока и переходит в режим вставки.)
 

Цитата:
А как потом извлечь из этого регистра? Можно ли просто скопировать в буфер обмена?

 
Извлекать внутри вима - это просто пастить: например, "zp. При работе в виме системные буферы не нужны. А чтобы копировать туда-сюда между приложениями, можно использовать системные буферы: * - X buffer (который получается выделением), + - клипборд, который Ctrl+C (в Windows, если не путаю, оба этих регистра - одно и то же). Например, чтобы вставить в вим выделенный где-то кусок текста, можно нажать "*yp, а чтобы съянчить (yank) в системный клипборд, можно нажать "+y[что-то]. В зависимости от настроек вим также понимает Ctrl+C, Ctrl+V в стандартном виндовом смысле.

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 16:12 11-06-2014
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Вот это не понял.
Сейчас уже не воспроизводится, видимо не те команды вводил периодически.

Цитата:
В зависимости от настроек вим также понимает Ctrl+C, Ctrl+V в стандартном виндовом смысле.
Отлично! Ctrl+C работает даже по отношению ко свернутым блокам!

Цитата:
чтобы съянчить (yank) в системный клипборд, можно нажать "+y[что-то]

Поподробнее, пожалуйста: как скопировть в системный буфер блок кода (не выделяя его), начиная с head (на котором или перед которым стоит курсор) и заканчивая парной закрывающей скобкой включительно?

Всего записей: 1842 | Зарегистр. 22-03-2003 | Отправлено: 16:28 11-06-2014
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Поподробнее, пожалуйста: как скопировть в системный буфер блок кода (не выделяя его), начиная с head (на котором или перед которым стоит курсор) и заканчивая парной закрывающей скобкой включительно?

 
Я бы на скорую руку сделал так.
 
Предположим, что курсор стоит на букве h. Я ставлю метку и хочу дойти до конца копируемого фрагмента, чтобы скопировать до метки. Для этого я ищу первую квадратную скобку в строке после h и перехожу к парной скобке. Получается так:
maf[%"*y`a
Чтобы не повторять набирать каждый раз все эти буквы, записываю макрос: перед первым выполнением нажимаю qq (начало записи макроса q, у меня в нём обычно подобная ерунда), в конце выполнения нажать q. После этого макрос вызывается с помощью @q а для повторного вызова достаточно нажимать @@
 
Можно модифицировать, чтобы курсор стоял не обязательно на начале head. Вообще, есть команда b перехода к началу слова, но это начало _предыдущего_ слова. Поэтому можно схитрить: сначала пойти вперёд l (вроде должно быть куда), а потом уже b. Получается
lbmaf[%"*y`a
И в макрос.
 
Кстати, макросы хранятся в обычных текстовых регистрах. В такой регистр можно съянчить команды макроса или наоборот спастить его куда-нибудь, чтобы можно было использовать в будущем.
 
Если бы захотелось более чистое и универсальное решение (например, не задействующее метку), можно было бы написать функцию и, например, повесить на клавиши.

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 17:26 11-06-2014
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Quasus

Код:
 lbmaf[%"*y`a  

Работает, но копирует без закрывающей скобки.
 
Добавлено:

Цитата:
 Если бы захотелось более чистое и универсальное решение (например, не задействующее метку), можно было бы написать функцию и, например, повесить на клавиши.  

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

Всего записей: 1842 | Зарегистр. 22-03-2003 | Отправлено: 17:56 11-06-2014
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Работает, но копирует без закрывающей скобки.  

 
Чёрт-те что. А ведь правда, и я не знал такого эффекта. Оказывается, при прыжке к метке сама метка не включается, как учит нас :h mark-motion. Чтобы метка включалась, надо после команды поставить v. Получается

Код:
lbmaf[%"*yv`a

Мой косяк.
 
Это решение почти идеальное. Что метка создаётся - это можно считать фичей. Можно другой буквой её обозвать, если хочется. Меток-то на любую букву можно создавать, так что в действительности проблем с ними не бывает.
 
Если записать макрос - уже получается вроде как повесили на клавиши. Можно, конечно, и не на @ вешать. В нормальном режиме клавиши в основном заняты уже и пользовательские команды нормального режима часто имеют вид <Leader><что-то>, где <Leader> - некий символ, по умолчанию - бэкслэш. То есть можно написать

Код:
nnoremap <Leader>h lbmaf[%"*yv`a

Можно было бы на функциональную клавишу повесить... Короче, дело вкуса.
 

Цитата:
скопировать весь блок, выделив только одну закрывающую скобку.  

 
Здесь естественное решение - поставить метку, перейти до парной скобки (%), потом выполнить поиск слова head назад (?) и скопировать. Проще всего сделать так один раз и записать макрос. Если же вешать на клавишу, может быть что-то такое:

Код:
nnoremap <buffer> <Leader>q ma%?head<CR>yv`a

Здесь <CR>, как нетрудно понять, символизирует конец строки. А волшебное слово <buffer> означает, что определение действует только в текущем буфере.
 
Кстати, фокус. Это команду можно не перепечатывать себе в командную строку. Можно просто скопировать из браузера в системный буфер, а в командной строке вима сделать :@* Это выполнит содержимое регистра * (стандартного буфера как раз).
 
Функции здесь писать, мне кажется, оверкилл. Лично у меня так: когда работаешь, записываешь макросы в основном (совершенно рутинная операция), а функции начинаешь писать, когда охота заняться программированием вима вместо того, чтобы делать дело. Лезешь в справку, вспоминаешь стандартные функции... Но может я напишу, просто ради иллюстрации. Популяризация вима - хорошее дело.

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 02:58 12-06-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> Если у вас типа тегов XML, тогда не знаю. Может, есть плагин, который ищет парные теги...
 
Нету, ибо это базовый функционал самого Вима. См. справку по v_at и v_it. Копирование соответственно yat и yit.
 
> в режиме вставки не может быть выделения
 
Почему? Вполне может. Прикажите в режиме вставке <C-o>v — перейдете в режим, обозначаемый -- (insert) VISUAL --.
 
Добавлено:
> А VIM умеет работать с файлами огромного размера (вплоть до 1 Гб)?
 
А что это за константа — 1 Гб? На работу с большими файлами Вим не заточен, но и ограничений никаких не вводит — пока аппаратных ресурсов машинки достаточно для того, чтобы целиком переварить многогигабайтный файл — Вим от него не откажется. Плюс, Гугль подсказывает, что есть плагин, облегчающий работу с большими файлами посредством отключения второстепенных, но ресурсоемких, функций.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 03:42 12-06-2014 | Исправлено: ASE_DAG, 03:55 12-06-2014
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Quasus

Цитата:
естественное решение - поставить метку, перейти до парной скобки (%), потом выполнить поиск слова head назад (?) и скопировать.

Некрасивое решение, т.к. head может быть разный, причем заранее неизвестный. Наверное, лучше использовать переход к началу слова (head образован буквами английского алфавита).  
 
Добавлено:
ASE_DAG

Цитата:
А что это за константа — 1 Гб?
Это то, с чем не справится ни один редактор, написанный на 32-битной JAVA. Просто я привык, что большинство редакторов вообще не могут открыть мои файлы.

Цитата:
есть плагин, облегчающий работу с большими файлами посредством отключения второстепенных, но ресурсоемких, функций.
Спасибо. Но даже без плагина скорость на моей машине комфортная, задержки не более секунды, что весьма радует.

Всего записей: 1842 | Зарегистр. 22-03-2003 | Отправлено: 04:17 12-06-2014
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Наверное, лучше использовать переход к началу слова (head образован буквами английского алфавита).  

 
Спасибо, чего-то не подумал.

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 04:41 12-06-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> скопировать весь блок, выделив только одну закрывающую скобку.  
 
А почему сразу не любой символ внутри блока? va[oby — и никаких меток, не?

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 04:57 12-06-2014 | Исправлено: ASE_DAG, 04:59 12-06-2014
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG

Код:
va[oby

Круто! Но куда производится копирование? Чтобы в системный буфер, надо va[ob"*y?

Всего записей: 1842 | Зарегистр. 22-03-2003 | Отправлено: 07:58 12-06-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9

Компьютерный форум Ru.Board » Компьютеры » Программы » Vim


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru