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

Пароль

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

#IT #Лытдыбр
25 января 2020
37 комментариев из 77 (показать все)
Вообще, можно же юзать 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 и тому подобное дерьмо, но, блин, я и так потратил на это дофигищу времени, и не сказать чтобы это были полезные траты.
ПОИСК
ФАНФИКОВ







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