Ru-Board.club
← Вернуться в раздел «Программы»

» Vim

Автор: Quasus
Дата сообщения: 11.06.2014 15:12

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


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

(К слову, ci[ как раз убивает внутренность блока и переходит в режим вставки.)


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


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

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

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

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

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

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


Я бы на скорую руку сделал так.

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

Можно модифицировать, чтобы курсор стоял не обязательно на начале head. Вообще, есть команда b перехода к началу слова, но это начало _предыдущего_ слова. Поэтому можно схитрить: сначала пойти вперёд l (вроде должно быть куда), а потом уже b. Получается
lbmaf[%"*y`a
И в макрос.

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

Если бы захотелось более чистое и универсальное решение (например, не задействующее метку), можно было бы написать функцию и, например, повесить на клавиши.
Автор: popkov
Дата сообщения: 11.06.2014 16:56
Quasus

Код: lbmaf[%"*y`a
Автор: Quasus
Дата сообщения: 12.06.2014 01:58

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


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

Код: lbmaf[%"*yv`a
Автор: ASE_DAG
Дата сообщения: 12.06.2014 02:42
> Если у вас типа тегов XML, тогда не знаю. Может, есть плагин, который ищет парные теги...

Нету, ибо это базовый функционал самого Вима. См. справку по v_at и v_it. Копирование соответственно yat и yit.

> в режиме вставки не может быть выделения

Почему? Вполне может. Прикажите в режиме вставке <C-o>v — перейдете в режим, обозначаемый -- (insert) VISUAL --.

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

А что это за константа — 1 Гб? На работу с большими файлами Вим не заточен, но и ограничений никаких не вводит — пока аппаратных ресурсов машинки достаточно для того, чтобы целиком переварить многогигабайтный файл — Вим от него не откажется. Плюс, Гугль подсказывает, что есть плагин, облегчающий работу с большими файлами посредством отключения второстепенных, но ресурсоемких, функций.
Автор: popkov
Дата сообщения: 12.06.2014 03:17
Quasus

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

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

Добавлено:
ASE_DAG

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

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

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


Спасибо, чего-то не подумал.
Автор: ASE_DAG
Дата сообщения: 12.06.2014 03:57
> скопировать весь блок, выделив только одну закрывающую скобку.

А почему сразу не любой символ внутри блока? va[oby — и никаких меток, не?
Автор: popkov
Дата сообщения: 12.06.2014 06:58
ASE_DAG

Код: va[oby
Автор: 0x255
Дата сообщения: 12.06.2014 08:26

Цитата:
> Если у вас типа тегов XML, тогда не знаю. Может, есть плагин, который ищет парные теги...

такой плагин имеется:

Цитата:
The matchit.vim script allows you to configure % to match more than just
single characters. You can match words and even regular expressions.
Also, matching treats strings and comments (as recognized by the
syntax highlighting mechanism) intelligently.
The default ftplugins include settings for several languages:
Ada, ASP with VBS, Csh, DTD, Essbase, Fortran, HTML, JSP
(same as HTML), LaTeX, Lua, Pascal, SGML, Shell, Tcsh, Vim, XML.
(I no longer keep track, so there may be others.)



Цитата:
Чтобы в системный буфер, надо va[ob"*y?

не знаю как на винде, но в *nix "* означает буфер выделения, а "+ непосредственно системный клипборд
Автор: ASE_DAG
Дата сообщения: 12.06.2014 08:39
popkov
>> va[oby
> Но куда производится копирование?
В регистры "" и "0. См. :reg[isters].

> Чтобы в системный буфер, надо va[ob"*y?
Да, это в PRIMARY в Иксах. А на Винде "* и "+ — синонимы.

Вообще, если вам не по душе обособленный буфер обмена, и вы желаете синхронизировать вимовский неименованный регистр с общепользовательским (по-моему, не лучшая идея, но хозяин — барин), то можете приказать set clipboard+=unnamedplus.
Автор: popkov
Дата сообщения: 12.06.2014 09:35
ASE_DAG
Ввел команду :set clipboard+=unnamedplus, но в системный буфер по-прежнему не копирует.


Цитата:
См. :reg[isters]

Выполнение этой команды выводит внизу окна
---Регистры---
Нажмите ENTER или введите команду для продолжения

и больше никакой информации!
Автор: ASE_DAG
Дата сообщения: 12.06.2014 09:42
Забранная в [] часть из :reg[isters] — это необязательная часть. Можно ввести :reg, можно :regi и т. д. вплоть до :registers, но не :reg[isters] прямо так. Именно так (со скобочками) ex-команды приводятся в справке.

Добавлено:
> :set clipboard+=unnamedplus, но в системный буфер по-прежнему не копирует

Странно. Ну проверьте для начала, плюсовый регистр вообще связан с общепользовательским или нет? Т. е. "+y работает или нет?
Автор: popkov
Дата сообщения: 12.06.2014 10:01

Цитата:
Т. е. "+y работает или нет?

Работает: если выделить участок текста и ввести эту команду, он копируется в системный буфер. Не работает va[oby (после выполнения этой команды содержимое системного буфера не меняется, хотя я выполнил :set clipboard+=unnamedplus). va[ob"+y работает.

Добавлено:
Посадил копирование блока на клавишу F2:
:nmap <F2> va[ob"+y
Достаточно удобно.


Добавлено:
Нашел правильную команду для синхронизации с системным буфером обмена:
:set clipboard=unnamed
Теперь и просто va[oby копирует блок кода в системный буфер. Спасибо за подсказки!
Автор: ASE_DAG
Дата сообщения: 12.06.2014 11:02
Не-не-не, это не «правильная команда», а команда, которая синхронизирует безымянный регистр с "*, а не "+. Т. е. она, конечно, вам по вышеозначенной причине подойдет, но никакой определенности, почему не имела действия :set clipboard+=unnamedplus, это не прибавляет.

Быть может, у вас больно старая версия Вима? Если так, то ничего хорошего. Так какая она у вас?
Автор: popkov
Дата сообщения: 12.06.2014 11:22
ASE_DAG
Версия 7.4, скачал с офсайта только вчера, затем скопировал в директорию C:\Program Files (x86)\Vim\vim74 пакет подсветки синтаксиса для Wolfram Mathematica отсюда. Больше ничего не менял.

Добавлено:
Кстати, :set clipboard+=unnamedplus работает в том смысле, что, например, при удалении строки путем ввода dd она оказывается скопирована в системный буфер. А вот va[oby при этом на системный буфер влияния не оказывает. Команда :set clipboard=unnamedplus ведет себя так же.

Вариант :set clipboard+=unnamed работает корректно: va[oby копирует блок в системный буфер. Кстати, чем отличаются варианты с += и без +?
Автор: ASE_DAG
Дата сообщения: 12.06.2014 11:32
popkov, ну тогда ладно, черт с этим unnamedplus, если вам не нужна кроссплатформеность конфига, то нехай будет unnamed.

> Больше ничего не менял.
И зря. В Виме многие предустановки родом из семидесятых (у vi скоро сорокалетний юбилей, ага). Стырьте у кого-нибудь с Гитхаба добротно откомментированный .vimrc — да пробегитесь по нему глазами — думаю большую его часть вы переймете себе не задумываясь.

Добавлено:
> Кстати, чем отличаются варианты с += и без +?

Ключ 'clipboard' принимает в качестве значения не одну опцию, а множество взаимодополняющих опций (см. :h 'clipboard'). По :set clipboard=unnamed вы перезаписали все множество, а по :set clipboard+=unnamed — дополнили.

Добавлено:
Кстати, хорошая штука справка! Нашел, что unnamedplus и не должен у вас работать, ибо он «only available with the |+X11| feature». Ну дурость же! "+ работает, а unnamedplus — нет, да и кроссплатформенность, как я уже сказал, идет лесом. Надо будет возмущение в багтрекер накатать.
Автор: popkov
Дата сообщения: 12.06.2014 12:25

Цитата:
Стырьте у кого-нибудь с Гитхаба добротно откомментированный .vimrc
Спасибо за хороший совет! А можно как-то настроить VIM, чтобы он корректно работал с русским текстом? А то, например, dw удаляет слово, набранное английским алфавитом, а из набранного кириллицей удаляет лишь первые 2 символа...
Автор: 0x255
Дата сообщения: 12.06.2014 14:31

Цитата:
Спасибо за хороший совет! А можно как-то настроить VIM, чтобы он корректно работал с русским текстом? А то, например, dw удаляет слово, набранное английским алфавитом, а из набранного кириллицей удаляет лишь первые 2 символа...


если корректно, то нужно настроить (независимые от системных) раскладки в самом vim.

Цитата:
:help russian-keymap


если на скорую руку делать, то можно просто замапить "русскораскладные" аналоги и написать несколько аналогичных команд. Вот точка отправления в этом нелёгком и извечном вопросе =)
Автор: Quasus
Дата сообщения: 12.06.2014 14:54

Цитата:
если корректно, то нужно настроить (независимые от системных) раскладки в самом vim.


Плюс много. Причём это очень просто:

Цитата:
переключать раскладки по сочетанию отличному от общесистемного (по-умолчанию: ^6 и ^^, т.е. Ctrl+6 и Ctrl+Shift+6), для чего в .vimrc добавить строку
set keymap=russian-jcukenwin
Автор: ASE_DAG
Дата сообщения: 13.06.2014 00:57
Обнаружил, что в шапке ссылка на книгу «Vim Recipes» теперь ведет в никуда. Заменил ее на архивную, плюс привел ссылку на нее в виде исходника, тарболла, PDF’а и дебиановского пакета документации.


#: шапка версии ASE_DAG, 02:17 13-06-2013
Автор: Jenyay
Дата сообщения: 13.06.2014 08:47
Когда-то я писал серию статей про Vim и написание скриптов к нему, может кому пригодится - http://jenyay.net/Programming/Tools
Автор: ASE_DAG
Дата сообщения: 15.06.2014 17:28
0x255

> ...можно просто замапить «русскораскладные» аналоги и написать несколько аналогичных команд. Вот точка отправления в этом нелегком и извечном вопросе...


Цитата:
map <unique> ЯЯ ZZ
map <unique> ЯЙ ZQ
map <unique> йЖ q:
map <unique> й. q/
map <unique> й, q?
— и так шестьсот строк
.

ОМГ! Это определенно писал человек, который не курсе, что langmap для utf-8 уже лет пять как сделали, то есть можно писать как в старые времена КОИ-8:

set langmap=ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ;ABCDEFGHIJKLMNOPQRSTUVWXYZ,фисвуапршолдьтщзйкыегмцчня;abcdefghijklmnopqrstuvwxyz

и все. Но на сочетания с контролом т. е., например, на <C-v> или многочисленные хоткеи режима вставки, это не распространяется. Поэтому по сравнению с keymap’ом эффект неполный.
Автор: Nigelist
Дата сообщения: 24.10.2014 19:50
Привет всем! Есть несколько проблем, которые не могу решить самостоятельно. Если кто знает как решить, подскажите пожалуйста.

Пытаюсь настроить gVim для Windows на UTF-8, по этой статье. Но имя пустого файла отображается иероглифами.

Не могу добиться, чтобы в контекстном меню был пункт "Редактировать в Vim", а не "Edit with Vim".
Хочу настроить gVim, как IDE для Python. Пытаюсь сделать по этой статье. Но не получается. Начинает ругаться на _vimrc. Актуальна ли эта статья для Vim 7.4? Если нет, то посоветуйте актуальную статью.
Автор: 0x255
Дата сообщения: 25.10.2014 11:31
Nigelist, посмотрите в сторону CREAM for VIM
* сам под винду vim не настраивал, но слышал очень много хвалебных отзывов по использованию cream под сабж....
Автор: Nigelist
Дата сообщения: 02.11.2014 08:48

Цитата:
Nigelist, посмотрите в сторону CREAM for VIM
* сам под винду vim не настраивал, но слышал очень много хвалебных отзывов по использованию cream под сабж....

Попробовал, не понравилось. Уже почти всё замечательно:
Автор: FreeLSD_md
Дата сообщения: 01.05.2015 08:58
Привет. Подскажите, пожалуйста, есть ли в сабже аналог считывания tail -f или less +F дописываемых файлов? Режим какой-то, чтобы редактор делал :e ./file.log , только с повторами через секунду или как-то ещё?
Заранее благодарю.
Автор: ASE_DAG
Дата сообщения: 01.05.2015 21:45
FreeLSD_md, наколько я знаю, нет, Vim не умеет «дочитывать» файлы.

> чтобы редактор делал :e ./file.log, только с повторами через секунду

Да это-то сколько угодно — только это же и близко никакой не less +F — Вим будет весь файл перечитывать.

Страницы: 1234

Предыдущая тема: 1C: вопросы по Конфигурациям


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.