Я нашел способ открыть новую вкладку в iTerm
:
newtabi()
{
osascript -e 'tell application "iTerm" to activate' -e 'tell application "System Events" to tell process "iTerm" to keystroke "t" using command down'
}
И я хочу выполнить некоторые команды в новой вкладке. Пусть это будет простая команда pwd
. Как это сделать?
Если я побегу...
newtabi && pwd
Новая вкладка открывается как положено, но pwd
команда выполняется не в новой вкладке, а в старой, где я набралnewtabi && pwd
я использую zsh
. Моя ОСOS X 10.8.5
Использование tell session -1 of current terminal to write text "pwd"
:
activate application "iTerm"
tell application "System Events" to keystroke "t" using command down
tell application "iTerm" to tell session -1 of current terminal to write text "pwd"
iTerms
, он открывает новую вкладку в правильном iTerm
экземпляре, но пишет pwd
в последней вкладке первого экземпляра iTermterminal 1
его на current terminal
. Теперь он должен запускать команду в текущем окне, а не в окне, которое было открыто первым.execution error: System Events got an error: osascript is not allowed to send keystrokes. (1002)
osascript \
-e 'tell application "iTerm" to activate' \
-e 'tell application "System Events" to tell process "iTerm" to keystroke "t" using command down' \
-e 'tell application "System Events" to tell process "iTerm" to keystroke "ls"' \
-e 'tell application "System Events" to tell process "iTerm" to key code 52'
148:156: syntax error: Expected end of line but found identifier. (-2741)
за это.key code 52
должен делать?По крайней мере, для MacOS Mojave, iTerm 3.2.8, если вы запустите:
$ open -a iTerm .
Он добавит его как вкладку в текущее окно.
.
в ответе), он выполнит его (после запроса подтверждения от iTerm)Я не мог получить принятый ответ на работу. Я также хотел передать несколько команд. Это то, что я придумал.
newtabi(){
osascript \
-e 'tell application "iTerm2" to tell current window to set newWindow to (create tab with default profile)'\
-e "tell application \"iTerm2\" to tell current session of newWindow to write text \"${@}\""
}
Пример использования
newtabi pwd
newtabi 'cd ~/ && pwd'
newtabi 'echo \"Hello New Tab\"'
Для более сложных действий я бы рекомендовал разбивать команды.
code_folder="/path/to/code"
alias project="cd ${code_folder}/my-project/foo && yarn run start"
Затем,newtabi project
pwd
, чтобы команда выглядела так: `newtabi '$PWD/foo && yarn run start'?newtabi "$(pwd)/foo && yarn run start"
ttab
это интерфейс командной строки для macOS и Linux для открытия новой вкладки/окна терминала, опционально с командой для выполнения и/или отображения настроек
Из его образцов:
# Open a new tab, execute a command, wait for a keypress, and exit.
ttab 'ls "$HOME/Library/Application Support"; echo Press a key to exit.; read -rsn 1; exit'
Если вы ищете версию JXA:
class iTerm {
constructor() {
this.app = Application("iTerm");
this.window = this.app.currentWindow();
}
findOrCreateTab(tabName, command) {
this.app.activate();
let existingTab = this.findTab(tabName);
if (existingTab == undefined) {
existingTab = this.createTab(tabName);
console.log(`Created new tab: ${tabName}`);
existingTab.currentSession().write({ text: command });
} else {
existingTab.select();
console.log(`Found existing tab: ${tabName}`);
}
return existingTab;
}
createTab(name) {
const newTab = this.window.createTabWithDefaultProfile();
const session = newTab.currentSession();
session.name = name;
// console.log(newTab.index());
// console.log(newSession.name());
// console.log(newSession.profileName());
return newTab;
}
findTab(name) {
const tabs = this.window.tabs();
for (const tab of tabs) {
let session = tab.currentSession();
// Strange, but iTerm uses `profileName` instead of `name` for keeping manually assigned session name.
const tabName = session.profileName();
if (tabName === name) {
return tab;
}
}
return undefined;
}
}
Если вам также интересно, как использовать модули ESM в JXA (через браузер), то вот хороший пример: https://github.com/johnelm/node-jxa . Плюс https://www.npmjs.com/package/esmify .
После настройки вы можете импортировать повторно используемый класс, как показано ниже:
import iTerm from "../lib/iTerm";
const app = new iTerm();
app.findOrCreateTab("MyTab", `cd "$HOME"`);
сорин
open -a iTerm
для запуска команды.