Espanso: 몇가지 알아낸 사항들 정리.

며칠 Espanso 를 쓰면서, 아직 문서화되지 않았으나 실제로는 사용되고 있는 내용들을 정리해본다.

Filter Exec/Class 와 Title 동시 사용? -> AND 연산

Espanso 의 filter 는 따로 설명되고 있긴 한데, 필터 두가지를 동시에 쓸 때 어떤 동작을 하는지는 설명이 없다. (23년 4월 현재)
filter_execfilter_class 는 크게 다르지 않으므로, 동시에 쓰는 의미가 없다. 이 둘과, filter_title 을 조합했을 때 새로운 가치(?)가 창출될 수 있다.

예를 들어, Firefox, 사생활 보호 모드에서만 Espanso 가 작동하게끔 하고 싶다면?? 이럴 때 이 두 가지를 섞으면 된다. 그 결과, class 가 firefox 이고(AND), 동시에 title 이 사생활 보호 모드인 창에서만 Espanso 가 효력을 나타내게 된다.

# macOS
#filter_class: 'org.mozilla.firefox'

# Linux
filter_class: 'firefox'

filter_title: '사생활 보호 모드$|Private Browsing$'

macOS 와 Linux 에서 class 가 다르므로 적절히 선택하면 된다. class/exec 어떤 것을 써도 무방하다.
다시 말하면, class/exec 와 title 을 동시에 썼을 때, AND 연산이 된다는 사실이 중요하다.

Filter 가 중복되었다면?

Espanso 는 config 디렉토리 내에 yml 파일을 여러 개 만들 수 있다. 그러다보면, 설정(필터 포함)이 중복될 수도 있다. 이런 상황은 설명이 되어 있긴 한데.. 역시나 좀 부족하다.

예를 들어, firefox-private.yml 에서는 위에서 처럼 Firefox 이고, 사생활 보호 모드일 때를 정의했고, web-browser.yml 에서는 Google Chrome, Firefox, Vivaldi 를 모두 포함하는 필터를 만들었다고 가정해보자.

이 때, Firefox 는 중복이 되어 있다. ‘Firefox/사 생활 보호모드’ 는 firefox-private.yml 의 직접 영향을 받고, web-browser.yml 과도 연관이 있다. 따라서, 두 파일의 설정이 모두 작용할 듯 한데.. Espanso 문서의 Configuration Inheritance 영향인지, 양쪽 모두 적용이 되질 않는다.
이를 슬기롭게(?) 해결하려면, 먼저 파일명에 우선 순위를 부여해야 한다.

00-firefox-private.yml
01-web-browsers.yml

이런 식으로, 어떤게 먼저 Espanso 로 적재되는지를 지정해줘야 한다. 이렇게 하지 않으면, 어느 하나만 작동하게 된다. (정확하게 어떤 식으로 yml 파일들이 Espanso 로 영입(?)되는지는 모르겠다. 허나, 저렇게 순서를 주니 내가 원한대로 결과가 나왔다.)

또, 두군데 이상에서 같은 결과를 얻기 원한다면(이게 좀 설명이 애매한데.. 나중에 이 글을 읽었을 때 틀림없이 이게 뭔 소린지 궁금해할 게 뻔하다. 하지만, 더 뭐라 글로 표현하기가 좀..), 그 결과(match 파일)를 모두 config 에 포함시켜줘야 한다.

즉.. 처음엔 이렇게만 해주면 Firefox/사생활 창에서도 web-browser.yml 의 기능을 다 쓸 수 있을거라 생각했다.

# firefox-private.yml : 오작동
filter_class: 'firefox'
filter_title: '사생활 보호 모드$|Private Browsing$'
includes:
  - "../match/_p-firefox.yml"

################################################################

# web-browser.yml
filter_class: 'Google-chrome|firefox|Vivaldi-stable'
#macOS
#filter_exec: '/Applications/Google Chrome.app|/Applications/Firefox.app|/Applications/Vivaldi.app'
includes:
  - "../match/_web-browsers.yml"

그런데, 그렇지가 못하다. Espanso 의 프로그램 논리에 따라, 한 쪽만 인식이 된다.
다시 말해, Firefox/사생활 창에선 _web-browsers.yml 내용은 적용되지 않는다.

이 문제를 해결하려면, _web-browsers.yml 를 firefox-private.yml 에도 넣어줘야 한다.

# firefox-private.yml : 작동!
filter_class: 'firefox'
filter_title: '사생활 보호 모드$|Private Browsing$'
includes:
  - "../match/_p-firefox.yml"
  - "../match/_web-browsers.yml"

includes 에는 저렇게 여러 줄을 넣어줘도 된다. (includes 와 extra_includes 는 다르다!) includes 는 해당 파일만 불러오고, extra_includes 는, 다른 기본 파일들도 불러온 뒤, 이 파일들을 추가하라는 의미다.

Script Extension 시 경로 문제.

Autokey 도 그렇고, Copyq 도 그렇고, 모두 사용자가 만든 외부 스크립트를 쓸 수 있는 기능이 있다. Python, shell script, Perl 등등, 원하는대로 다 되는 듯 하다.

기본 형식은 이런 식인데, Path 에 살짝? 모호함이 존재한다.

  - trigger: ":pyscript"
    replace: "{{output}}"
    vars:
      - name: output
        type: script
        params:
          args:
            - python
            - /path/to/your/script.py

/path/to/your/script.py 처럼 절대경로를 쓰면 아무런 문제가 없다. 다음을 보면, 어떨 때 성공하고 실패하는지 알 수 있다.

  - "$HOME/bin/p_true.py"     # Err! python: can't open file '/home/narch/$HOME/bin/p_true.py': [Errno 2] No such file or directory
  - "~/bin/p_true.py"         # Err! python: can't open file '/home/narch/$HOME/bin/p_true.py': [Errno 2] No such file or directory
  - bin/p_true.py             # Works. bin means $HOME/bin
  - "%HOME%/bin/p_true.py"    # Also works.

맨 앞 슬래시를 빼고 경로를 적으면, $HOME 이하 경로로 자동 인식한다.
%HOME% 은 리눅스 환경변수 $HOME 과 같다.
~ 이나 $HOME 은 인식하지 못한다.

이 내용이 문서화되진 않은 듯 해서 제작자에게 문의를 하긴 했는데, 이슈가 워낙 많아서 언제 답이 올진 모르겠다.


Word 및 Cursor Hints

만약, ‘gr’ 을 trigger 로 지정해 놨다면, ‘progress’ 를 입력할 때도 작동하게 된다. 이를 피하려면, gr 보다는 :gr 등으로 구분해주는게 좋은데, 이게 맘에 안들 수도 있다.
이럴 때는 Word Triggers 를 써서 ‘gr’ 이 단독으로 쓰였을 때만 변환되도록 할 수도 있다. 즉, gr 을 입력하고, 공백(쉼표, 마침표 등)이 따라왔을 때만 작동하게끔 할 수 있다.

그런데, 때에 따라선 이게 조금 불편할 수도 있다. 공백을 입력했을 때 이게 문제가 되기도 한다. Word Trigger 를 쓰면, gr 이 great 으로 변환되고, 커서는 great 뒤 공백 옆에 자리잡게 된다. 이 때, 공백을 지우려고 BS 를 누르면, Trigger 취소가 되어, 다시 gr 로 바뀌게 된다.
저런 불편없이, word: true 인 상황에도 great 의 마지막 글자인 t 바로 오른쪽에 커서를 위치하게 하고 싶다면?? 즉, Space 를 일종의 트리거 키처럼 쓰고 싶다면? (Autokey 와 비슷한 방식)

그 때 Cursor Hints 를 쓸 수 있다.

  - trigger: "gr"
    replace: "great$|$"
    word: true

그 외, 또 알아내는 대로.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.