Який найзручніший спосіб роботи з різними клавіатурами in vim?


19

Мені іноді потрібно писати грецькі слова, але коли я використовую грецьку клавіатуру, натискання, скажімо, <C-p>буде розумітися як, <C-π>а не як команда, яку я маю намір. Це можна виправити за допомогою :map <C-p> <C-π>. Чи можу я це зробити для всіх листів, не складаючи список усіх?

PS. Складання списку всіх не дає ідеального результату. Наприклад, qє ;на Gr. клавіатура, але ми не хочемо робити карту; до q. Також чомусь ΖΖ (zeta zeta) не працює після :map Ζ Z. І команда, яку я визначив, \lwне працює як \λς.


2
Я думаю, що картографування - це не найкращий шлях: можливо, те, що ви шукаєте, це langmapваріант (див . Документ, який включає приклад грецького макета). Цей варіант насправді був розроблений, щоб допомогти працювати з не латинськими клавіатурами, такими як грецька чи кирилиця. Це дозволяє визначити пари символів, які будуть інтерпретуватися нормально у режимі вставки, але будуть замінені в інших режимах, можливо, це вам допоможе.
statox

@statox: Дякую! Я спробував використовувати колишню. але нічого не сталося У довідці йдеться про те, що vim повинен був відповідати параметру + langmap. Чи є простий спосіб перевірити, чи був він? Я використовую версію, яка постачається з Mac OS.
Зубник

1
Ви можете використовувати, :echo has('langmap')якщо у 1вас є, якщо у вас є, якщо 0ви цього не отримаєте .
statox

@statox: Дякую! Я оновив brew install vim --override-system-viі :echo has &cтепер повертається 1. ZZ працює. Проблема з \lv& c залишається.
Зубник

Я не розумію :echo has &cчастину, я не бачу, як вона пов’язана langmapтакож і після того, як у вас складений vim, langmapви повинні вказати зіставлення :set langmap=ΑA,ΒB,ΨC [...]у своєму vimrc.
statox

Відповіді:


6

Я б рекомендував keymap, що може вирішити вашу проблему. Покладіть їх у свій vimrc

" set keymap=greek_utf-8
set iminsert=0
set imsearch=-1

щоб вимкнути грецьку як за замовчуванням. Ви можете увімкнути параметр увімкнути (грецький) та вимкнути (англійський) за допомогою <ctrl>+^(ви також можете використовувати <ctrl>+6, він відображається на клавіші, а не на символі) у режимі вставки та в режимі заміни (не працює в Нормальний режим). Автоматичне відключення при виході з режиму вставки можна використовувати

inoremap <ESC> <ESC>:set iminsert=0<CR>

Більше про них

:h iminsert :h keymap :h imsearch :h i_CTRL-^


Редагувати до другого коментаря:

Ви можете спробувати це ввімкнути грецьку мову автоматично, якщо ввійти в режим вставки (і замінити режим), і автоматично вимкнутись, якщо виходите (тоді вам не потрібно згадане раніше відображення).

augroup Greek
    au InsertEnter * set iminsert=1
    au InsertLeave * set iminsert=0
augroup END

Чи справді потрібно вживати політонічну грецьку мову? Мені здається, що потрібне лише правильне кодування, а потім використовувати вбудований вхід MacOS X. Але це, мабуть, лише моє неправильне враження. Ви також можете переключитися на політонічну грецьку клавіатуру в MacOS X (і вивчити її, але я думаю, це не те, чого ви прагнете :-) Про відставання ἀ, може бути якесь відображення, спробуйте дізнатися :map >a, і якщо є , зніміть його :unmap >a. Як користувач, який не є грецьким, і не є MacO, я вже до кінця. Вибачте і удачі!
ryuichiro

10

Як я вже говорив у коментарях, відображення карт не створено для того, щоб робити те, що ви хочете робити. Цікавий варіант для цього випадку використання langmap.

Цей параметр дозволяє тримати поведінку або клавіатуру в режимі вставки та змінювати її поведінку в інших режимах.

Для його використання слід компілювати Vim +langmap, ви можете перевірити, чи цей параметр увімкнено echo has('langmap'): якщо команда повертає 1опцію включена ще, вам доведеться отримати налаштування з цим параметром увімкнено (щоб знати, як це зробити, це інше питання).

Якщо це ввімкнено, опція, наприклад, містить пари символів set langmap += à@, дозволить вам додати додаток àу свій буфер, коли ви перебуваєте в режимі вставки, і ви введете, àале введення àв звичайному режимі фактично запустить a @(цей приклад може бути корисним у azerty клавіатури для полегшення роботи з макросами).

Щоб використовувати langmap грецькою мовою, ви можете наслідувати приклад, доданий до :h 'langmap'цього рядка до свого vimrc (Копіювання цього рядка звідси може бути не дуже хорошою ідеєю, оскільки я дійсно не впевнений у кодуванні, мабуть, перетягуючи рядок безпосередньо з довідкового файлу, ймовірно, безпечніше) :

:set langmap=ΑA,ΒB,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ΜM,ΝN,ΟO,ΠP,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,ΥY,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,πp,qq,ρr,σs,τt,θu,ωv,ςw,χx,υy,ζz

Тепер, з того, що я розумію у ваших коментарях, залишається проблемою, коли ви намагаєтеся використовувати заздалегідь задані команди: коли ви вводите команду, поведінка режиму вставки буде спрацьовувати замість визначеної langmap поведінки. На жаль, я не впевнений, що у мене є гарне рішення для цього. Однією з ідей може бути переосмислення команд наприклад:

command λς lw

Таким чином, коли ви введете команду λς, яку виконає Vim, lwале я бачу кілька недоліків цього методу:

  • Це може бути величезним болем в області прикладу, щоб переглянути всі команди, які ви хочете використовувати.
  • Команди, визначені користувачем, повинні починатися з великої літери, і я тепер уявляю, як зручно це робити грецькою мовою.

Тож, можливо, плагін, запропонований @Alexander Myshov у своїй відповіді на це питання, може бути корисним (так як я ніколи не пробував жодного з них, я не знаю, чи вони вирішують проблему, але, здається, вони є).


1

Я регулярно набираю англійську та шведську мови. Шведська є меншою проблемою, яку потрібно вирішити, ніж грецька, оскільки вона лише розширює англійський алфавіт з кількома символами, але я думаю, що моє рішення можна передати на грецьку мову.

Раніше я перемикався за допомогою перемикача системної клавіатури моєї ОС. Проблема в цьому полягає в тому, що, як зазначив ОП, він розбиває цілу купу команд, оскільки в звичайному режимі кожна клавіша надсилає інший сигнал на Vim за допомогою неанглійської клавіатури. У шведській розкладки клавіатури, крім того, ціла купа НЕ-буквених символів переміщені , щоб звільнити місце для нових персонажів å, äі ö. Наприклад, }вводиться Alt-Shift-9 (відповідає вступним дужкам на англійській клавіатурі), а зворотна косої риски набирається з Alt-Shift-7. Таким чином, перехід на шведську розкладку клавіатури для вставки в модуль таким чином викликає цілу купу головних болів.

Моє рішення полягало в тому, щоб перевпорядкувати відповідні ключі лише у insertmode та загортати ці відображення у функції, щоб я міг легко перемикатися вперед і назад. Код нижче - як я це зробив у своєму .vimrc. Це лише додає потрібних мені символів до положення, яке вони мають у шведській розкладці клавіатури, залишаючи все інше. Щоб ввести символи, які маскуються ними ( ;, :, [, {, ", і '), я просто натисніть клавішу двічі. На щастя, лише дурним людям навіть потрібно набрати дваäs підряд. (Якщо це подвійне натискання не підходить, ви можете зіставити їх на Ctrl або щось подібне. Основний принцип полягає в тому, що символи, замасковані в масках, залишаються на своєму місці на клавіатурі, але один натискання клавіші видалено від реалізації. Мені це здається набагато простіше ніж їх переміщення.) Що означає, що коли я хочу набрати шведською мовою, я натискаю <Leader>s, що переходить на ці відображення і застосовує шведську перевірку орфографії. Для переключення назад я роблю <Leader>e.

Тепер для грецької мови це означатиме робити відображення для всього алфавіту, що насправді менше клопоту, ніж це звучить, як колись ви звалили принцип. При цьому складною частиною було б зняти всі ці зміни при переході на англійську мову. Можливо, хтось може придумати чудовий спосіб зробити це.

Я планую виконувати функцію вставки, на зразок наведених нижче для арабської, іншої мови, якою я часто вводяться. Я можу повернутися сюди, щоб повідомити про процес.

" Switch to Swedish
function! SweType()
  set spelllang=sv
  inoremap ; ö
  inoremap ;; ;
  inoremap : Ö
  inoremap :: :
  inoremap [ å
  inoremap { Å
  inoremap ' ä
  inoremap '' '
  inoremap " Ä
  inoremap "" "
  inoremap [[ [
  inoremap {{ {
endfunction
nmap <Leader>s :<C-U>call SweType()<CR>


" Switch to English
function! EngType()
  set spelllang=en_us
  inoremap ; ;
  iunmap ;;
  inoremap : :
  iunmap ::
  inoremap [ [
  iunmap [[
  inoremap { {
  iunmap {{
  inoremap ' '
  iunmap ''
  inoremap " "
  iunmap ""
endfunction
nmap <Leader>e :<C-U>call EngType()<CR>

1
Я можу помилятися, але я думаю, що ваша відповідь дозволяє легко отримати неанглійські символи в режимі вставки, тоді як проблема ОП полягала в тому, щоб легко отримати англійські символи в інших режимах, ніж у режимі вставки. Я не впевнений, що ваша відповідь вирішує початкову проблему. Але ідея ввімкнення / відключення відображень є досить цікавою.
statox

@statox Ну, можливо, я неправильно зрозумів це питання, але якщо проблема полягає в тому, щоб легко вставити неанглійські символи в insertmode, зберігаючи функції normalmode, я вважаю, що моє питання хоча б намагається вирішити цю проблему.
Андреас

Вибачте, що я не мав на увазі образитись: я вказував, що між питанням і вашою відповіддю може бути розрив, але, звичайно, ви намагаєтеся вирішити проблему, і, як я вже сказав, мені дуже подобається, що ідеї функцій дозволяють і відключення відображень. Я справді не заперечував вашої відповіді, і мені дуже шкода, що це звучало.
statox

1
@statox Не ображено. І якби ти заперечив мою відповідь, все було б у доброму порядку.
Андреас

1

Я також набираю дві мови: російську та англійську. І тепер я використовую цей плагін https://github.com/lyokha/vim-xkbswitch . Цей плагін має залежність від натиснутого перемикача розкладки клавіатури, для Mac OS X можна використовувати шахтний https://github.com/myshov/xkbswitch-macosx .

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