며칠 Espanso 를 쓰면서, 아직 문서화되지 않았으나 실제로는 사용되고 있는 내용들을 정리해본다.
Filter Exec/Class 와 Title 동시 사용? -> AND 연산
Espanso 의 filter 는 따로 설명되고 있긴 한데, 필터 두가지를 동시에 쓸 때 어떤 동작을 하는지는 설명이 없다. (23년 4월 현재)filter_exec
와 filter_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
그 외, 또 알아내는 대로.