↓
 ↑
Регистрация
Имя/email

Пароль

 
Войти при помощи
Wave
25 января 2020
Aa Aa
К моему же собственному удивлению, пристрастился к виму. Оказывается, это офигенно удобно, когда не нужно убирать пальцы с букв (на del, backspace, клавиши курсора, etc). Удобно-удобно-удобно… А потом бац — натыкаешься на какую-нибудь фигню, в которой вим до жути дубовый и неудобный. Например, на то, как он делает вставку. И всё, хочется залепить кулаком в экран. И уж точно времени тратится куда больше, чем если бы я это же делал в каком-нибудь другом редакторе.

#IT #Лытдыбр
25 января 2020
77 комментариев
А что не так со вставкой?
Прыгает как-то. То в позиции курсора, то после неё. Я не могу сейчас чётко алгоритмизовать, но, по ощущениям, она сделана как-то дубово, на отъебись, что ли. Или наоборот, слишком перекрученый искусственный интеллект, который пытается угадать, чего ты хочешь, и чаще всего этим мешает.
Кстати, забавно, что я не вижу разницы между этими двумя крайностями.
А учитывая, что у вима собственный буфер обмена, который к тому же ветвится (и ветвящийся undo/redo), вообще кошмар получается.
И вставка - это только один пример. Наткнуться на какую-то неочевидную сложность в виме раз плюнуть.
Вот, в начале строки делаю d j, т.е. удаляю строку. Становлюсь в начале другой строки и делаю р, т.е. ожидаю, что удалённая строка вставится над этой. И хер там, она ставится после! И чтобы встала там, где мне надо, нужно поставить курсор на конец предыдущей строки! И где логика? В вимовском буфере, по идее, строка, оканчивающаяся переводом строки. Т.е. если курсор стоит в конце строки, то строка из буфера должна продолжить текущую строку, после чего будет два перевода, а не начинаться с новой. В чём я не прав?
Вот кстати, меня до кровавых мальчиков в глазах бесит автозакрытие всяких кавычек и скобок. Я с незапамятных времен привык делать это вручную. Открыл скобку, закрыл скобку, сдвинул курсор влево и пишу, что мне надо. И вряд ли отучусь от такого поведения. Но нет, в любом и каждом современном редакторе если ты открыл кавычку или скобку, то редактор тут же автоматически пропечатает закрытие. Бесит. Я ненавижу, когда прога пытается быть умнее меня и делает то, что по её мнению я собираюсь сделать. Так вот вим очень во многих моментах пытается быть таким умным. Ставлю я энтер посреди строки на конце слова. Следующая строка должна начинаться с пробела, потому что я перед этим самым пробелом воткнул энтер. Но нет, этот пробел волшебным образом исчезает. Предыдущая строка заканчивается не-пробелом, следующая строка начинается с не-пробела. В принципе, конкретно именно эта функция мне понравилась, удобно, но бляха-муха, примерно то же самое происходит, когда я какое-то слово удаляю. Обязательно исчезнет или лишний пробел, или лишний знак препинания. И вот тут уже это мешает.


И это всё не считая проблем вима с русским языком. В смысле, что командный режим не дружит с русским, и бороться с этим приходится костылями. Лучше всего вим работает, когда ты редактируешь английский текст (исходники, например).
Показать полностью
Wave, p/P вставляет содержимое после/до курсора соответственно. Содержимое может быть 3 типов: символы, строка и блок. Т.е. что туда положишь, то (и так) и вставится.
Если символы — будут вставлены в текущую строку после/до курсора. Если строки — будут вставлены после/до строки, на которой стоит курсор.
Чтобы было яснее, представь, что в буфере нет никаких \r\n, там только символы, но сами записи буфера помечены одним из трёх флагов: символы, строка, блок. Исходя из этих флагов содержимое и будет вставлено.
Так... Ладно. Кое-что понял.
dj — удаляет текущую строку, и строку снизу.
dk — удаляет текущую строку, и строку сверху.
dd — удаляет только текущую строку.
Можно перед командой указывать число, например 5dd удалит 5 строк и т.д.

Забыл сказать про блоки и вставку: с блоками p/P ведёт себя также, но вставляет после/до текущей позиции, сдвигая символы. Если перед вставкой выделить блок — то вставляемый блок заменит выделенный.
Хотя... Как установить признак строки или блока, или символа для буфера? Завтра с компа (я щас с тапка) гляну, конечно, но...
Wave, только во время выделения: v/V/Ctrl+V — соответственно символы/строки/блоки.

Автозакрытие скобочек — это у тебя AutoPair плагин, наверное, да? Я им не пользуюсь, но выключить его можно так (добавь в .vimrc):
let g:AutoPair = {}
Ну или Alt+p должен включать/выключать.
Про указание количества команд я знаю. Обычно - неудобно, потому что нужно остановиться и сосчитать, какое число нужно ставить. Вместо того, чтобы на спинно-мозговых рефлексах пальцами тарабанить.
v/V/Ctrl+V

А удалённое? Которое же тоже оказывается в буфере.
Про автозакрытие скобок я в общем пожаловался, как самый распространенный пример искусственного интеллекта в текстовых редакторах.
Буду я, наверное, спать. 45 минут назад собирался. Слишком медленно на тапке печатаю.
Спасибо за справку.
Wave
Прр указание количества команд я знаю. Обычно - неудобно, потому что нужно остановиться и сосчитать, какое число нужно ставить. Вместо того, чтобы на спинно-мозговых рефлексах пальцами тарабанить.
Тогда используй V — визуальное выделение строк. Потом или y (скопировать) или x (вырезать) или d (удалить).
Чтобы удалить без копирования в буфер используй blackhole register: "_d
Можешь замаппить d на "_d, чтобы она реально удаляла, но тогда привыкай использовать V+x для вырезания строк :)
Блин, всё равно вся работа с копированием/удалением и вставкой ужасно перемудрённая получается. На порядок сложней, чем в любом другом редакторе.

Ты случайно не знаешь, что можно сделать вот с такой хернёй? Вим всегда ставит конец файла на пустой строке. Т.е. последняя строка, перевод строки, окончание файла. И даже если открыт файл, где у последней строки нет перевода, а она заканчивается окончанием файла, после сохранения будет не «строка[eof]», а «строка\r\n[eof]».
Вот это, кстати, тоже ненавижу, когда редактор голого текста этот самый текст интеллектуально отображает. Маркеры utf, например, ставятся и не отображаются, а потом php, например, капризничает, что уже начал отправлять пользователю данные и не может теперь их менять.
Справедливости ради, теперь пых научился их понимать, но всё равно…
Wave
Ты случайно не знаешь, что можно сделать вот с такой хернёй? Вим всегда ставит конец файла на пустой строке. Т.е. последняя строка, перевод строки, окончание файла. И даже если открыт файл, где у последней строки нет перевода, а она заканчивается окончанием файла, после сохранения будет не «строка[eof]», а «строка\r\n[eof]».
Ты же знаешь, зачем это делается (не считая того, что это POSIX стандарт)? Если ты файл закоммитил, а потом что-то добавил в конец, то в диффе эта последняя строка не будет помечена, как изменённая (до изменения не было перевода строка, а после добавился).
Если хочешь выключить это, то в конфиг добавляешь:
set nofixendofline
Или, если вим старый:
set noeol
Решение проблемы с маркерами:
set enc=utf-8
set encoding=utf-8 nobomb
Если ты файл закоммитил, а потом что-то добавил в конец, то в диффе эта последняя строка не будет помечена, как изменённая (до изменения не было перевода строка, а после добавился).
Не знал. На всякий случай проверил, как себя ведут используемые мной инструменты: TortoiseGit, Araxis Merge — а нормально они себя ведут, отображают всю разницу и всё такое. А вот именно диффами я как-то обычно не пользуюсь.

не считая того, что это POSIX стандарт
Во, блин. Ну если так, то лучше привыкнуть к стандарту, чем наоборот. Но это не отменяет моей претензии, что редактор отображает и сохраняет не фактическое положение дел, а своё представление о том, «как надо».

set nofixendofline
Спасибо.

Или, если вим старый:
На самом деле даже не вим, а неовим, есличё. Вим в виндовой консоли себя ведёт ужасающе тормознуто, а он мне именно консольный нужен.
Wave
TortoiseGit, Araxis Merge — а нормально они себя ведут, отображают всю разницу и всё такое.
Да, но они же отображают эту строку, которая была без \n в конце, как изменённую, да?
Да. Специально в первой ревизии последнюю строку сделал без \n на конце, а в следующей дописал к этой строке чего-то. И норм, показали, что одна строка изменилась, всё такое.
Неее, в следующей ревизии добавь новую строку :)
И получишь вот такое:

А если бы в последней строке был перенос, то при добавлении новой строки было бы так:







И так далее, ещё несколько инструментов, которыми я пользуюсь. Не, я не утверждаю, что ты не прав или что-то в этом духе, я о том, что то, чем пользуюсь я, никаких проблем в этом случае мне не доставляет.

И в первой, и во второй ревизии конец файла — в конце последней (второй и третьей соответственно) строки.
Wave, ага, это уже сами инструменты выпендриваются, а внутри там именно так, как я говорил. Видишь, Lines removed: 1, Lines added: 2.
Если будешь смотреть на гитхабе, например, там будет показывать, как на моем первом скрине.
Вообще-то логично, ремувед вторая линия и добавлена такая же, но с добавлением \r\n на конце и ещё добавлена третья линия.
На удивление долго не мог понять, какого хрена ЕЩЁ мне мешает. Пока не наткнулся на топик. О, точно! Очень раздражает (причём, понять не мог, что именно) вот это поведение, когда при выходе из режима редактирования курсор сдвигается на символ влево. И из-за этого же «как-то странно и багнуто» работают макросы типа этого:
imap <C-Del> <Esc>dea
Да, конкретно это оказалось несложно поправить:
imap <C-Del> <Esc>ldei
(глючит, если курсор в начале или конце строки) но сам факт такого вот сдвига каретки раздражает: «ну нафига?».

И ещё размышляю, как научиться выходить из режима редактирования не по эскейпу. Т.е. на самом деле у меня два варианта: переопределить капс лок на эскейп или на контрол. С контролом вообще — удобней, но конкретно для вима не очень, потому что никак не придумаю устраивающую меня комбинацию выхода в нормальный режим без эскейпа.

Плюс много с чем надо разобраться, например, какая разница между разными вариантами *map (imap inoremap и т.п.).

Ещё раздражает такой баг, что клавиши с F1 по F5 вместо своих значений шлют какую-то дичь. Ещё чёрт знает когда создал соответствующий issue на гитхабе неовима, его пометили как дубликат ещё более раннего issue, а исправления всё не видать. А я очень давно привык по F2 сохранять файл.

Ну и так далее. Офигенно удобная фишка с неубиранием пальцев с букв, но куча мелких дубовых шероховатостей, либо под которые нужно изогнуть свои пальцы, либо на каждую подобную фишку сделать соответствующий макрос, найти плагин или ещё что, чтобы исправить под привычное поведение. Вот нахрена при возврате из редактирования сдвигать каретку влево?
Показать полностью
А самое главное, что заставляет бессильно скрипеть зубами, это полнейшая дубовость по отношению к русскому языку. Я поставил плагин, который запоминает раскладку каждого режима, и при переключении меняет её на запомненную, но всё равно то и дело оказывается, что либо в нормальном режиме неожиданно русская раскладка оказалась, либо в редактировании так же неожиданно английская. А уж если пользоваться, например, поиском — вообще пиздец. Как в нормальном редакторе: ты жмёшь Ctrl+F или F3 (или F7) и пишешь, что там тебе надо найти. Как в виме: ты в нормальном режиме, где у тебя английский по умолчанию, жмёшь / после чего тебе надо переключиться на русский, набрать что там тебе надо, нажать Enter и переключиться обратно на английский. С поиском по f или плагинами типа EasyMotion ещё хуже.
но сам факт такого вот сдвига каретки раздражает: «ну нафига?»
Там в первом же ответе объясняется :)
И ещё размышляю, как научиться выходить из режима редактирования не по эскейпу.
Не советую, могут поломаться (и обязательно поломаются) плагины.
какая разница между разными вариантами *map (imap inoremap и т.п.)
На самом деле всё довольно просто:
:map ... — назначает
:map — показывает
:unmap ... — удаляет
:mapclear — удаляет всё
Все остальные префиксы и суффиксы — это определения режимов, на которые назначается комбинация, и метод работы:
Префикс nore — запрещает рекурсивный вызов.
Например:
:imap C ABC
По нажатию C сначала вставится AB, затем попробуется вставится C, которое на самом деле ABC, и т.д. В итоге уйдет в бесконечную рекурсию (прервать можно по Ctrl+C).
:inoremap C ABC
По нажатию C вставится ABC.
Префиксы n, i, v, x, c, s, o определяют режимы, в которых будут работать комбинации:
n — Normal mode
i — Insert and Replace mode
v — Visual and Select mode
x — Visual mode
s — Select mode
c — Command-line mode
o — Operator pending mode
Есть ещё суффикс ! — он определяет "Insert and Command-line mode".
Без префиксов и суффикса (:map) — аналог "nvo" (normal, visual, select, operator pending).
Показать полностью
А я очень давно привык по F2 сохранять файл.
А что не так?
:noremap <F2> :w!<Enter>
У меня работает :)
Styx
А что не так?
У меня работает :)
Буду не с тапка - дам ссылку на issue. "у меня работает, значит остальные ламеры" - не надо так. У тебя консольный неовим под винду?

Про nore - спасибо. Про режимы было понятно, а вот это...

там в первом же ответе объясняется
Первый же ответ на первый же ответ выражает и моё недовольство тоже. Если пользоваться не i, а а, то курсор тоже сдвигается, просто в другую сторону. И так, и так он дергается и не всегда предсказуемо для спинно-мозговых рефлексов себя ведёт. Нужно внимание и всё такое. Лишний раз перешёл в редактирование и вернулся - и вот курсор у тебя уже не там, где ожидалось. Причём, в других редакторах не то что таких проблем нет, они вообще непредставимы.

Не советую, могут поломаться (и обязательно поломаются) плагины.

Это почему это? Чем дополнительный хоткей помешает кому бы то ни было?
Wave
Буду не с тапка - дам ссылку на issue. "у меня работает, значит остальные ламеры" - не надо так. У тебя консольный неовим под винду?
Тьфу, сорри, я забыл, что у тебя не линукс/юникс. Скинь ссылку, интересно, что там такое.

Это почему это? Чем дополнительный хоткей помешает кому бы то ни было?
Опять «тьфу» :) Я подумал, что ты хочешь переопределить ESC на что-то другое :)

Лишний раз перешёл в редактирование и вернулся - и вот курсор у тебя уже не там, где ожидалось. Причём, в других редакторах не то что таких проблем нет, они вообще непредставимы.
Другие редакторы не имеют разных режимов, они всегда в insert/replace режиме, поэтому и проблем таких нет. В vim это проявляется только при переходе из insert/replace в normal, и выглядит так только потому что в insert/replace курсор на самом деле не «квадратик на символах», а «черточка между символами», но в консоли это не отобразишь, поэтому и показывается квадратик. А при выходе из режима нужно снова показывать «квадратик на символах» и вот тут и возникает затык: на какой символ ставить квадратик — справа или слева от «черточки»? Справа не всегда можно, ибо может быть конец строки. Слева тоже не всегда можно, ибо может быть начало строки. Но вероятность, что ты выйдешь из режима редактирования в конце строки — выше, поэтому и было принято решение ставить курсор на «символ слева от черточки». Как-то так.
Показать полностью
Нашел твой issue, ты уже пробовал вот этот совет?
Styx
Опять «тьфу» :) Я подумал, что ты хочешь переопределить ESC на что-то другое :)
Не, мне тупо нужно чтобы не тянуться по сто раз мизинцем к эскейпу. В обычной работе за компом ничо, а вот в виме очень неудобно, но нужно сверхчасто. Можно погуглить, насколько это актуальный запрос. Я себе даже несколько фишек подцепил, например, возвращение в нормал мод по неактивности.

Другие редакторы не имеют разных режимов, они всегда в insert/replace режиме, поэтому и проблем таких нет.
Кэп, ты ли это?

В vim это проявляется только при переходе из insert/replace в normal, и выглядит так только потому что в insert/replace курсор на самом деле не «квадратик на символах», а «черточка между символами», но в консоли это не отобразишь, поэтому и показывается квадратик. А при выходе из режима нужно снова показывать «квадратик на символах» и вот тут и возникает затык: на какой символ ставить квадратик — справа или слева от «черточки»? Справа не всегда можно, ибо может быть конец строки. Слева тоже не всегда можно, ибо может быть начало строки. Но вероятность, что ты выйдешь из режима редактирования в конце строки — выше, поэтому и было принято решение ставить курсор на «символ слева от черточки». Как-то так.
В целом, понятна причина, но с моей колокольни это выглядит неудобно, изначально было сделано костыльно, а теперь приходится тащить бремя legacy. Причём, блин, до вима я 99% пользовался редактором фара, потому что я вообще не представляю себе винду без фара. Никакие тотал коммандеры мне его не заменят. А у фара есть такая фишка, что он консольный. И его редактор консольный. И таких проблем в нём нет.

(потому мне и нужен именно консольный вим, что я указал его как внешний редактор фара, и он, соответственно, встал там как родной. Полная и удобная иллюзия нативности)
Показать полностью
Styx
Нашел твой issue, ты уже пробовал вот этот совет?
Это не то исью, своё я делал осенью, и его пометили как дубликат гораздо более давнего xD
А, хех, ага, а этот тоже пометили, как дубликат, но дубликат другого. И тот другой закрыт два дня назад. Ладно будем посмотреть, как пятёрка релизнется. Я пока на релизе четвёрки (4.3). Или, может, бэкпортируют.

А тот совет я не пробовал. Я его, если честно, даже не понимаю. Мне проще дождаться исправления в релизе.
я вообще не представляю себе винду без фара. Никакие тотал коммандеры мне его не заменят
Наш человек! После nc — только far :)
У меня был волков коммандер.
Кстати, ещё вопросик: не знаешь, почему у меня не получается замапить что-то на <C-BS> или даже просто <BS>
Это баг или я что-то не то делаю? Хочу аналогично <C-DEL> сделать удаление предыдущего слова в редактировании, а не получается. А жать каждый раз Ctrl+O d b или Esc d b i неудобно.
Wave, хм, не знаю, никаких хитрых штук с маппингом <BS> нет. Как именно ты маппишь? Вообще, можно же юзать Ctrl+w — это стандартная комбинация для удаления предыдущего слова.
Стоп, вру, есть приколы с C-BS.
Во-первых, по-умолчанию оно будет удалять только слова вставленные после последнего перехода в insert-режим, и останавливаться на начале строки. Исправить можно так:
:set backspace=indent,eol,start
Во-вторых, маппить нужно так:
noremap! <C-BS> <C-w>
noremap! <C-h> <C-w>
Если не сработает, значит у тебя терминал посылает другую комбинацию по нажатию C-BS. И возможно она совпадает с BS.
В режиме вставки нажми Ctrl+v, затем Ctrl+BS и посмотри, что вставилось. Затем повтори для BS. Если будет одно и то же (скорее всего ^?) — значит ты не сможешь замаппить отдельно на BS и C-BS.
Вообще, можно же юзать Ctrl+w — это стандартная комбинация для удаления предыдущего слова.
Не знал. Прост по другим редакторам привык к Ctrl+Del, Ctrl+BS, Ctrl+Left(Right), а в режиме редактирования не работает w b dw db, вот я и пробовал сделать привычные штуки.
В общем, кусок моего конфига:
" Так работает
imap <C-z> <Esc>u
" без этого nvim переходит в какой-то странный режим и я не могу его оттуда достать
nmap <C-z> u
nmap <C-a> <Esc>ggVG
imap <C-a> <Esc>ggVG

imap <C-c> <Esc>"*y
nmap <C-c> <Esc>"*y
vmap <C-c> "*y
imap <C-v> <Esc>"*p
nmap <C-v> "*p
imap <A-v> <C-v>
nmap <A-v> <C-v>
imap <C-v> <Esc>"*p
" а вот здесь какая-то проблема — вставляет в поле команд
Примечание для блога: уже не помню, что имелось в виду. Да, была какая-то фигня с вставкой текста из буфера обмена в командный режим, но явно как-то не так.
" nmap <C-v> "*p

" Так работает
imap <C-Del> <Esc>ldei
" imap <C-Del> <Esc>dea " предыдущий вариант
" а так нет
" imap <C-BS> <Esc>dbi
" и так нет
" imap <C><BS> <Esc>dbi
" и даже так (пробовал для эксперимента)
" inoremap <BS> <Esc>dbi
На самом деле с копированием-вставкой этот кусок конфига недоделанный и уже заброшенный. Я пользуюсь ConEmu, а оно ведёт себя немного не так, как cmd. И тут щас на другом ноуте есть отличия от того, что уже было. Буду ещё экспериментировать. Но с бекспейсом не работало ни на предыдущем, ни на этом ноуте.
С бекспейсом что получается — что бекспейс, что контрл-бекспейс в режиме вставки несмотря на вон те попытки выше (и без них тоже) удаляет одну предыдущую букву, и всё.
noremap! <C-BS> <C-w>
noremap! <C-h> <C-w>
Тоже не работает, удаляет одну предыдущую букву и всё. Кстати, что означает <C-h> — контрол плюс аш?
И ещё, про бекспейс я пробовал и в конэму, и в цмд.
Во-первых, по-умолчанию оно будет удалять только слова вставленные после последнего перехода в insert-режим
И даже это не сработало, хотя когда я эту фразу прочитал, подумал, что дело именно в этом (и если бы это оказалось так, то это меня взбесило бы — очередное неуместное проявление искусственного интеллекта там, где его быть не должно).


И да, бекспейс в нормальном режиме делит окно вима пополам и дублирует в него текущий редактируемый файл. И вроде бы это не из-за моих экспериментов.

Я себе конфиг вообще-то сделал такого вида:
source $VIM/config/encoding.vim
source $VIM/config/plugins.vim

source $VIM/config/keybinding.vim

source $VIM/config/statusbar.vim
source $VIM/config/windows.vim

source $VIM/config/config.vim
И пока ещё в нём можно ориентироваться :-)
Показать полностью
Кстати…
nnoremap B ^
nnoremap E $
nnoremap <Home> ^
nnoremap <End> $
inoremap <Home> <Esc>^
inoremap <End> <Esc>$
Тут тоже только первые две строчки работают. Первые две я сделал потому, что тянуться зажимать шифт и цифры не очень удобно, это во-первых, а во-вторых, в отличие от букв, с цифрами у меня в режиме слепой печати довольно много промахов. И вообще.

И я б, кстати, вместо эскейпа привык бы к штатному Ctrl+[ если б не такая фигня:
" Чтобы по-русски тоже работал Ctrl[ но увы, не работает почему-то
" inoremap <C-х> <Esc>
" inoremap <C-Х> <Esc>
Такой вопрос: на что ты себе намапил клавишу лидер? Оно вроде бы как удобней всего на пробел её мапить, и очень часто так и советуют делать, но вместе с тем бывают и… Короче, та же фигня, почему ты мне не советовал переопределять эскейп.
Wave
Кстати, что означает воскл знак после noremap?
Это значит, что комбинация будет действовать в Insert и Command-Line режимах.
И что означает <C-h> — контрол плюс аш?
А это и есть бэкспейс — удаление символа слева от курсора.
Проблема в вима с <C-BS>, увы. У меня тоже не получилось забиндить, он тупо не видит разницу между BS и C-BS.
Можешь попробовать:
:inoremap <BS> ABC
Он будет вставлять ABC и по нажатию BS и по нажатию C-BS. Ctrl+h работать не перестанет.
Wave
Такой вопрос: на что ты себе намапил клавишу лидер? Оно вроде бы как удобней всего на пробел её мапить, и очень часто так и советуют делать, но вместе с тем бывают и… Короче, та же фигня, почему ты мне не советовал переопределять эскейп.
Как раз лидер можешь переназначать как тебе угодно. Плагины (и ты сам тоже должен так делать) маппят не на конкретную клавишу, а на <Leader>, т.е. если ты её изменишь (в конфиге), то все плагиновские шорткаты будут работать уже с новой клавишей.
Проблема с переназначением лидера в другом: это не специальная клавиша, а просто переменная, которая содержит в себе клавишу. Если ты изменишь лидер на пробел, то в режиме вставки/замены у тебя все комбинации с <leader>... тоже будут работать, а сам пробел будет нажиматься с секундной задержкой (vim даёт время на нажатие других клавиш).
Например, у меня есть настройка "set pastetoggle = <leader>p", если я назначу лидер на пробел, то я не смогу быстро ввести в тексте "пробел", затем "p". Мне придётся ждать около секунды между нажатиями, чтобы вим не обработал эту комбинацию.
Это значит, что комбинация будет действовать в Insert и Command-Line режимах.
Я это углядел, отредактировал коммент, убрав вопрос, но ты уже ответил :)

Он будет вставлять ABC и по нажатию BS и по нажатию C-BS. Ctrl+h работать не перестанет.
Да нет же. Он у меня почему-то всё равно, как я ни извращаюсь, в режиме вставки любой комбинацией бэкспейса или чистым бэкспейсом удаляет символ слева, если не на начале строки, а в нормальном режиме делит экран пополам (и ещё раз пополам, и ещё).

Как раз лидер можешь переназначать как тебе угодно. Плагины (и ты сам тоже должен так делать) маппят не на конкретную клавишу, а на <Leader>, т.е. если ты её изменишь (в конфиге), то все плагиновские шорткаты будут работать уже с новой клавишей.
Я не о том. Я знаю, что лидер может быть любым, просто если ставить его на пробел, то получается слишком много мелких неудобностей, потому что пробел сам по себе задействован несколько чаще остальных клавиш. Вот та штука, которую ты в следующем комменте описываешь, вылазит. Поэтому и интересуюсь, может, кто-то что-то более удобное предложит. Второй по частоте совет ставить лидер на запятую. И вот это оказывается охрененно неудобно. Во-первых, по ней я тоже, бывает, промахиваюсь. Как и по квадратным скобкам и цифрам в верхнем ряду. А во-вторых, всё тот же русский язык.
Показать полностью
Wave
Да нет же. Он у меня почему-то всё равно, как я ни извращаюсь, в режиме вставки любой комбинацией бэкспейса или чистым бэкспейсом удаляет символ слева, если не на начале строки, а в нормальном режиме делит экран пополам (и ещё раз пополам, и ещё).
А вот это странно... Покажи что выведет в файлик
:redir! > vim_keys.txt
:silent verbose map
:silent verbose map!
:redir END
Так. Чудеса в решете продолжаются.
vim_keys.txt показал, что у меня какого-то хрена включен плагин auto-pairs, хотя я был уверен, что выключил его.
Ладно, выключил. Результат такой:
noremap! <C-h> <C-w> — делает чтобы бэкспейс удалял предыдущее слово. Ну слава яйцам, хоть что-то работает. Но мне это не нужно, поэтому удаляю.
noremap! <C-BS> <C-w> — и бэкспейс, и контрл-бэкспейс одинаково в режиме редактирования удаляют предыдущую букву. В нормальном режиме сонтрл-бэкспейс сдвигает курсор влево, а бэкспейс делит экран пополам. При этом vim_keys.txt с бэкспейсом содержит только такое:
! <C-BS> * <C-W>
В последний раз опция изменена в D:\TOOLS\Text\nvim\ share\nvim/config/keybinding.vim line 57
На самом деле мне не обязательно докапываться до корня проблемы. Раз существует комбинация удаления слова слева от курсора, то я вполне могу привыкнуть пользоваться ей.

Да, кстати, контрол+аш в нормальном режиме тоже делит экран по вертикали, а в редактировании удаляет символ слева.
А, во, нашёл!
<C-H> :call WinMove('h')<CR>
В последний раз опция изменена в D:\TOOLS\Text\nvim\share\nvim/config/windows.vim line 20

map <silent> <C-h> :call WinMove('h')<cr>
map <silent> <C-j> :call WinMove('j')<cr>
map <silent> <C-k> :call WinMove('k')<cr>
map <silent> <C-l> :call WinMove('l')<cr>
Это предполагалось, что Ctrl+hjkl можно переключаться между разделениями вимовского экрана, притырил этот трюк вместе с функцией WinMove у кого-то, но кто ж знал (и этот нект тоже), что <C-h> это у нас <BS>
Так а как замапить Home и End и главное, как в режиме редактирования прыгать на начало-конец строки? А то не прикалывает делать <Esc>A или <Esc>I особенно учитывая, что я так и не определился с тем, чем же заменить себе эскейп.

И с копированием-вставкой я запутался конкретно. Что-то так по всему выходит, что то, что я считал за вставку средствами "*p на самом деле построчная вставка средствами conemu. И потому она такая медленная. А до самого вима <C-v> просто не доходит, что ли…

Ладно, для вставки норм работает плагин vim-bracketed-paste. Можно было бы те же несколько строчек из него вставить в конфиг, но они мне как-то малопонятны, поэтому пусть будут в плагине.
Wave
Так а как замапить Home и End и главное, как в режиме редактирования прыгать на начало-конец строки? А то не прикалывает делать <Esc>A или <Esc>I особенно учитывая, что я так и не определился с тем, чем же заменить себе эскейп.
Можешь пока использовать C-a и C-e — это ридлайновские Home/End (правда Home кидает в начало строки, а не текста на строке). Я попозже доберусь до компа с полноразмерной клавиатурой и посмотрю, что там у меня с Home/End.
но кто ж знал (и этот нект тоже), что <C-h> это у нас <BS>
Смотри, вот тут есть стандартные шорткаты readline, можешь подсматривать, чтобы случайно не переопределить :)
И с копированием-вставкой я запутался конкретно.
Я тоже :) В чём там проблема была?
Если ты используешь ConEmu, то ты можешь в нём самом определить комбинацию Ctrl-BS, чтобы он посылал Ctrl+w :) Я сейчас попробовал в своём терминале, работает :)
Упд: кстати, у него уже такое есть в настройках.
Если ты используешь ConEmu, то ты можешь в нём самом определить комбинацию Ctrl-BS, чтобы он посылал Ctrl+w :) Я сейчас попробовал в своём терминале, работает :)
Не-не! В этом же самом конэму у меня работает и фар.
Upd. Глянул, что там имеется в виду. Ни одно состояние 3-state переключателя не меняет поведения вот этого вот ни при наличии, ни при отсутствии noremap! <C-BS> <C-w>
Если что, интерес разобраться тут у меня чисто спортивный, чтобы знать, что это нафиг такое. Так- то мне достаточно того, что есть шоткат для того, что мне нужно. Который к тому же работает и в русской раскладке.

Можешь пока использовать C-a и C-e
Эххъъ. Хрен редьки не слаще. На C-a у меня
nmap <C-a> <Esc>ggVG
imap <C-a> <Esc>ggVG
А C-e прокручивает текст на строку вниз, оставляя курсор в предыдущей строке. Это, насколько помню, стандартный вимовский шоткат.

Я тоже :) В чём там проблема была?
Во всём разом: а) у вима есть свой буфер обмена, б) два режима вставки: с отступами и без, в) поверх этого вмешивается конэму и тоже в двух режимах (всё портить и бибикать ©). В фаре не вмешивается, а тут вмешивается.

Ночью я было обрадовался, найденный плагин работает полностью так, как мне надо:
if exists("g:loaded_bracketed_paste")
finish
endif
let g:loaded_bracketed_paste = 1

let &t_ti .= "\<Esc>[?2004h"
let &t_te = "\e[?2004l" . &t_te

function! XTermPasteBegin(ret)
set pastetoggle=<f29>
set paste
return a:ret
endfunction

execute "set <f28>=\<Esc>[200~"
execute "set <f29>=\<Esc>[201~"
map <expr> <f28> XTermPasteBegin("i")
imap <expr> <f28> XTermPasteBegin("")
vmap <expr> <f28> XTermPasteBegin("c")
cmap <f28> <nop>
cmap <f29> <nop>
Пофиг, что я это почти не понимаю. Пофиг что шоткат Ctrl+Shift+V — привыкну. А вот сейчас сижу экспериментирую, и опять вылазят траблы. Во-первых, в русской раскладке не работает. Во-вторых, опять хрен знает где вставляет: может со следующей строчки, а может в позицию после курсора (p — на символ дальше).

Вот это меня бесит неимоверно. Я вижу, где стоит курсор. Я говорю редактору что-то сделать, например, вставить текст из буфера обмена. А он берёт и делает это на символ дальше от курсора. И да, ты уже объяснял, но всё равно это нахрен неудобно. Возможно, пока что, пока не искривлю свои пальцы под вим.
Показать полностью
Wave
Вот это меня бесит неимоверно. Я вижу, где стоит курсор. Я говорю редактору что-то сделать, например, вставить текст из буфера обмена. А он берёт и делает это на символ дальше от курсора. И да, ты уже объяснял, но всё равно это нахрен неудобно. Возможно, пока что, пока не искривлю свои пальцы под вим.
Стоп, про это я ничего не объяснял. Только про выход из insert-режима.
Если хочешь вставлять текст в позицию курсора, то вместо p используй gP.
Можешь забиндить: nnoremap p gP
Только аккуратно, если пользуешься всякими xp, ddp — они поломаются с новым биндингом.
Из разного забаного. Довелось сесть за машинку с XP. Обнаружил, что под хрюшу не идёт неовим, пришлось скачивать и ставить вим. И оказалось, что у него с неовимом разные глюки. Ну, так, например, F1-F5 полностью работают, зато абсолютно не работают бэкспейсы.
inoremap! <C-BS> <C-w>
inoremap! <BS> <C-h>
Никакие такие ухищрения не помогают. Работают только строго Ctrl+w и Ctrl+h. А бекспейс и контрол+бекспейс вставляют всякую фигню.
Или вот:
" Чтобы по-русски тоже работал Ctrl[ В vim работает, в neovim не работает.
inoremap <C-х> <Esc>
inoremap <C-Х> <Esc>
Ещё какие-то мелочи разнятся…
Wave, inoremap! — такой команды нет. Есть inoremap и noremap! :)
Сделай такую штуку: нажми Ctrl+v, затем backspace, и посмотри, что получится. На «это» и забиндь C-h.
Вообще, это глюки не конкретно vim/neovim, а конкретных реализаций readline, под которыми они работают.
Всё равно не получается. Вставляется <BS> и <C-BS> соответственно, а при попытке намапить в редакторе вставляется Îx и ^_
Ладно, нахрен, я спать. Точно уж, софт для красноглазиков.
Блядь! А когда пытаюсь «методом половинного деления» отключать свои конфиги (плагины, например), то натыкаюсь на то, что в голом виме бекспейс работает (но контрол-бекспейс не мапится), но удаляет только свежевведенное. Т.е. делаю я A(ppend), ввожу несколько символов, удаляю их бекспейсом, бекспейс упирается в то, что было до нажатия A и останавливается намертво. Я могу сместиться левей и del'ом удалить что нужно, но не бекспейсом. FUUUUUUUUUUUUUUU!!!!!!!!

Вот в такие моменты начинаю ненавидеть вим.
Wave
бекспейс упирается в то, что было до нажатия A и останавливается намертво
Я уже про это говорил:
:set backspace=indent,eol,start
Wave
Всё равно не получается. Вставляется <BS> и <C-BS> соответственно, а при попытке намапить в редакторе вставляется Îx и ^_
Вот это и попробуй намаппить (через noremap!) на C-h и C-w.
Styx
Wave
Вот это и попробуй намаппить (через noremap!) на C-h и C-w.
Не получается. Всё равно вставляется эта же белиберда.
Wave, а что за белиберда-то? :)
Попробуй ещё слить все маппинги в файл, как я показывал выше, и глянь, может это что-то где-то шалит.
В общем, поковырялся ещё, используя метод половинного деления опять. Выяснил, что в приколах с бекспейсом виновата строка set term=xterm
" 256 цветов в конэму.
if !has("gui_running")
set term=xterm
set t_Co=256
let &t_AB="\e[48;5;%dm"
let &t_AF="\e[38;5;%dm"
inoremap <Char-0x07F> <BS>
nnoremap <Char-0x07F> <BS>
endif

Чисто охота нормальную цветовую схему использовать, на 256 цветов, с жирным-курсивом-подчёркиваниями и прочими подобными мелочами. Но увы, либо то, либо это. Я, конечно, ещё поковыряю документацию что одного продукта, что другого, но…

Неовиму в отличие от вима в данном случае требуется только set termguicolors

И, да, проблему с map <C-BS> <C-w> решить не получается никак, но вот при запуске gVim нормально работают и бекспейс, и контрол-бекспейс.

Надо гуёвому виму ещё подобрать шрифт как-то, потому что тот, который по умолчанию, сильно многого не хочет нормально показывать. Например, значки у NERDTree.
Упд. Еле-еле выяснил, что писать в конфиге надо так: set guifont=DejaVu_Sans_Mono:h10 (с подчёркиваниями). А ещё, что выбор шрифтов там почему-то очень бедный, и что далеко не все значки, в отличие от конэму, отображаются.

Слуш, пара мелочей:
Как гвим распахнуть на весь экран при запуске? Нашёл только паллиатив
set columns=999
set lines=999

При указании set encoding=utf8 nobomb меню гвима стало показывать иероглифы. Я сдеал по-простому, убрал меню (и тулбар) вообще. Но это тоже паллиатив.

Ну и ещё такое: при первом старте гвим говорит что-то типа «библиотеки не зарегистрированы, зарегистрировать?» — что за библиотеки и как бы этот вопрос вообще убрать? Дело в том, что в силу виртуализации после перезагрузки всё возвращается на круги своя и эти библиотеки вновь незарегистрированы.
Показать полностью
Wave
Как гвим распахнуть на весь экран при запуске? Нашёл только паллиатив
set columns=999
set lines=999
Ну это и есть обычный способ для вима :)

При указании set encoding=utf8 nobomb меню гвима стало показывать иероглифы. Я сдеал по-простому, убрал меню (и тулбар) вообще. Но это тоже паллиатив.
Должно быть utf-8 (с дефисом). :h encoding-names

Ну и ещё такое: при первом старте гвим говорит что-то типа «библиотеки не зарегистрированы, зарегистрировать?»
А покажи точный текст ошибки.
Должно быть utf-8 (с дефисом). :h encoding-names


Без этой опции, с дефисом или без, всё нормально.
А покажи точный текст ошибки.

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


Без этой опции, с дефисом или без, всё нормально.
Тьфу, это же винда :)
Тогда сделай так: запусти вим без этой опции, потом запусти команду:
:set encoding?
Посмотришь, какая кодировка активная, и добавь её же в настройки, но с добавление "nobomb".

На самом деле эта фигня означает, что один раз за сеанс винды я при запуске gvim должен лишних два раза нажать enter (или каждый раз выбирать нет). Прост слегка раздражает.
Ага, понял. Сделай какой-нибудь autoexec.bat (или что там нынче) в котором пропиши:
<path-to-gvim>\gvim -silent -register
Чтобы он запускался каждый раз при старте винды и втихаря регистрировал что ему нужно.
Посмотришь, какая кодировка активная, и добавь её же в настройки, но с добавление "nobomb".
cp1251, разумеется. Всё бы ничего, но при этом выскакивает ошибка в какой-то из функций gitgutter о неправильном символе. Он-то в юникоде указан. Мне кажется, лучше уж указать юникод и убрать меню с тулбаром.
Самое, блин, смешное, что я в терминале вижу больше юникодных символов, чем в гуе. В гуе, какой шрифт ни пытаюсь выбрать, на месте всяких  или  вижу только квадратики. Или вопросительные знаки, если указываю 1251.

Ага, понял. Сделай какой-нибудь autoexec.bat (или что там нынче) в котором пропиши:
Ясно, спасибо, оно. Только у меня в силу всё той же виртуализации и костылика вокруг неё это autorun.vbs.
Что-то мне всё меньше нравится XP, хотя я на ней сидел, можно сказать, до последнего.
Слушай, а в виме нет такой фигни… Короче, редактировал я сейчас один текст, потом попытался из него копипейстнуть, но вовремя там, куда вставлял, нажал на предпросмотр. Так вот, изменились цифры. 24-е переправилось на 25-е, 1989 на 1990, 19 на 20. И судя по истории редактирования, никто кроме меня это не делал. Получается, что скорей всего это сделал вим. И уж точно никаких подобных плагинов я не ставил. Какой-то штатный функционал?
Wave, C-a/C-x для увеличения/уменьшения. Может случайно нажал? :)
Увы, не случайно. Я себе намапил C-a — выделить всё — привычный по остальным хоткей. Всё лучше, чем сначала жать Esc, потом вспоминать, какой командой переходить в самое начало файла, потом переводить в визуальный режим, потом вспоминать команду перехода в конец файла.

В принципе-то оно работает. Обычно — как задумано. Я и не знал об опции инкремента-декремента, хотя выделением пользовался. Просто вот это вот выяснил, что если уже выделенный текст ещё раз попробовать выделить, тогда эта хрень и срабатывает. Теперь думаю, то ли привыкать выделять чем-то другим, то ли перемапливать инк\дек, то ли понадеяться, что никогда не нажму случайно дважды подряд C-a.
Перед маппингом C-a можно сначала сделать unmap. Ну или vnoremap <C-a> добавь ещё.
С горем пополам докопался, что проблемы с бэкспейсом у меня начинаются с Vim8.2. 8.1 и более ранние этой проблемы не имеют, но 8.2, только её ставишь и вносишь одну-единственную строчку в конфиг: set term=xterm — всё, отсюда начинается такое выделывание, что я уже заколебался искать корень.
В принципе, можно будет ещё, ну, не знаю, пошерстить стандартные \vim82\keymap\*.vim и тому подобное дерьмо, но, блин, я и так потратил на это дофигищу времени, и не сказать чтобы это были полезные траты.
ПОИСК
ФАНФИКОВ







Закрыть
Закрыть
Закрыть