vim에서 다른 키보드로 작업하는 가장 편리한 방법은 무엇입니까?


18

때때로 그리스어 단어를 작성해야하지만 그리스어 키보드를 사용할 때 때리는 말 <C-p><C-π>내가 의도 한 명령이 아니라 이해하는 것 입니다. 로 고정시킬 수 있습니다 :map <C-p> <C-π>. 모든 목록을 작성하지 않고 모든 문자에 대해이 작업을 수행 할 수 있습니까?

추신. 모든 목록을 작성한다고해서 완벽한 결과가 나오지는 않습니다. 예를 들면, q이다 ;할머니에. 키보드, 그러나 우리는 매핑하고 싶지 않습니다; q로 또한 어떤 이유로 ΖΖ (zeta zeta)가 작동하지 않습니다 :map Ζ Z. 그리고 내가 정의한 명령 \lw은으로 작동하지 않습니다 \λς.


2
필자는 매핑이 좋은 방법이 아니라고 생각합니다. 아마도 찾고있는 langmap옵션 이 있습니다 ( 그리스 레이아웃에 대한 예제가 포함 된 문서 참조 ). 이 옵션은 실제로 그리스어 나 키릴 릭과 같은 라틴어가 아닌 키보드를 처리하는 데 도움을주기 위해 만들어졌습니다. 삽입 모드에서는 일반적으로 해석되지만 다른 모드에서는 대체 될 기호 쌍을 정의 할 수 있습니다. 어쩌면 이것이 도움이 될 것입니다.
statox

@statox : 감사합니다! 전 ex를 사용해 보았습니다. 그러나 아무 일도 일어나지 않았습니다. 도움말은 vim이 + langmap 옵션을 준수해야한다고 말합니다. 그것이 있는지 확인하는 쉬운 방법이 있습니까? Mac OS와 함께 제공되는 버전을 사용하고 있습니다.
Toothrot

1
당신 :echo has('langmap')1당신이 그것을 0하지 않으면 그것을 가지고 있으면 사용할 수 있습니다 .
statox

@statox : 감사합니다! 나는 업데이트 brew install vim --override-system-vi:echo has &c지금 1 ZZ 작품을 반환합니다. \lv& c 의 문제점은 남아 있습니다.
Toothrot

나는 :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 입력을 사용하는 것 같습니다. 그러나 이것은 아마도 내 잘못된 인상 일 것입니다. 또한 맥 OS X에서 polytonic 그리스어 키보드로 전환 (및 그것을 배울,하지만 난 당신이 무엇을 추구 :-) ἀ의 지연에 대해없는 추측에 의해 찾으려고, 일부 매핑이있을 수 있습니다 :map >a이있는 경우, 그리고 으로 매핑을 해제하십시오 :unmap >a. 그리스 및 비 MacO 사용자는 이미 사용하고 있습니다. 미안하고 행운을 빕니다!
ryuichiro

10

주석에서 말했듯이 매핑은 원하는 작업을 수행하도록 설계되지 않았습니다. 이 사용 사례에 대한 흥미로운 옵션은 langmap입니다.

이 옵션을 사용하면 동작 또는 키보드를 삽입 모드로 유지하고 다른 모드에서 동작을 변경할 수 있습니다.

이를 사용하려면 Vim을로 컴파일 +langmap해야합니다.이 옵션이 활성화되어 있는지 확인할 수 있습니다 echo has('langmap'). 명령 1이 옵션을 반환 하면 그렇지 않은 경우이 옵션을 활성화하여 설정을 가져와야합니다 (방법을 알려면 또 다른 질문입니다).

활성화되면 옵션은 문자 쌍을 사용합니다. 예를 들어 삽입 모드에있을 때 버퍼 set langmap += à@에 a를 추가 할 수 있으며 a àà입력하지만 à일반 모드로 입력 하면 실제로 a가 트리거됩니다 @(이 예는 아제 라이트에 유용 할 수 있음) 매크로를 쉽게 사용할 수있는 키보드).

그리스어에서 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

나는 영어와 스웨덴어로 정기적으로 입력합니다. 스웨덴어는 그리스어보다 해결하기가 더 작은 문제입니다. 영어 문자는 몇 자로 만 확장되기 때문에 내 솔루션을 그리스어로 옮길 수 있다고 생각합니다.

OS의 시스템 키보드 스위치를 사용하여 전환했습니다. OP의 지적에 따르면, 일반 모드에서는 각 키가 영어가 아닌 키보드를 사용하여 Vim에 다른 신호를 보내므로 많은 명령이 끊어집니다. 스웨덴 키보드 레이아웃에서, 또한, 비 알파벳 문자의 전체 무리는 새로운 캐릭터에 대한 방법을 만들기 위하여 이동 å, äö. 예를 들어, 영어 키보드 }여는 괄호와 일치하는 Alt-Shift-9 로 입력하고 Alt-Shift-7으로 백 슬래시를 입력합니다. 삽입 모드에 대한 바닐라 스웨덴어 키보드 레이아웃으로 전환하면 많은 두통이 발생합니다.

내 솔루션은 삽입 모드에서만 관련 키를 다시 매핑 하고이 매핑을 함수로 래핑하여 쉽게 전환 할 수있었습니다. 아래 코드는 내에서 어떻게했는지 .vimrc입니다. 이것은 스웨덴어 키보드 레이아웃에서 필요한 위치에 필요한 문자 만 추가하고 나머지는 그대로 둡니다. 그들에 의해 마스크되는 문자를 입력하기 위해 ( ;, :, [, {, ",과 '), 단순히 키를 두 번 누르십시오. 운 좋게도 바보 같은 사람들조차 2를 입력하면됩니다ä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
나는 틀릴 수도 있지만 귀하의 답변에 따라 삽입 모드에서 영어가 아닌 문자를 쉽게 얻을 수 있지만 OP의 문제는 삽입 모드 이외의 다른 모드에서 영어 문자를 쉽게 얻는 것이 었습니다. 귀하의 답변이 초기 문제를 해결했는지 잘 모르겠습니다. 여전히 함수 활성화 / 비활성화 매핑에 대한 아이디어는 매우 흥미 롭습니다.
statox

@statox 글쎄, 나는 질문을 오해했을 수도 있지만, 문제가 일반 모드 기능을 유지하면서 영어 이외의 문자를 insertmode에 쉽게 삽입하는 것이라면 적어도 내 문제는 그 문제를 해결하려고 시도한다고 생각합니다.
Andreas

유감스럽게 생각하지 않아서 죄송합니다. 질문과 답변 사이에 틈이 있었을 수도 있지만 물론 문제를 해결하려고 시도하고 말했듯이 기능 활성화 아이디어가 정말 마음에 들었습니다. 매핑을 비활성화합니다. 나는 당신의 대답을 부정하지 않았으며 그것이 실제로 그렇게 들린 것에 대해 유감스럽게 생각합니다.
statox

1
@statox 범죄가 없습니다. 그리고 당신이 내 대답을 부인했다면 그것은 모두 정상적 일 것입니다.
Andreas

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.