Помните о размерах и расположении окон при отключении и повторном подключении второго монитора.

Вот что хреново:

  1. Подключите внешний монитор к ноутбуку (в моем случае Mac OS X Leopard).
  2. Расположите окна таким образом, чтобы IDE находилась на одном экране, а браузер — на другом. (И т.д. и т.п. Изменение размера, перестановка, суета, суета, суета.)
  3. Отключите монитор, чтобы бежать на встречу или что-то еще.
  4. Перейти к 1.

Я хотел бы заменить шаг 2 на «компьютер точно запоминает, как он у меня был, и просто возвращает его таким образом».

(Лично мне нужно решение только для Mac, но сбор решений для других систем здесь может быть полезен другим. Я уверен, что это распространенная проблема.)

Ответы (13)

Взгляните на Stay by Cordless Dog. Я считаю, что это именно то, что вы ищете.

Я попробовал это. Это не работает для окон X11, но в остальном выглядит так, как рекламируется. Спасибо за указатель! Возможно, это самое близкое решение для Mac, которое у нас есть на данный момент.
Окна X11 не являются «настоящими» экземплярами NSWindow (по крайней мере, они не были таковыми в прошлый раз, когда я проверял), поэтому неудивительно, что Stay не хочет иметь с ними ничего общего :) Рад, что все получилось иначе!
Это выглядит хорошо, но не работает с полноэкранными приложениями в Lion. У меня есть Safari в полноэкранном режиме, когда у меня есть 1 дисплей, и после подключения второго дисплея я хочу выйти из полноэкранного режима и переместить Safari на второй дисплей. Пребывание не перемещает любое полноэкранное приложение.
Казалось, что это хорошо подходит. А вот с 3-мя внешними дисплеями у него часто были проблемы с позициями и просто решил проблему на 50%. Так что мне все еще приходилось делать много ручной работы. Я просто удалил его. О, и это только 30-дневная пробная версия!

Slate — очень мощное бесплатное приложение для Mac, которое делает именно то, что вам нужно. Когда вы подключаете дополнительный монитор, он автоматически обнаруживает новый монитор , и все ваши окна будут перемещены и изменены в размере так, как вам нравится. Вы можете определить пользовательские положения и размеры для всех ваших приложений, включая полноэкранный режим, полуэкран и сетку.

Одна из самых крутых особенностей Slate заключается в том, что вы можете определять различные макеты в зависимости от количества подключенных мониторов . Например, если вы используете свой ноутбук отдельно, вы можете захотеть, чтобы все ваши приложения заполняли весь экран. Но когда у вас есть дополнительный монитор большего размера, вы можете разделить экран между браузером, почтой и музыкой. Шифер делает это легко.

Вы также можете определить сочетания клавиш для определенных макетов и действий, таких как подталкивание и изменение размера окон на определенный процент.

Ниже мой файл конфигурации. Я держу все свои приложения в полноэкранном режиме на всех своих мониторах, но вы можете изменить его, чтобы сделать их наполовину или в другом размере:

# Monitor Aliases
alias mon-laptop    0    # variable for my laptop monitor
alias mon-hp        1    # my external HP monitor

# Window Position Regions
alias hp-full        move screenOriginX;screenOriginY screenSizeX;screenSizeY         ${mon-hp}
alias hp-left        move screenOriginX;screenOriginY screenSizeX/2;screenSizeY         ${mon-hp}
alias hp-right       move screenOriginX+screenSizeX/2;screenOriginY screenSizeX/2;screenSizeY         ${mon-hp}
alias laptop-full        move screenOriginX;screenOriginY screenSizeX;screenSizeY         ${mon-laptop}
alias laptop-left        move screenOriginX;screenOriginY screenSizeX/2;screenSizeY         ${mon-laptop}
alias laptop-right       move screenOriginX+screenSizeX/2;screenOriginY screenSizeX/2;screenSizeY         ${mon-laptop}
alias laptop-righttop    move screenOriginX+screenSizeX/2;screenOriginY screenSizeX/2;screenSizeY/2       ${mon-laptop}
alias laptop-rightbottom move screenOriginX+screenSizeX/2;screenOriginY+screenSizeY/2    screenSizeX/2;screenSizeY/2       ${mon-laptop}

# Window layouts for when I have 2 monitors
layout 2monitor 'Google Chrome':REPEAT ${hp-full}
layout 2monitor 'iCal':REPEAT ${hp-full}
layout 2monitor 'Coda':REPEAT ${hp-full}
layout 2monitor 'Mail':REPEAT ${laptop-full}
layout 2monitor 'Rdio':REPEAT ${laptop-full}
layout 2monitor 'Spotify':REPEAT ${laptop-full}
layout 2monitor 'Evernote':REPEAT ${laptop-full}

# Single monitor window layouts
layout 1monitor 'Google Chrome':REPEAT ${laptop-full}
layout 1monitor 'iCal':REPEAT ${laptop-full}
layout 1monitor 'Coda':REPEAT ${laptop-full}
layout 1monitor 'Mail':REPEAT ${laptop-full}
layout 1monitor 'Rdio':REPEAT ${laptop-full}
layout 1monitor 'Spotify':REPEAT ${laptop-full}
layout 1monitor 'Evernote':REPEAT ${laptop-full}

# Keyboard shortcuts for each layout
bind l:shift;ctrl layout 2monitor
bind g:shift;ctrl grid padding:5 0:2,1 1:2,2

# Auto-detect when a monitor is plugged in or out
default 2monitor count:2
default 1monitor count:1

Вот список функций со страницы Slate на GitHub:

  • Широкие возможности настройки
  • Привязать нажатия клавиш к:
    • перемещать и/или изменять размер окон
    • окна с направленным фокусом
    • активировать предустановленные макеты
    • создавать, удалять и активировать снимки текущего состояния окон
  • Установите макеты по умолчанию для различных конфигураций монитора, которые будут активироваться при обнаружении этой конфигурации.
  • Подсказки окна: интуитивно понятный способ изменить фокус окна
  • [Бета] Улучшенный, более настраиваемый переключатель приложений.

Вот отличный учебник о том, как получить максимальную отдачу от Slate.

Может ли он вспомнить, как располагались окна с момента последнего подключения внешних мониторов, и просто восстановить их? Приложение «Оставаться» почти делает это, но оно не запоминает окна (особенно Chrome), поэтому я все еще ищу что-то получше.
@dreeves Да, у меня это работает. Я только что успешно сделал это вручную, используя пункты меню Slate «Сделать снимок» и «Активировать снимок»; если вы нажмете на них до и после перевода компьютера в спящий режим, вы сохраните и восстановите все позиции окон. Из документации видно , что Slate может автоматически выполнять «Активацию моментального снимка» с помощью своей defaultдирективы . Я не знаю, сможете ли вы автоматизировать часть «Сделать снимок».
Я хочу отметить, что для варианта использования OP они могут просто нажать «Сохранить снимок» и «Восстановить снимок» в меню. Пока вам нужна только одна конфигурация окна, она должна работать нормально, не связываясь ни с чем другим.
Slate больше не поддерживается, сейчас предлагают использовать Hammerspoon.

Я решил эту проблему с помощью небольшого AppleScript и небольшой бесплатной утилиты Quicksilver.

  1. Сохраните этот небольшой AppleScript в месте, которое не изменится на вашем компьютере:

    try
        tell application "Adium"
            activate
            tell window "contacts"
                set the bounds to {1281, 200, 1460, 850}
            end tell
            tell chat windows
                set the bounds to {1281, 800, 1800, 1200}
            end tell
        end tell
    end try
    
    try
        tell application "iTunes"
            activate
            set the bounds of the first window to {1750, 520, 2700, 1150}
        end tell
    end try
    
    try
        tell application "Terminal"
            activate
            set the bounds of the first window to {2450, 320, 3180, 950}
        end tell
    end try
    
    try
        tell application "Firefox"
            activate
            set the bounds of the first window to {1460, 20, 2800, 950}
        end tell
    end try
    
  2. Вам нужно будет настроить, какие приложения вы хотите видеть на своем мониторе, а окна ограничиваются так, как вам нравится. Я программист, и приведенная выше конфигурация — это то, как я запускаю свой второй монитор.

  3. Установите Quicksilver .

    Я решил сделать его невидимым в доке и просто запускать как небольшой демон панели задач.

  4. Настройте ключевую команду в Quicksilver и перетащите свой AppleScript из шага 1 в окно в качестве выполняемого действия. Я привязал его к CommandShiftA. Прекрасно работает!

Не особенно масштабируется, если у вас есть большое количество приложений для управления. И это не легко управлять! Жестко кодировать границы действительно не весело.
Можете ли вы установить рабочий стол, на котором отображается приложение?
Ссылка мертва, нашел похожее приложение с таким же названием здесь .

Поместите это здесь для потомков. Очень маленькое приложение, которое делает именно это и ничего более: Memmon (macOS 10.10+).

Это, безусловно, лучшее современное решение. Бесплатно и просто. Иди и дай Github несколько звезд.
Я согласен, Memmon — лучший вариант: он просто работает, прост, с открытым исходным кодом и бесплатен.

Я просто следил за http://cordlessdog.com/stay/ , у меня отлично работает, хотя и с небольшим отставанием.

После того, как вы остаетесь установленным на своем Mac, вы можете запустить его и сохранить окна, как хотите. Поэтому всякий раз, когда вы отключаете свои дисплеи и подключаетесь обратно, все окна будут восстановлены.

Возможно, вам придется добавить stay в качестве приложения для запуска, потому что вам придется запускать его каждый раз, когда вы перезагружаете свой Mac.

Я исправил это без каких-либо внешних приложений.

Все, что вам нужно сделать, это убедиться, что ваш ноутбук — «Рабочий стол 1», а внешний монитор — «Рабочий стол 2».

вы можете сделать это, переместив белую строку меню на экран ноутбука в системных настройках> Дисплеи> Расположение

К сожалению, с версии 10.13 (High Sierra) это больше не так.
Это прекрасно работает в macOS Monterey v12.1... метки немного отличаются... используйте как "Основной дисплей" и "Расширенный"... отлично работает. Спасибо!
Мне было интересно, почему у меня никогда не было этой проблемы за 10 лет использования MacBook/экранов/ОС. Это объясняет это.

Прежде чем отключить монитор, закройте все, что не находится на основном мониторе. Приложения обычно сохраняют свое состояние (включая размещение окна) при закрытии и считывают его при открытии, поэтому, если второй монитор присутствует в оба этих случая, все должно быть в порядке.

Вы можете воспользоваться преимуществами приложений, которые позволяют одновременно открывать более одного экземпляра, но сохраняют состояние только при закрытии. Закройте экземпляр с несколькими мониторами (что приводит к сохранению состояния). Отключите второй монитор. Если у вас запущен второй экземпляр, его следует переместить на главный монитор, или вы можете запустить другой экземпляр. Не закрывайте этот экземпляр, пока снова не подключите второй монитор и не запустите другой экземпляр (который затем будет считывать конфигурацию нескольких мониторов при запуске). Затем вы можете выйти из экземпляра с одним монитором (сохранив это состояние), а затем из экземпляра с несколькими мониторами (перезаписав состояние одного монитора).

Более сложный вариант может включать в себя выяснение места сохранения состояния, его резервное копирование и написание пакетного файла/скрипта для его восстановления перед открытием приложения, что позволит вам сделать ссылку, чтобы делать это автоматически при запуске приложения. .

Наконец, может быть такая утилита для вашей платформы, или написать ее может быть не слишком сложно. Для Windows существует программа ShiftWindow , которая может перемещать окна либо при запуске приложения, либо при нажатии определенной горячей клавиши. Боюсь, я недостаточно хорошо знаю MacOS, чтобы сказать, существует ли подобная утилита. Это, вероятно, идеальное решение, уступающее только прямой поддержке ОС.

Спасибо! Не тот ответ, на который я надеялся, но хорошая зацепка!
Это самое элегантное решение. Нет необходимости в установке и копании! Спасибо!

На Reddit некоторые пользователи предложили Display Maid . Я использую его на MB Air (M1), подключенном к док-станции Display Link, с монитором 4K и монитором Full HD, подключенным через TB, и пока все отлично.

Как это по сравнению с Stay ? Я использую Stay уже несколько лет и был относительно доволен, но всегда интересовался улучшенными вариантами!
У меня нет опыта работы с Stay, но из того, что я видел на демонстрационном видео, функциональность Stacy кажется очень похожей.

Я нашел ответ на macrumors , который работает для меня, не требуя другого программного обеспечения.

Preferences-> General-> Снять галочкуClose windows when quitting an app

Описание того, что делает этот параметр, имеет смысл:

Если выбрано, открытые документы и окна не будут восстановлены при повторном открытии приложения.

Я не знаю, почему отключение и подключение дисплея считается «повторным открытием приложения», но это сработало для меня.

По крайней мере, в Windows многие приложения восстановятся, если вы развернете их перед переключением мониторов. Оставьте их в покое, пока вы находитесь на собрании, а затем восстановите их после повторного подключения.

Это все еще неполное исправление (и хлопот), но это единственное, что я знаю, что делать, если я хочу получить шанс воскресить мои тщательно размещенные окна. Хотя ShiftWindow звучит интригующе...

И если вы переходите с двух мониторов на один, Alt + пробел + M, тогда клавиши со стрелками спасают жизнь (снова Windows, извините), если вы «потеряете» свои окна.

http://www.irradiatedsoftware.com/twoup/index.html

Я нашел это через Lifehacker, и это отлично работает для меня. Я использую профессиональную версию SizeUp, а не бесплатную TwoUp, и она идеальна.

Вы хотите сказать, что это решает проблему, которую я поставил? Страница, на которую вы ссылаетесь, похоже, ничего не упоминает об этом.
Нет, это совсем не решает проблему. SizeUp позволяет быстрее переместить окно туда, куда вы хотите, но вам все равно придется вручную переключаться между каждым окном и указывать SizeUp, куда вы хотите переместить каждое из них.

Я пользователь Windows и искал, как отключить новую функцию Windows 7, чтобы убрать все окна с отключенного внешнего монитора. Я нашел квитанцию ​​(для видеокарт ATI), чтобы установить все значения DMMEnableDDCPolling в реестре на 0. Это отключает автоматическую проверку, если монитор выключен. Теперь, если монитор отключить и снова подключить, все окна остаются в том же положении.

Вот ответ, который мне помог: https://superuser.com/questions/120983/how-to-disable-monitor-auto-detection-in-windows-7 (ответ Алекса)

Это не имеет ничего общего с Mac?
Нет .. но вопрос был помечен также как «окна» (хотя, возможно, ОП относился к окнам программ ;)). Во всяком случае, для Windows есть пара удобных утилит для решения этой задачи. Я лично использую ZMover Басты, и он работает хорошо. Другой альтернативой является WindowManager от DeskSoft . Но это, конечно, не поможет пользователям OSX.

Отключите и подключите мониторы в том же порядке.

Последовательность отключения: Монитор1 -> Монитор2 Последовательность подключения: Монитор2 -> Монитор1

Похоже, в вопросе указан только один внешний монитор, подключенный к ноутбуку. Этот ответ касается этого?
Для одного монитора на моей машине, на которой работает Mojave, проблем нет.
@ Jake3231Я думаю, что в этом случае монитор ноутбука становится Monitor1. Это сработало для меня!