Могу ли я сопоставить клавишу Alt в Vim?


91

Я попытался сопоставить с добавлением строки ниже в .vimrc, но это не сработало. Я проверил, что .vimrc загружен Vim.

map <Alt-D> <C-D>

есть ли ошибка в этом сопоставлении?


Вы используете vim в терминале или версию с графическим интерфейсом (gvim, macvim)?
Ник Ноулсон

Также обратите внимание, что если ваши encodingизменения после выполнения сопоставления, то, что вы получаете от клавиш Alt, может не совпадать с тем, что вы изначально установили.
dash-tom-bang

Ответы:


138

Для пользователей Mac: для сопоставления ALT + hjkl используйте вместо этого настоящий сгенерированный символ (выясните, какой символ с помощью комбинации в режиме INSERT), например, с моей клавиатурой я получаю:

<ALT+j> ==> ª
<ALT+k> ==> º

и так далее. Решение найдено здесь, на StackOverflow.

Я использовал это для перемещения строк вверх и вниз с помощью ALT + k \ j, используя это на моем .vimrc:

nnoremap ª :m .+1<CR>==
nnoremap º :m .-2<CR>==

inoremap ª <Esc>:m .+1<CR>==gi
inoremap º <Esc>:m .-2<CR>==gi

vnoremap ª :m '>+1<CR>gv=gv
vnoremap º :m '<-2<CR>gv=gv

как объяснено здесь .

Надеюсь, это будет полезно, наслаждайтесь Vim :)

ДОПОЛНЕНИЕ ПО Dylan_Larkin (2019): Для этого , чтобы работать на Mac, « Использование опции как Meta Key » должна быть включена OFF в Terminal-> Настройки-> Клавиатура


10
Это как раз то, для чего я сюда пришел (Alt + HJKL для перемещения разбиения)! Благодаря!
Джейми Шембри

6
Самый простой способ узнать, какой это символ - использовать cat. Просто введите catв окне кошки нужную комбинацию клавиш. Выяснилось, что alt + скобки - это 'и «на моем Mac.
dvcrn

4
это отлично работает, как Alt + HJKL для перемещения между разделениями, моим пальцам это нравится !! nmap ˙ <C-w><Left> nmap ¬ <C-w><Right> nmap ˚ <C-w><Up> nmap ∆ <C-w><Down>
Джон Моралес

3
Эти точные сопоставления могут не работать должным образом в будущих версиях OSX. Используйте sed -n lдля просмотра вывода <Ak> и <Aj> перед настройкой сопоставления. В моем случае <Aj> есть, а <Ak>˚
luk3thomas

4
В macOS при настройке Use Option as Meta Keyили в профиле iTerm ⌥ key to Esc+будет вести себя как обычно (как в Linux / Unix). Таким образом, вам не нужно устанавливать в Vim карту <^[j>, просто сопоставьте ее <A+j>или, <M+j>и она работает.
goetzc 02

40

:help key-notationописывает, какой формат необходимо использовать для сопоставления различных ключей. В случае alt вы можете использовать либо <A-или <M-. Итак, ваше отображение будет

map <M-d> <C-d>

Я также рекомендовал бы использовать noreвариант :map(например, noremap), если вы явно не хотите разрешить переоценку правой части для сопоставлений.


2
Это по-прежнему не имеет никакого эффекта. Alt + D по-прежнему вводит в Vim какой-то странный символ.
Thomson

9
Это отдельная тема. Ваш терминал отправляет Vim многобайтовый символ, и Vim не знает, как его интерпретировать <A-d>. Вероятно, вам нужно изменить настройки вашего терминала, чтобы он отправлял <A-d>как <Esc>d.
jamessan

1
@jamessan как это сделать на iterm2?
Finn

33

Я больше не уверен, что это «возможно». Пожалуйста, прочтите обновление ниже.

Да, вы можете даже в терминальном vim, но нет реального ответа на все вопросы. В основном вам нужно выполнить два шага:

  1. Убедитесь, что <M-d>обозначение существует, и точно укажите, что вводит ваш терминал ( ^[это escape-символ):

    $ cat
    ^[d
    $
    
    " in your .vimrc
    execute "set <M-d>=\ed"
    " you have to use double quotes!
    
  2. Сопоставьте что-нибудь с вашей недавно "созданной" комбинацией:

    noremap <M-d> :echo "m-d works!"<cr>
    

Понимая, как это работает, вы можете расширить этот «трюк» на другие «странные» комбинации, например, я использую термит, а vim не распознает <S-F1>, используя cat, которую я получаю ^[[1;2P. Затем в моем vimrc я делаю:, execute "set <S-F1>=\e[1;2P"а затем я могу сопоставить его с чем угодно.

Примечание: я не знаю почему, но для некоторых людей \<Esc>работает вместо \e.


Обновление (февраль 2016 г.)

В зависимости от terminfo, который запускает ваш терминал, возможно, вы могли бы ... в большинстве терминалов, например, отображается "alt + h", то ^[hесть: "escape + h". Так он мог перезаписывать ключи. Я только что попробовал (снова), и, похоже, это сработало, но я считаю, что это очень ошибочная и подверженная ошибкам реализация.

Тем не менее, для достаточно смелых есть экспериментальный плагин:


Вместо execute "set...вещей вы можете просто использовать напрямую set <M-d>=^[d. На ^[самом деле это escape-символ, введенный с C-v-Esc. Это было необходимо в rxvt / urxvt, но xterm не нуждается в особой обработке. Больше информации по этой теме в вики vim .
Мика Эллиотт

Есть ли аналогичный подход к этому, который работал бы с tmux, чтобы, например, можно было связать Md?
Джордж

2
Для меня, <Esc>то dтеперь делает то же самое, <Alt>+ d. Кроме того, вы можете просто сделать это в одной строке с Ctrl-v, <Esc>как здесь .
Sparhawk

24

Клавиша Alt на карте в Vim на Mac OSx:

Начните с просмотра кода ключа, который ваш терминал отправляет в vim:

$ sed -n l
^[[1;9D 

В приведенном выше примере я выполнил команду и нажал Alt + Left.

Это ^[[1;9Dэкранированная последовательность, отправляемая в vim, поэтому мы можем использовать ее для нашего сопоставления.

map <Esc>[1;9D 

3
Если вы используете приложение iTerm2, хорошо бы проверить, как отображаются ключи, в Профиле> Ключи.
fikovnik

1
С левой Optionклавишей ( ), настроенной как Esc+в iTerm2, я мог alt+qбы выйти из vim: nnoremap <silent> <Esc>q :qa!<cr>
ryenus

Вы также можете настроить iTerm2 для работы с этим переназначением, если вы перейдете в «Настройки»> «Профили», выберите свой текущий профиль, перейдите на вкладку «Ключи» для этого профиля и измените параметр с надписью «Левая ⌥ Клавиша» на «Esc +» (доступно варианты: «Нормальный», «Мета» и «Esc +»).
Джованни Бенусси

12

Использование:

map <A-D> <C-D>

Смотрите :help key-notation.


1
Кажется, это все еще не работает. Alt + d будет вводить странный символ в Vim, как и в случае unmap.
Thomson

У меня работает (я использую gvimв Windows)
Deqing

8

Ваш терминал может некорректно передавать Alt-D. Вы можете использовать CV, чтобы фактически получить фактическую escape-последовательность, отправленную в Vim, и использовать ее для создания вашего сопоставления. Т.е. отредактируйте свой .vimrc и замените фактический, набрав следующую последовательность «CV Alt-D», чтобы у вас была правильная escape-последовательность в вашем vimrc. Это не сработает, если ваш терминал ничего не отправляет в vim.


8

Мой терминал будет выдавать ^[xкоманды (например, для alt-x). Что заставило его работать внутри Vim, так это небольшой скрипт с vim.wikia.com :

for i in range(97,122)
  let c = nr2char(i)
  exec "map \e".c." <M-".c.">"
  exec "map! \e".c." <M-".c.">"
endfor

Добавьте в .vimrc, чтобы исправить все сопоставления клавиш alt.


1

в качестве продолжения ответа Бруно для пользователей Mac попробуйте убедиться, что ваш ключ выбора сопоставлен Esc+.

Это даст вам «нормальное» поведение Aклавиши option ( ) в Vim.

Например, в iterm2этой опции можно найти в Preferences > Profiles > Keys:

скриншот настроек iterm2


Мне также пришлось сменить nnoremap <Esc>j :m .+1<CR>==
конфиг

0

Привет, после того, как после многих лет тестирования всего вышеперечисленного на Mac хорошего решения не было, я продолжил поиск.

Вот мое решение:

Чтобы создать комбинацию клавиш, включая Alt, вы должны объявить комбинацию в настройках> клавиатура и использовать эту комбинацию в файле установки vim (отметьте опцию использования как мета-клавишу).

Вывод должен быть необычным символом ( aнапример, нет), чтобы вы не переопределяли обычный символ.

В приведенном ниже примере у вас должно получиться довольно сильно работать с ALT-Up.

Настройка vim: настройка vim

настройка Mac: настройка Mac

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.