Коллекции загружаются
К моему же собственному удивлению, пристрастился к виму. Оказывается, это офигенно удобно, когда не нужно убирать пальцы с букв (на del, backspace, клавиши курсора, etc). Удобно-удобно-удобно… А потом бац — натыкаешься на какую-нибудь фигню, в которой вим до жути дубовый и неудобный. Например, на то, как он делает вставку. И всё, хочется залепить кулаком в экран. И уж точно времени тратится куда больше, чем если бы я это же делал в каком-нибудь другом редакторе.
#IT #Лытдыбр 25 января 2020
4 |
но сам факт такого вот сдвига каретки раздражает: «ну нафига?» Там в первом же ответе объясняется :)И ещё размышляю, как научиться выходить из режима редактирования не по эскейпу. Не советую, могут поломаться (и обязательно поломаются) плагины.какая разница между разными вариантами *map (imap inoremap и т.п.) На самом деле всё довольно просто::map ... — назначает :map — показывает :unmap ... — удаляет :mapclear — удаляет всё Все остальные префиксы и суффиксы — это определения режимов, на которые назначается комбинация, и метод работы: Префикс nore — запрещает рекурсивный вызов. Например: :imap C ABC Префиксы n, i, v, x, c, s, o определяют режимы, в которых будут работать комбинации:По нажатию C сначала вставится AB, затем попробуется вставится C, которое на самом деле ABC, и т.д. В итоге уйдет в бесконечную рекурсию (прервать можно по Ctrl+C). :inoremap C ABC По нажатию C вставится ABC. n — Normal mode Есть ещё суффикс ! — он определяет "Insert and Command-line 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 Без префиксов и суффикса (: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 :) |
У меня был волков коммандер.
|
Wave, хм, не знаю, никаких хитрых штук с маппингом <BS> нет. Как именно ты маппишь? Вообще, можно же юзать Ctrl+w — это стандартная комбинация для удаления предыдущего слова.
|
Вообще, можно же юзать Ctrl+w — это стандартная комбинация для удаления предыдущего слова. Не знал. Прост по другим редакторам привык к Ctrl+Del, Ctrl+BS, Ctrl+Left(Right), а в режиме редактирования не работает w b dw db, вот я и пробовал сделать привычные штуки.В общем, кусок моего конфига: " Так работает На самом деле с копированием-вставкой этот кусок конфига недоделанный и уже заброшенный. Я пользуюсь ConEmu, а оно ведёт себя немного не так, как cmd. И тут щас на другом ноуте есть отличия от того, что уже было. Буду ещё экспериментировать. Но с бекспейсом не работало ни на предыдущем, ни на этом ноуте.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 С бекспейсом что получается — что бекспейс, что контрл-бекспейс в режиме вставки несмотря на вон те попытки выше (и без них тоже) удаляет одну предыдущую букву, и всё. noremap! <C-BS> <C-w> Тоже не работает, удаляет одну предыдущую букву и всё. Кстати, что означает <C-h> — контрол плюс аш?noremap! <C-h> <C-w> И ещё, про бекспейс я пробовал и в конэму, и в цмд. Во-первых, по-умолчанию оно будет удалять только слова вставленные после последнего перехода в 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 |
Wave
Кстати, что означает воскл знак после noremap? Это значит, что комбинация будет действовать в Insert и Command-Line режимах.И что означает <C-h> — контрол плюс аш? А это и есть бэкспейс — удаление символа слева от курсора.Проблема в вима с <C-BS>, увы. У меня тоже не получилось забиндить, он тупо не видит разницу между BS и C-BS. Можешь попробовать: :inoremap <BS> ABC Он будет вставлять ABC и по нажатию BS и по нажатию C-BS. Ctrl+h работать не перестанет. |
Wave
Такой вопрос: на что ты себе намапил клавишу лидер? Оно вроде бы как удобней всего на пробел её мапить, и очень часто так и советуют делать, но вместе с тем бывают и… Короче, та же фигня, почему ты мне не советовал переопределять эскейп. Как раз лидер можешь переназначать как тебе угодно. Плагины (и ты сам тоже должен так делать) маппят не на конкретную клавишу, а на <Leader>, т.е. если ты её изменишь (в конфиге), то все плагиновские шорткаты будут работать уже с новой клавишей. |
Это значит, что комбинация будет действовать в Insert и Command-Line режимах. Я это углядел, отредактировал коммент, убрав вопрос, но ты уже ответил :)Он будет вставлять ABC и по нажатию BS и по нажатию C-BS. Ctrl+h работать не перестанет. Да нет же. Он у меня почему-то всё равно, как я ни извращаюсь, в режиме вставки любой комбинацией бэкспейса или чистым бэкспейсом удаляет символ слева, если не на начале строки, а в нормальном режиме делит экран пополам (и ещё раз пополам, и ещё).Как раз лидер можешь переназначать как тебе угодно. Плагины (и ты сам тоже должен так делать) маппят не на конкретную клавишу, а на <Leader>, т.е. если ты её изменишь (в конфиге), то все плагиновские шорткаты будут работать уже с новой клавишей. Я не о том. Я знаю, что лидер может быть любым, просто если ставить его на пробел, то получается слишком много мелких неудобностей, потому что пробел сам по себе задействован несколько чаще остальных клавиш. Вот та штука, которую ты в следующем комменте описываешь, вылазит. Поэтому и интересуюсь, может, кто-то что-то более удобное предложит. Второй по частоте совет ставить лидер на запятую. И вот это оказывается охрененно неудобно. Во-первых, по ней я тоже, бывает, промахиваюсь. Как и по квадратным скобкам и цифрам в верхнем ряду. А во-вторых, всё тот же русский язык. |
Wave
Да нет же. Он у меня почему-то всё равно, как я ни извращаюсь, в режиме вставки любой комбинацией бэкспейса или чистым бэкспейсом удаляет символ слева, если не на начале строки, а в нормальном режиме делит экран пополам (и ещё раз пополам, и ещё). А вот это странно... Покажи что выведет в файлик:redir! > vim_keys.txt :silent verbose map :silent verbose map! :redir END |
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") Пофиг, что я это почти не понимаю. Пофиг что шоткат Ctrl+Shift+V — привыкну. А вот сейчас сижу экспериментирую, и опять вылазят траблы. Во-первых, в русской раскладке не работает. Во-вторых, опять хрен знает где вставляет: может со следующей строчки, а может в позицию после курсора (p — на символ дальше).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> Вот это меня бесит неимоверно. Я вижу, где стоит курсор. Я говорю редактору что-то сделать, например, вставить текст из буфера обмена. А он берёт и делает это на символ дальше от курсора. И да, ты уже объяснял, но всё равно это нахрен неудобно. Возможно, пока что, пока не искривлю свои пальцы под вим. |
Wave
Вот это меня бесит неимоверно. Я вижу, где стоит курсор. Я говорю редактору что-то сделать, например, вставить текст из буфера обмена. А он берёт и делает это на символ дальше от курсора. И да, ты уже объяснял, но всё равно это нахрен неудобно. Возможно, пока что, пока не искривлю свои пальцы под вим. Стоп, про это я ничего не объяснял. Только про выход из insert-режима.Если хочешь вставлять текст в позицию курсора, то вместо p используй gP. Можешь забиндить: nnoremap p gP Только аккуратно, если пользуешься всякими xp, ddp — они поломаются с новым биндингом. |
Wave, inoremap! — такой команды нет. Есть inoremap и noremap! :)
Сделай такую штуку: нажми Ctrl+v, затем backspace, и посмотри, что получится. На «это» и забиндь C-h. |
Вообще, это глюки не конкретно vim/neovim, а конкретных реализаций readline, под которыми они работают.
|
Всё равно не получается. Вставляется <BS> и <C-BS> соответственно, а при попытке намапить в редакторе вставляется Îx и ^_
|
Ладно, нахрен, я спать. Точно уж, софт для красноглазиков.
|
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 Без этой опции, с дефисом или без, всё нормально. |
Wave
Без этой опции, с дефисом или без, всё нормально. Тогда сделай так: запусти вим без этой опции, потом запусти команду: :set encoding? Посмотришь, какая кодировка активная, и добавь её же в настройки, но с добавление "nobomb".На самом деле эта фигня означает, что один раз за сеанс винды я при запуске gvim должен лишних два раза нажать enter (или каждый раз выбирать нет). Прост слегка раздражает. Ага, понял. Сделай какой-нибудь autoexec.bat (или что там нынче) в котором пропиши:<path-to-gvim>\gvim -silent -register Чтобы он запускался каждый раз при старте винды и втихаря регистрировал что ему нужно. |
Что-то мне всё меньше нравится XP, хотя я на ней сидел, можно сказать, до последнего.
|
Wave, C-a/C-x для увеличения/уменьшения. Может случайно нажал? :)
|
Перед маппингом C-a можно сначала сделать unmap. Ну или vnoremap <C-a> добавь ещё.
|