Я подбрасываю это здесь после того, как прочесываю тонны ТАКИХ вопросов и ответов. Это решение работало для меня с iTerm2 + Mojave.
- В iTerm2 перейдите в «Настройки» -> «Профиль» -> «Ключи». В правом нижнем углу измените свою левую (или правую) функциональную клавишу, чтобы включить последовательность Esc + вместо Meta / Normal.
- Вставьте следующий код в ваш .vimrc:
execute "set <A-j>=\ej"
execute "set <A-k>=\ek"
nnoremap <A-j> :m .+1<
nnoremap <A-k> :m .-2<
inoremap <A-j> <Esc>:m .+1<CR>==
inoremap <A-k> <Esc>:m .-2<CR>==
vnoremap <A-j> :m '>+1<CR>gv=
vnoremap <A-k> :m '<-2<CR>gv=gv
Что это делает?
Правда, мое понимание не велико. Когда вы отправляете команду ALT+j
на Терминал, iTerm получит ее как ^[j
, что является последовательностью Escape. При сопоставлении его с Vim, ^[
заканчивается как \e
. Если вы хотите дважды проверить, как работает ваш ALT+j
(или ALT+k
), введите sed -n l
в окне терминала и нажмите ALT+j
- вы должны увидеть этот вывод: ^[j
Команды execute set
переопределяют сопоставления <A-j>
и <A-k>
, чтобы Vim отключил ^[j
/ ^[k
соответственно, чтобы соответствовать тому, что запускается iTerm.
Это исправило это для меня, и теперь я могу перемещать линейные блоки как профессионал. Надеюсь, это поможет некоторым людям (извините за мое неаккуратное объяснение - все еще изучаю экосистему Vim).