2009-11-25 53 views
6

Tôi có hai cửa sổ/tab được thiết lập để chạy trong Terminal.app, "syd" và "mel". tức là trong Shell | Cửa sổ mới, "syd" và "mel" được liệt kê. Làm thế nào tôi có thể mở các cấu hình đầu cuối bằng AppleScript?AppleScript để mở cửa sổ đầu cuối có tên

Trả lời

22

Một vài tuần trước, tôi đã di chuyển một Snow Leopard mới (10.6) máy từ một (10.4) Máy Tiger. Tiger Thiết bị đầu cuối lưu trữ cài đặt của nó trong các tệp “.term” (thường là ở ~/Library/Application Support/Terminal/, nhưng chúng có thể được lưu/di chuyển ở bất kỳ đâu); Thiết bị đầu cuối của Snow Leopard tập trung cài đặt của nó vào tệp tùy chọn của Snow Leopard.

Trước khi chuyển sang Snow Leopard là một phần của một trong những công việc bình thường của tôi đã sử dụng Finder nhấp đúp chuột vào một tập tin “.term” lưu để mở một cửa sổga với kích thước định sẵn và lệnh ban đầu. Hôm nay, tôi nhận thấy rằng mỗi lần tôi thực hiện điều này Thiết bị đầu cuối đang tạo "bộ cài đặt" trùng lặp. Vì vậy, tôi bắt đầu tìm kiếm một cách để bắt đầu một thiết lập đã lưu mà không liên quan đến việc mở một tập tin ".term" (để các thiết lập trùng lặp sẽ không chồng chất lên); AppleScript là điểm dừng chân đầu tiên của tôi kể từ khi tôi có một chút kinh nghiệm với nó trước đây.

Tóm lại, dường như không có cách trực tiếp nào để bắt đầu cửa sổ/tab mới với một "bộ cài đặt" cụ thể thông qua các lệnh AppleScript của của Terminal. Cách tiếp cận thông thường sẽ là làm điều gì đó liên quan đến make new window (hoặc make new tab), nhưng tôi không thể tìm thấy biến thể mà Thiết bị đầu cuối sẽ chấp nhận. Tôi đã đưa ra ba giải pháp thay thế (giải pháp cuối cùng là tốt nhất, theo ý kiến ​​của tôi).

Tạo một cửa sổ, sau đó Change Settings

Nếu cài đặt của bạn không liên quan đến một lệnh ban đầu hoặc kích thước khác nhau từ các thiết lập mặc định của bạn (ví dụ như chỉ màu/bàn phím/cài đặt hành vi khác với mặc định), bạn có thể sử dụng Lệnh của Thiết bị đầu cuối do script (không có tham số “văn bản”) để tạo cửa sổ mới và sau đó thay đổi settings set thành cửa sổ bạn muốn.

tell application "Terminal" 
    set newTab to do script -- create a new window with no initial command 
    set current settings of newTab to settings set "Grass" 
end tell 

Điều này có thể phù hợp với bạn, nhưng nó không phù hợp với nhu cầu của tôi, vì vậy tôi tiếp tục tìm kiếm.

‘s gadefault settings

Tiếp theo, tôi nhìn vào default settings tài sản. Tôi nghĩ có thể tạm thời thay đổi cài đặt nào là mặc định, tạo cửa sổ mới, sau đó đặt lại cài đặt mặc định. Cách tiếp cận này cuối cùng đã thành công, nhưng hóa ra lại khá xấu xí (bên cạnh sự xấu xí của sự thay đổi tạm thời đối với các giá trị mặc định).

tôi đã sử dụng Hệ thống Sự kiệnkeystroke lệnh để gửi một ⌘N để ga để tạo ra cửa sổ mới. Nó chỉ ra rằng Thiết bị đầu cuối đôi khi hơi chậm để tạo cửa sổ mới và tập lệnh của tôi sẽ thiết lập lại mặc định trước Thiết bị đầu cuối có cơ hội sử dụng giá trị tạm thời mà phần trước của tập lệnh đã sắp xếp.do script có thể đã được đồng bộ, nhưng nó cũng sẽ vô hiệu hóa bất kỳ lệnh ban đầu được lưu như là một phần của các thiết lập. Tôi đã kết thúc việc tính số cửa sổ trước theN và chờ số cửa sổ tăng lên. Nếu lệnh được khởi chạy dẫn đến việc mở và đóng cửa sổ rất nhanh, có khả năng là vòng lặp này có thể bị kẹt. Tôi có thể giới hạn các lần lặp lại, nhưng vào thời điểm này tôi đã khá thất vọng với hương vị tổng thể của mã (mặc dù tôi đã đi trước và mở rộng nó để cho phép các tab mới thay vì chỉ cửa sổ).

to newTerminal(settingSetName, asTab) 
    tell application "Terminal" 
     if asTab is true then 
      set countRef to a reference to tabs of first window 
      set newKey to "t" 
     else 
      set countRef to a reference to windows 
      set newKey to "n" 
     end if 
     set originalDefault to name of default settings 
     set default settings to settings set settingSetName 
    end tell 
    try 
     set initialCount to count of countRef 
     tell application "System Events" 
      -- keystrokes always go to the frontmost application 
      set frontmost of application process "Terminal" to true 
      keystroke newKey using command down 
     end tell 
     repeat until (count of countRef) > initialCount 
      beep 
      delay 0.1 
     end repeat 

     tell application "Terminal" to set default settings to settings set originalDefault 
    on error m number n 
     try 
      tell application "Terminal" to set default settings to settings set originalDefault 
     end try 
     error m number n 
    end try 
end newTerminal 

newTerminal("Grass", false) 

Nhấp vào một Menu Item qua Hệ thống Sự kiện

Với Hệ thống Sự kiện, có một cách để kích hoạt trực tiếp các mục trong menu Shell>New TabShell>Cửa sổ mới. Điều này đòi hỏi rằng "quyền truy cập cho các thiết bị trợ giúp" được kích hoạt (gần cuối cửa sổ tùy chọn Universal Access), tôi thường bật nó vì kịch bản GUI có thể được thực hiện thông qua Sự kiện hệ thống thường là cách duy nhất (tốt) hoàn thành một số nhiệm vụ tự động hóa). Mặc dù biến thể trước cũng sử dụng Sự kiện hệ thống, việc sử dụng rất hạn chế của nó không yêu cầu “quyền truy cập cho các thiết bị trợ giúp”.

(* makeNewTerminal(settingsSetName, asTab) 

    Bring Terminal.app to the front and 
     click the menu item named <settingsSetName>. 
     If <asTab> is true, then use the menu item under Shell > New Tab, 
      otherwise use the menu item under Shell > New Window 
*) 
to makeNewTerminal(settingsSetName, asTab) 
    tell application "Terminal" to launch 
    if asTab is true then 
     set submenuName to "New Tab" 
    else 
     set submenuName to "New Window" 
    end if 
    tell application "System Events" 
     set terminal to application process "Terminal" 
     set frontmost of terminal to true 
     click menu item settingsSetName of ¬ 
      first menu of menu item submenuName of ¬ 
      first menu of menu bar item "Shell" of ¬ 
      first menu bar of terminal 
    end tell 
end makeNewTerminal 

makeNewTerminal("Grass", true) 

Cách tiếp cận này nghĩa là tự động lựa chọn và kích hoạt một trong các mục trình đơn từ Shell menu. Nó yêu cầu "truy cập cho các thiết bị hỗ trợ", nhưng mã đơn giản hơn nhiều và có ít vấn đề hơn (vấn đề chính với mã này là bản địa hóa).

+5

LƯU Ý: 'do script' trả về một trình chỉ định đối tượng cho tab/cửa sổ mới. Chỉ cần sử dụng kết quả của việc đó để gửi các lệnh bổ sung cho thiết bị đầu cuối đó. Không mã hóa cứng 'tab đầu tiên của cửa sổ đầu tiên'. ví dụ: 'đặt theTerminal để thực hiện tập lệnh',' đặt cài đặt hiện tại củaTerminal thành cài đặt "Grass" ' –

0

nên được một cái gì đó như thế này:

tell application "Finder" 
    open file "MyDisk:Users:myhome:Library:Application Support:Terminal:myconfig.terminal" 
end tell 
+0

Tôi đang sử dụng Snow Leopard (10.6) và tôi không có thư mục '~/Library/Application Support/Terminal' - điều đó có thay đổi không? Cấu hình dường như nằm trong '~/Library/Preferences/com.apple.Terminal.plist' ngay bây giờ. – mjs

+0

Phải có; Tôi không có máy SL để xem. Có http://iterm.sourceforge.net/ như một thiết bị đầu cuối thay thế hỗ trợ applescript, tabs, bookmarks. – markratledge

Các vấn đề liên quan