Чи можу я зіставити ключ Alt у Vim?


90

Я намагався зіставити як додавання рядка нижче до .vimrc, але це не працює. Я перевірив, що .vimrc завантажений Vim.

map <Alt-D> <C-D>

чи є помилка в цьому відображенні?


Чи використовуєте ви vim у терміналі чи графічну версію (gvim, macvim)?
Нік Ноулсон,

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

Відповіді:


136

Для користувачів 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, потрібно вимкнути " Використовувати параметр як мета-ключ " у Terminal-> Preferences-> Keyboard


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), якщо ви явно не хочете дозволити повторну оцінку правої сторони для зіставлення.


1
Це все одно не має жодного ефекту. Введення Alt + D все ще вводить якийсь дивний символ у Vim.
Томсон,

9
Це окреме питання. Ваш термінал надсилає Vim багатобайтовий символ, і Vim не знає, як це трактувати <A-d>. Ймовірно, вам потрібно змінити налаштування терміналу, щоб він надсилав <A-d>як <Esc>d.
jamessan

1
@jamessan як це зробити на iterm2?
Фінн,

33

Я вже не впевнений, що це "можливо". Будь ласка, прочитайте оновлення нижче.

Так, ви можете навіть у терміналі vim, але реальної угоди на всі відповіді немає. В основному потрібно виконати два кроки:

  1. Переконайтесь, що <M-d>нотація існує, і точно відображте те, що вводить ваш термінал ( ^[це символ входу ):

    $ 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>, використовуючи кота, якого я отримую ^[[1;2P. Потім, у моєму vimrc я роблю:, execute "set <S-F1>=\e[1;2P"і тоді я можу зіставити його з чим завгодно.

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


Оновлення (лютий 2016 р.)

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

Тим не менше, для досить сміливих, ось експериментальний плагін:


Замість execute "set...матеріалу ви можете просто безпосередньо використовувати set <M-d>=^[d. Це ^[насправді символ втечі, введений за допомогою C-v-Esc. Це було необхідно в rxvt / urxvt, але xterm не потребує спеціального лікування. Більше інформації на цю тему у вікі vim .
Micah Elliott

Чи існує аналогічний підхід до цього, який би працював з tmux, щоб Md міг бути прив'язаний?
Джордж

2
Для мене <Esc>тоді dтепер робить те саме, що <Alt>+ d. Крім того, ви можете просто зробити це в один рядок Ctrl-v, <Esc>відповідно до тут .
Спархок,

24

Карта Alt Key у 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.
Томсон,

Працює для мене (я використовую gvimу Windows)
Deqing

8

Ваш термінал може не передавати «належним чином» Alt-D. Ви можете використовувати резюме, щоб фактично отримати фактичну послідовність виходу, надіслану Vim, і використати її для створення вашого відображення. Тобто відредагуйте файл .vimrc та замініть фактичний, набравши наступну послідовність "CV Alt-D", щоб у вас була правильна послідовність виходу у ваш 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 клавіші ) у Vim.

Наприклад, в iterm2, цей параметр можна знайти за адресою Preferences > Profiles > Keys:

скріншот налаштувань iterm2 -


Мені також довелося змінити конфігурацію на nnoremap <Esc>j :m .+1<CR>==та подібні ...
mihaipopescu

0

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

Ось моє рішення:

Щоб створити комбінацію комбінацій клавіш, включаючи Alt, вам потрібно оголосити комбінацію в налаштуваннях> клавіатура та використовувати цю комбінацію у файлі налаштування vim (позначте опцію використання як мета-клавіші).

Вихідні дані повинні мати незвичний символ (наприклад, немає a), щоб ви не замінили звичайний символ.

У наведеному нижче прикладі ви зможете цілком попрацювати з ALT-Up.

налаштування vim: налаштування vim

налаштування mac: налаштування mac

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.