맥에서 키보드 입력소스 전환 (한영전환) 딜레이 해결 차선책

   맥에서 한글/영문 전환하는 방법은 여러가지 방법이 존재한다.   어떤 사람은 CapsLock 버튼을 사용하는 경우도 있고 어떤 사람은 CMD + SpaceBar 를 사용하는 사람, Fn 키를 이용하는 사람... OSX의 버전 변화에 따라서 그 방법도 여러가지로 변해 왔다.
   나의 경우엔 오른쪽 CMD 키를 한/영 전환으로 하기 위해서 BTT에서 오른쪽 CMD키를 F13으로 매칭시키고 시스템 설정에서 키보드 입력소스 변환 방법을 F13으로 사용했다.   그럼에도 불구하고 한영 전환이 안되는 경우가 종종 발생하고 되더라도 딜레이 때문에 폭풍 키보드 타이핑에 짜증을 유발 시키는 경우가 종종 발생했다.   그래서 다른 방법을 찾고자 고민하다가 완벽하지는 않지만 그나마 괜찮은 방법으로 im-select 라는 어플리케이션을 사용하면서 Shell Script를 BTT의 단축키와 연결하는 방법으로 현재 사용하고 있다.   그래도 내가 원하는 수준의 속도로 한/영 전환이 이루어지는 것은 아니지만 기존에 사용하던 방법보다는 확실히 오타가 적게 나오는 방법이게 그 방법을 소개 해 보려고 한다.
   먼저 BTT(BetterTouchTool) 또는 Karabiner-Elements가 설치가 되어 있다는 전재로 이야기 할 것이다.   BTT는 유료 어플로 TouchBar나 Magic Mouse 활용도를 높이기 위해서 많이 사용하는 어플인데 그 기능이 다양하다 보니 나의 경우엔 키보드 단축키 활용으로도 사용하고 있다.   단순하게 키보드 조정을 위해서 사용한다면 보다 가벼운 Karabiner-Elements 도 대안이 될 수 있다.   방법이야 다소 다르지만 Shell Scipt를 실행해서 현재 입력소스를 Toggle 로 한/영 변환 하는 방법은 동일하니 어떤 것을 사용할지는 사용자의 몫이다.
  반응 속도는 아무래도 Karabiner-Elements가 더 빠르다.   BTT의 경우엔 다소 운영이 무겁다.   그렇다 보니 타이핑이 빠른 상태에서 순간순간 언어전환을 하는 스크립트를 실행하는게 살짝 딜레이가 생긴다.   그에 비해 Karabiner-Elements는 거의 전환 속도를 느끼지 못할 만큼 빠르다.
   어쨌든 여기서 중요한 것은 im-select를 사용하는 방법과 그것을 활용해서 Shell Script로 키보드 입력 소스를 변경한다는 것이다.

   im-select 가 무엇인지 간단하게 설명하겠다.
   정식 사이트는 GitHub에 있다.  https://github.com/daipeihust/im-select/tree/master

 

GitHub - daipeihust/im-select: 📟 Switch your input method through terminal

📟 Switch your input method through terminal. Contribute to daipeihust/im-select development by creating an account on GitHub.

github.com

   im-select는 현재 활성화된 입력 메소드(Keyboard Input Source)를 설정하고 관리하는 Utility 이다.   윈도우, 리눅스 , OSX를 지원하고 있고 OSX의 경우에는 brew를 통해서 간단하게 설치 할 수 있다.

   1. brew 를 통한 im-select 설치

brew tap daipeihust/tap
brew install im-select


   2. 입력소스 전환 Shell Script 작성 (vi 사용)

vi /usr/local/bin/toggle_input.sh



current_input=$(/opt/homebrew/bin/im-select)

if [ "$current_input" = "com.apple.keylayout.ABC" ]; then
    /opt/homebrew/bin/im-select com.apple.inputmethod.Korean.2SetKorean
else
    /opt/homebrew/bin/im-select com.apple.keylayout.ABC
fi

   만약 위의 shell을 실행했을 때 한/영 전환이 정상적이지 않다면 현재 입력 상태를 표기하는 값을 출력해보고 표기되는 값으로 스크립트 내용을 자신의 환경에 맞게 수정하자.   현재의 입력 소스를 출력하는 방법은 앞서 설치된 im-select를 실행하면 된다.   아래의 Capture에서 보는 것처럼 처음에는 영문상태에서 im-select를 실행했고 두번째는 한글 상태에서 실행한 것이다.   사용자별로 어떤 경우에는 com.apple.keylayout.ABC 대신에 com.apple.keylayout.US 인 경우도 있을 수 있기 때문에 확인해보고 해당 입력 소스 이름으로 위의 스크립트를 수정해주면 된다.




   3. 권한 설정

sudo chmod +x /usr/local/bin/toggle_input.sh

   일단 위의 3가지 과정을 통해서 im-select 설치 및 해당 유틸을 사용해서 한/영 전환 Script를 작성했다.   이제 생성한 toggle_input.sh 스크립트를 키보드의 특정키와 연결하여 한/영 전환 기능을 구현하면 된다.   이 글에서는 오른쪽 Command 키를 한/영 전환 키로 해서 설정하도록 하겠다.


Karabiner-Elements를 이용한 Shell Script 실행 키매핑

[ Karabiner-Elements 실행 및 Complex Modifications 선택 ]

   위의 Capture에서 처럼 Karabiner-Elements를 실행하고 Complex Modifications를 선택하면 "Add your own rule" 이라는 버튼을 볼 수 있다.   해당 버튼을 눌러 새로은 규칙을 만들고 아래의 스크립트를 입력한다.  그리고 저장.

{
    "description": "Run Shell Script with Right Command",
    "manipulators": [
        {
            "from": {
                "key_code": "right_command"
            },
            "to": [
                {
                    "shell_command": "sh /usr/local/bin/toggle_input.sh"
                }
            ],
            "type": "basic"
        }
    ]
}

[ Script 작성 후 저장 ]

   뭐 Script는 설명할 내용도 없다.   오른쪽 Command 키가 눌리면 해당 쉘을 실행하라는 내용이다.   저장 즉시 적용이 된다.

 

BTT(BetterTouchTool)를 이용한 방법

[ 메뉴바에서 BTT 항목중 구성을 선택 ]

   

[ Key Sequences 설정]
[ 키보드 입력을 대기중인 상태 ]
[ 오른쪽 Command 키를 눌렀다 떼면 위의 사진처럼 기록된다. ]

   위의 Capture 에서는 "Start Recording" 이라고 되어 있지만 실제로는 "Stop Recording"이라고 되어 있을 것이다.   캡쳐를 위해서 Recording을 멈춘 상태라서 위의 캡쳐처럼 표기 되었을 뿐이다.   "Save"를 눌러주면 저장된다.   다음으로 넘어가자.

[ 오른쪽 Command 키가 눌렸을 때 실제 작동될 트리거를 작성할 차례이다. ]
[ 동작 없음 버튼에서 "다른 응용 프로그램 제어하기" 내용 중 "쉘 스크립트 작업/실행"을 선택한다. ]
[ Run Script Now 버튼 옆의 Pop-Up 버튼을 누르면 스크립트 입력창이 뜬다. ]
[ 실행할 스크립트를 입력 후 "Run Scipt Now"를 해보면 입력 소스 전환이 이루어진다. ]

current_input=$(/opt/homebrew/bin/im-select)

if [ "$current_input" = "com.apple.keylayout.ABC" ]; then
    /opt/homebrew/bin/im-select com.apple.inputmethod.Korean.2SetKorean
else
    /opt/homebrew/bin/im-select com.apple.keylayout.ABC
fi

 

   입력소스 전환하는 방법으로 im-select 를 설치하고 BTT 또는 Karabiner-Elements를 사용해서 Shell Script를 구동해서 한/영 전환 작업이 실행되도록 하는 방법을 알아 봤다.   두가지 다 설정해보고 실행해본 결과 Karabiner-Elements의 속도가 월등하다는 결론이 났다.   BTT의 경우엔 TouchBar나 Magic Mouse의 사용자화를 위해서는 아주 훌륭하지만 키보드 관련해서는 그 속도가 Karabiner-Elements에 비해 느리기 때문에 한/영 전환 같은 빠른 실행이 이루어져야 하는 케이스라면 Karabiner-Elements 사용을 권하고 싶다.

 

** 추가적으로 im-select 대신에 직접 object-c 로 코드작성해서 compile 하는 방법도 있다.  

vi toggle_input2.m

clang -framework Foundation -framework Carbon -o toggle_input2 toggle_input2.m
#import <Foundation/Foundation.h>
#import <Carbon/Carbon.h>

// Function to toggle input source between Korean and English
void toggleInputSource() {
    // Get current input source
    TISInputSourceRef currentSource = TISCopyCurrentKeyboardInputSource();
    CFStringRef currentID = TISGetInputSourceProperty(currentSource, kTISPropertyInputSourceID);
    CFRelease(currentSource);
    
    // Define target input source IDs
    CFStringRef targetID;
    if (CFStringCompare(currentID, CFSTR("com.apple.keylayout.ABC"), 0) == kCFCompareEqualTo) {
        // If current input is English, switch to Korean
        targetID = CFSTR("com.apple.inputmethod.Korean.2SetKorean");
    } else if (CFStringCompare(currentID, CFSTR("com.apple.inputmethod.Korean.2SetKorean"), 0) == kCFCompareEqualTo) {
        // If current input is Korean, switch to English
        targetID = CFSTR("com.apple.keylayout.ABC");
    } else {
        // If current input is neither, default to English
        targetID = CFSTR("com.apple.keylayout.ABC");
    }
    
    // Create dictionary with target input source
    NSDictionary *properties = @{ (__bridge NSString *)kTISPropertyInputSourceID : (__bridge NSString *)targetID };
    CFArrayRef sources = TISCreateInputSourceList((__bridge CFDictionaryRef)properties, TRUE);
    if (sources) {
        TISInputSourceRef source = (TISInputSourceRef)CFArrayGetValueAtIndex(sources, 0);
        OSStatus status = TISSelectInputSource(source);
        if (status != noErr) {
            NSLog(@"Failed to select input source.");
        }
        CFRelease(sources);
    } else {
        NSLog(@"Failed to get input source list.");
    }
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        toggleInputSource();
    }
    return 0;
}

   GitHub에 있는 im-select의 Source를 보니 크게 다르지 않다.   결국 속도면에서 별반 차이가 없을 것이라는 결론이다.   직접 코드를 작성해서 컴파일해서 사용할 것이냐... 다운 받아서 쓸것이냐의 차이 정도다.