본문으로 건너뛰기

Lua 스크립트

자주 반복하는 작업을 Lua 스크립트로 만들어보세요. 단축키로 실행하거나 윈도우, 워크스페이스, 탭이 열리고 닫힐 때 자동으로 실행하도록 설정할 수 있습니다.

사용할 스크립트를 등록하고 실행할 단축키나 이벤트를 연결하세요. 등록하지 않은 파일은 시작할 때 자동으로 실행되지 않습니다.

등록

설정 > 기타 > 스크립트 에서 스크립트 추가 를 누릅니다.

  • 파일 — .lua 파일 경로. 찾아보기… 로 골라도 됩니다. 두는 위치는 자유지만 관례는 ~/.tasty/scripts/ 입니다.
  • 표시 이름 — 목록과 단축키 화면에 보일 이름. 비우면 파일명을 씁니다.

등록하면 목록에 행이 하나 생기고, 붙은 단축키가 함께 보입니다. 아직 없으면 미지정 입니다. 행에서 이름을 바꾸거나 제거할 수 있습니다. 제거하면 연결된 단축키도 함께 풀립니다.

단축키로 실행

설정 > 단축키 > 스크립트 실행 에서 등록한 스크립트마다 조합을 지정합니다. 지정한 조합을 누르면 그 자리에서 실행됩니다.

이벤트로 자동 실행

스크립트 행 아래 자동 실행 줄에서 트리거 추가… 로 이벤트를 고릅니다. 여러 개를 붙일 수 있고, 붙인 이벤트는 칩으로 표시되며 클릭해서 뗍니다. 모든 이벤트를 이미 붙였으면 트리거 추가… 는 비활성으로 남습니다.

이벤트 언제
tasty.startup.post tasty 가 다 뜬 직후
window.create.post · window.delete.post 윈도우가 생기고 닫힐 때
workspace.create.post · workspace.delete.post 워크스페이스가 생기고 닫힐 때
workspace.change.post 워크스페이스 이름·설명을 윈도우에서 직접 바꿨을 때
tab.create.post · tab.delete.post 탭이 생기고 닫힐 때
tab.change.post 탭 이름을 윈도우에서 직접 바꿨을 때
pane.create.post · pane.delete.post 페인이 생기고 닫힐 때
surface.create.post · surface.delete.post 서피스가 생기고 닫힐 때

이름 변경 이벤트 두 가지는 윈도우에서 직접 이름을 바꿀 때만 발생합니다. CLI로 이름을 바꾸면 해당 이벤트는 발생하지 않습니다.

자동 실행 스크립트가 CLI 로 또 다른 이벤트를 일으키면 연쇄가 될 수 있습니다. 반복 실행을 막기 위해 자동 실행 중이거나 끝난 직후에는 새로운 자동 실행을 잠시 보류합니다.

스크립트에서 할 수 있는 것

스크립트에서 사용할 수 있는 Tasty 함수는 다음과 같습니다.

함수 하는 일
tasty.tree() 워크스페이스 · 페인 · 탭 · 서피스 구조를 테이블로 읽습니다. 맨 위는 모든 윈도우의 워크스페이스를 모은 목록이며 윈도우 단계는 따로 없습니다. 읽기 전용 사본입니다
tasty.run_cli(args) tasty 명령을 실행합니다. 문자열 하나 또는 문자열 테이블을 넘깁니다
tasty.log(msg) · tasty.warn(msg) 로그에 남깁니다
tasty.on(event, cb) 이벤트가 날 때 호출될 함수를 등록합니다. 이벤트를 받아 후속 작업을 할 수 있지만 이미 발생한 이벤트를 취소하거나 바꾸지는 못합니다

tasty 를 실제로 조작하는 일은 대부분 tasty.run_cli 로 합니다. 워크스페이스를 만들든 알림을 보내든 CLI 로 할 수 있는 것은 전부 여기서도 됩니다.

-- 워크스페이스 수를 로그에 남기고 알림 보내기
local tree = tasty.tree()
tasty.log("workspaces: " .. tostring(#tree))
tasty.run_cli({ "notify", "새 워크스페이스", "--title", "script" })

Lua 표준 라이브러리의 파일 입출력과 외부 명령 실행은 그대로 쓸 수 있습니다. 내 컴퓨터에서 작성한 스크립트를 실행하며, 별도의 샌드박스로 격리하지 않습니다.

파일이 바뀌면

등록할 때 파일의 해시를 기록해 두고, 실행할 때마다 지금 파일과 비교합니다. 편집기로 스크립트를 고치면 목록에 변경됨 배지가 붙습니다.

  • 단축키로 실행 — 확인 창이 뜹니다. 승인하면 새 내용으로 실행하고 해시를 갱신합니다. 갱신한 해시는 모든 윈도우에 적용되므로 다른 윈도우에서 실행해도 다시 묻지 않습니다.
  • 자동 실행 — 실행하지 않고 막고, 알림 목록에 경고 알림을 남깁니다. 사람이 보지 않는 사이에 바뀐 스크립트가 도는 것을 막기 위해서입니다. 목록에서 배지를 확인하고 한 번 직접 실행해 승인하면 다시 실행됩니다.

require 로 불러오는 다른 파일까지는 검사하지 않습니다.

실행 제약

  • 메모리 상한이 있고, 넘으면 그 실행만 중단됩니다.
  • Lua 명령 실행 중에는 시간 제한을 확인해 무한 루프를 중단합니다. 파일 입출력이나 외부 명령에서 대기 중인 동안에는 즉시 중단하지 못할 수 있습니다. 앱의 화면은 별도로 동작합니다.
  • 텍스트 소스만 받습니다. 미리 컴파일한 바이트코드는 거부합니다.
  • 디버그 라이브러리와 임의 코드 로드 계열 함수는 막혀 있습니다.

문제가 생기면

  • 단축키로 실행한 스크립트 — 실행하지 못했거나 실패하면 단축키를 누른 윈도우에 실패 토스트가 뜹니다. 등록이 사라졌을 때, 파일을 읽지 못했을 때, 스크립트가 오류를 냈을 때, 시간 제한을 넘었을 때, 실행 대기열이 가득 찼을 때가 해당합니다. 결과가 오기 전에 그 윈도우를 닫았으면 다른 윈도우에는 띄우지 않습니다.
  • 자동 실행 — 파일이 바뀌어 막혔을 때, 읽기·실행에 실패했을 때, 연쇄를 막으려고 건너뛰었을 때 알림 목록에 경고 알림이 남습니다. 팝업은 뜨지 않습니다. 같은 내용의 알림은 10초 안에 한 번만 남습니다.

성공한 실행에는 아무것도 표시하지 않습니다. 자세한 원인은 로그 수준을 올려 확인합니다.

TASTY_LOG=tasty_lua=debug tasty

함께 살펴보기

단축키로 스크립트를 실행하면 파일을 백그라운드에서 읽습니다. 읽은 내용이 등록 당시와 달라졌으면 기존 확인 팝업에서 승인한 뒤 실행합니다. 스크립트 파일은 최대 8 MiB까지 읽습니다.

GitHub에서 원문 보기