nvim 안에서 한영전환 하기

바깥 단축키가 작동하지 않을 때 Vim 안에서 입력기 간 전환을 해보자

나는 macOS에서 구름입력기를 사용한다. 이유는 두 가지다.

  1. 내장입력기의 입력기 간 전환이 마음에 들지 않았다. Select the previous input source를 하면 입력기 전환창이 뜨며 약간의 딜레이가 발생하고, Select the next input source를 하면 딜레이는 없지만, 등록된 모든 입력기를 차례로 돌게 된다.

  2. esc키를 누르면 자동으로 쿼티 자판으로 전환되는 기능이 좋았다. 하지만 이 이유는 거의 의미없는 게, hammerspoon을 이용하면 내장 입력기에서도 esc로 쿼티 전환이 가능하다.

구름입력기의 한영전환 단축키로 손에 익은 Shift-Space를 등록했다. 하지만 문제가 있었는데, 먼저 iTerm2로 연 Neovim에서 확률적으로 한영전환이 되지 않았다. Neovim에서 키 입력을 먹어버리는지, Shift-Space를 누르면 한영전환이 되지 않고 스페이스만 입력되는 것이었다. (Neovim 바깥은 큰 문제는 일어나지 않았던 것 같다)

주석을 한국어로 써야하거나, 이렇게 블로그 글을 쓸 때 Vim 속 한글 입력이 필요했던 나는 확률적인 입력에 화가 나기 시작했다. 구름입력기의 이슈에서 추천한대로 iTerm2의 Profiles>Keys>Key Mappings에서 Shift-Space의 Action을 Remap Modifiers in iTerm2 Only로 등록해보았으나 항목 직후에는 작동하고 시간이 좀 지나면 또 작동하지 않았다.

한영키가 작동하지 않을 때마다 iTerm2 설정을 들락날락하며 살던 나는 어제 결심하게 되었다.

Neovim이 한영전환키를 먹어버린다면, Neovim 안에서 한영전환키를 설정하자!

입력기 전환과 빔 등의 키워드로 구글링해보니, 입력기 관련 플러그인 vim-xkbswitch가 있었다. 하지만 나는 그저 ‘한영전환’을 원할 뿐인데 플러그인에서 제공하는 기능이 많았고, 개발자가 러시아어권 사람인지 키릴 문자를 기본적으로 제공하고 다른 자판은 따로 추가해줘야 했다. 설정 얼마 안 걸릴 거 같은데 갑자기 급 귀차니즘이 와버렸다…

그래서 이 플러그인이 사용하는 입력기 전환 유틸리티만 쏙 빼와서 원하는대로 설정하기로 마음 먹었다.


입력기 전환 툴 설치

xiehuc/xkbswitch-macosx는 커맨드라인을 통해

  1. 현재 입력기 이름 가져오기
  2. 등록된 입력기 이름 모두 가져오기
  3. 입력기 설정하기

를 수행할 수 있다. 아래 명령어들을 입력해 설치 및 빌드하자.

(원본 myshov/xkbswitch-macosx는 M1 macos를 지원하지 않는다.)

적당한 작업 디렉터리(내 경우에는 ~/workspace/) 또는 다운로드 디렉터리(~/Downloads/)에서

1
2
3
git clone https://github.com/xiehuc/xkbswitch-macosx
cd xkbswitch-macosx
make

를 입력하면, 해당 위치에 xkbswitch 실행 파일이 생긴다. 그 파일을 /usr/local/bin/으로 복사하자. 만약 선호하는 $PATH가 있다면 그곳으로 옮겨도 된다.

1
cp xkbswitch /usr/local/bin

이제 xkbswitch-macosx 디렉터리 바깥으로 나가서 작동을 실험하자.

1
xkbswitch -g # 현재 입력기 확인

현재 입력기의 이름이 나오면 성공이다. xkbswitch-macosx 디렉터리는 이제 필요없으니 지우든 삶아먹든 알아서 하자.

라이브러리 설치

libxkbswitch-macosx는 vim에서 xkbswitch를 쉽게 불러와서 쓰기 위한 동적 라이브러리다. 내가 포크한 레포지토리 클론해서 bin 안에 있는 라이브러리를 /usr/local/lib/로 복사하자. ~/scripts/에 넣어놓는 걸 시도해보기도 했는데, 이상하게 파일이 멀쩡히 그 자리에 있는데 찾질 못하더라. 만약 보안 문제가 발생하면 직접 make 입력하면 새로 빌드된다.

설치한 xkbswitch를 Vim에서 사용하기 위해서는 Vim상에서 :!xkbswitch 어쩌구로 명령어를 바로 실행시킬 수도 있지만, xkbswitch-macosx 측에서 기본 제공하는 동적 라이브러리를 사용하는 방법도 있다. 명령어 바로 실행과 비교했을 때 얻는 이점이 무엇인지는 잘 모르겠지만, 제공해주니 감사하게 여기고 써보자.

위의 유틸리티처럼, 이 라이브러리 역시 원본 레포지토리에서는 Apple Slicon 맥을 지원하지 않아서 직접 포크했다.

JedBeom/libxkbswitch-macosx

1
2
git clone https://github.com/JedBeom/libxkbswitch-macosx
cp libxkbswitch-macosx/bin/libxkbswitch.dylib /usr/local/lib

위 줄을 입력해 lib 디렉터리로 옮겼으면 준비 완료.

네오빔 설정

vim-xkbswitch 플러그인을 사용하는 방법도 있긴한데, 나는 한영전환이 목표고, 그 플러그인은 키릴문자 지원이 우선에다가 너무 많은 기능이 있어보여서 직접 한영전환을 init.lua에 쓰기로 한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
local xkblib = '/usr/local/lib/libxkbswitch.dylib' -- libxkbswitch.dylib 파일 위치
local input_source_ko = 'org.youknowone.inputmethod.Gureum.han2' -- 한글 입력기
local input_source_en = 'org.youknowone.inputmethod.Gureum.system' -- 로마자 입력기
local input_source_toggle_key = '<S-Space>' -- 한영전환키 (기본: Shift Space)

local libcall = function (lib, func, arg)
	return vim.fn['libcall'](lib, func, arg)
end

local get_xkb_layout = function ()
	return libcall(xkblib, 'Xkb_Switch_getXkbLayout', '')
end

local set_xkb_layout = function (layout)
	libcall(xkblib, 'Xkb_Switch_setXkbLayout', layout)
end

local toggle_input_sources = function () 
	local current_input_source = get_xkb_layout()
	if current_input_source == input_source_ko..'\n' then
		set_xkb_layout(input_source_en)
	else
		set_xkb_layout(input_source_ko)
	end
end

vim.keymap.set('i', input_source_toggle_key, toggle_input_sources, {silent=true})

상황에 맞게 첫 네줄의 값을 바꾸도록 하자. 위 글을 똑같이 따라하고 구름입력기를 사용한다면 사용하는데 문제가 없을 것이다.

댓글을 불러올까요?