Jaki jest najwygodniejszy sposób pracy z różnymi klawiaturami w vimie?


19

Czasami muszę pisać greckie słowa, ale kiedy używam greckiej klawiatury, uderzenie, powiedzmy, <C-p>będzie rozumiane jako, <C-π>a nie jako polecenie, które zamierzam. Można to naprawić za pomocą :map <C-p> <C-π>. Czy mogę to zrobić dla wszystkich liter bez sporządzania listy wszystkich?

PS. Sporządzenie listy wszystkich nie daje idealnego rezultatu. Np. qJest ;na Gr. klawiatura, ale nie chcemy mapować; do q. Z jakiegoś powodu ΖΖ (zeta zeta) nie działa po :map Ζ Z. A polecenie, które zdefiniowałem, \lwnie działa jako \λς.


2
Myślę, że mapowanie nie jest dobrym rozwiązaniem: być może to, czego szukasz, to langmapopcja (zobacz dokument zawierający przykład greckiego układu). Ta opcja została stworzona, aby pomóc w radzeniu sobie z klawiaturami niełacińskimi, takimi jak grecki lub cyryliczny. Pozwala zdefiniować pary symboli, które będą interpretowane normalnie w trybie wstawiania, ale zostaną zastąpione w innych trybach, być może to ci pomoże.
statox

@statox: Dzięki! Próbowałem użyć ex. ale nic się nie stało. Pomoc mówi, że vim musiał być zgodny z opcją + langmap. Czy istnieje prosty sposób, aby to sprawdzić? Używam wersji dostarczonej z systemem Mac OS.
Toothrot,

1
Możesz użyć, :echo has('langmap')jeśli 1go masz, jeśli go nie 0masz.
statox

@statox: Dzięki! Zaktualizowałem brew install vim --override-system-vii :echo has &cteraz zwraca 1. ZZ działa. Problem z \lv& c pozostaje.
Toothrot,

Nie rozumiem tej :echo has &cczęści, nie widzę związku z nią langmaprównież po skompilowaniu vima langmap, musisz określić odwzorowania :set langmap=ΑA,ΒB,ΨC [...]w swoim vimrc.
statox

Odpowiedzi:


6

Poleciłbym keymap, który może rozwiązać twój problem. Umieść je w swoim vimrc

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

aby domyślnie wyłączyć język grecki. Możesz przełączać tę opcję na (grecki) i wyłączony (angielski) za pomocą <ctrl>+^(możesz także użyć <ctrl>+6, jest mapowany na klucz, a nie na symbol) w trybie wstawiania i trybie zastępowania (nie działa w Tryb normalny). Aby automatycznie wyłączyć przy wychodzeniu z trybu wstawiania, możesz użyć

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

Więcej na ten temat

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


EDYTUJ do drugiego komentarza:

Możesz spróbować włączyć automatycznie język grecki, jeśli wejdziesz w tryb wstawiania (i zastąp tryb), i automatycznie wyłączysz, jeśli wyjdziesz (wtedy nie potrzebujesz wspomnianego wcześniej mapowania).

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

Czy naprawdę konieczne jest używanie greckiego politonic? Wydaje mi się, że potrzebne jest tylko właściwe kodowanie, a następnie użycie wbudowanego wejścia MacOS X. Ale to chyba tylko moje złe wrażenie. Możesz także przełączyć się na grecką klawiaturę polytonic w MacOS X (i naucz się jej, ale myślę, że nie jest to, czego szukasz :-) Jeśli chodzi o opóźnienie ἀ, może być jakieś mapowanie, spróbuj się dowiedzieć :map >a, a jeśli jest , usuń mapowanie przez :unmap >a. Jako użytkownik nie będący Grekiem i nie będący użytkownikiem MacO jestem już na dobrej drodze. Przepraszam i powodzenia!
ryuichiro

10

Jak powiedziałem w komentarzach, odwzorowania w nie są przeznaczone do robienia tego, co chcesz. Interesującą opcją dla tego przypadku użycia jest langmap.

Ta opcja pozwala zachować zachowanie lub klawiaturę w trybie wstawiania i zmienić jej zachowanie w innych trybach.

Aby z niego skorzystać, należy skompilować Vima +langmap, możesz sprawdzić, czy ta opcja jest włączona za pomocą echo has('langmap'): jeśli polecenie zwróci, 1opcja jest włączona, inaczej będziesz musiał uzyskać konfigurację z włączoną tą opcją (aby wiedzieć, jak to zrobić, to to kolejne pytanie).

Gdy jest włączona, opcja bierze pary znaków, na przykład set langmap += à@pozwala na dodanie znaku àw buforze, gdy jesteś w trybie wstawiania, a wpisanie a, àale wpisanie àw trybie normalnym spowoduje wyzwolenie @znaku (ten przykład może być przydatny w przypadku azerty klawiatury, aby ułatwić pracę z makrami).

Aby użyć langmapy w języku greckim, możesz postępować zgodnie z przykładem podanym podczas :h 'langmap'dodawania tej linii do twojego vimrc (Kopiowanie tej linii z tego miejsca może nie być dobrym pomysłem, ponieważ tak naprawdę nie jestem pewien co do kodowania, prawdopodobnie wyrwanie linii bezpośrednio z pliku pomocy jest prawdopodobnie bezpieczniej) :

: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

Teraz z tego, co rozumiem w twoich komentarzach, pozostaje problem, gdy próbujesz użyć predefiniowanych poleceń: po wpisaniu polecenia wyzwalane jest zachowanie trybu wstawiania zamiast zachowania zdefiniowanego w mapie langmap. Niestety nie jestem pewien, czy mam na to dobre rozwiązanie. Jednym z pomysłów może być przedefiniowanie poleceń, na przykład:

command λς lw

W ten sposób po wpisaniu polecenia λςVim wykona polecenie , lwale widzę kilka wad tej metody:

  • Ponowne zdefiniowanie wszystkich poleceń, których chcesz użyć, może być ogromnym problemem.
  • Polecenia zdefiniowane przez użytkownika muszą zaczynać się od dużej litery, a teraz mam pomysł, jak wygodne jest to robić w języku greckim.

Być może więc wtyczka zaproponowana przez @Alexandra Myszkowa w odpowiedzi na to pytanie może być przydatna (ponieważ nigdy nie próbowałem żadnej z nich, nie wiem, czy rozwiązały problem, ale wygląda na to, że tak).


1

Piszę regularnie po angielsku i szwedzku. Szwedzki jest mniejszym problemem do rozwiązania niż grecki, ponieważ rozszerza alfabet angielski tylko o kilka znaków, ale myślę, że moje rozwiązanie można przenieść na grecki.

Przełączałem się za pomocą przełącznika klawiatury systemowej mojego systemu operacyjnego. Problem polega na tym, jak zauważył OP, że łamie całą masę poleceń, ponieważ w trybie normalnym każdy klawisz wysyła kolejny sygnał do Vima za pomocą nieanglojęzycznej klawiatury. W układ klawiatury szwedzkiej zresztą cała masa znaków alfabetycznych nie są przenoszone, aby zrobić miejsce dla nowych znaków å, äi ö. Na przykład }jest pisany za pomocą Alt-Shift-9 (pasujący do nawiasu otwierającego na angielskiej klawiaturze), a odwrotny ukośnik jest pisany za pomocą Alt-Shift-7. Przejście na waniliowy szwedzki układ klawiatury dla insertmode powoduje więc wiele problemów.

Moim rozwiązaniem było ponowne mapowanie odpowiednich kluczy tylko w trybie insertm i zawinięcie tych mapowań w funkcję, aby móc łatwo przełączać się tam iz powrotem. Poniższy kod pokazuje, jak to zrobiłem .vimrc. Dodaje to tylko potrzebne mi znaki do pozycji w szwedzkim układzie klawiatury, pozostawiając wszystko inne. Aby wpisać znaki, które są maskowane przez nich ( ;, :, [, {, ", i '), po prostu uderzyć dwa razy klawisz. Na szczęście tylko głupi ludzie muszą nawet wpisać dwaäs z rzędu. (Jeśli to podwójne uderzenie nie jest odpowiednie, możesz zmapować je na Ctrl lub coś w tym rodzaju. Podstawową zasadą jest to, że zamaskowane postacie pozostają na swoim miejscu na klawiaturze, ale jedno naciśnięcie klawisza zostaje usunięte z realizacji. Uważam, że jest to o wiele łatwiejsze niż ich przenoszenie.) Co oznacza, że ​​kiedy chcę pisać po szwedzku, klikam <Leader>s, co powoduje przełączenie na te mapowania i zastosowanie sprawdzania pisowni w języku szwedzkim. Aby wrócić, robię to <Leader>e.

W przypadku języka greckiego oznaczałoby to wykonanie mapowań dla całego alfabetu, co w rzeczywistości jest mniej kłopotliwe, niż się wydaje, gdy zasada zostanie zniesiona. W takim razie trudną częścią byłoby odwzorowanie wszystkich tych zmian po przejściu na angielski. Być może ktoś może wymyślić sprytny sposób na zrobienie tego.

Planuję wykonać funkcję wstawiania, taką jak poniżej, dla języka arabskiego, innego języka, który często wpisuję. Mogę tu wrócić, aby zgłosić proces.

" 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
Mogę się mylić, ale myślę, że twoja odpowiedź pozwala łatwo uzyskać znaki inne niż angielski w trybie wstawiania, podczas gdy problemem OP było łatwe uzyskanie znaków angielskich w innych trybach niż tryb wstawiania. Nie jestem pewien, czy twoja odpowiedź dotyczy pierwotnego problemu. Mimo to pomysł włączania / wyłączania mapowań funkcji jest dość interesujący.
statox

@statox Cóż, mogłem źle zrozumieć pytanie, ale jeśli problem polega na łatwym wstawianiu znaków innych niż angielski w trybie insertu przy jednoczesnym zachowaniu funkcji trybu normalnego, uważam, że moje pytanie przynajmniej próbuje rozwiązać ten problem.
Andreas

Przepraszam, że nie chciałem się obrazić: zwróciłem uwagę, że może być luka między pytaniem a twoją odpowiedzią, ale oczywiście próbujesz rozwiązać problem i, jak powiedziałem, bardzo podoba mi się pomysł włączenia funkcji i wyłączanie mapowań. Naprawdę nie odmawiałem twojej odpowiedzi i bardzo mi przykro z tego powodu.
statox

1
@statox Bez przestępstwa. A gdybyś odmówił mojej odpowiedzi, wszystko byłoby w porządku.
Andreas

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.