Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Fling

Fling is a small Vim-style macOS window manager for people who like fast keyboard control. It lives in the menu bar, opens a compact floating panel, and lets you move or resize the current window with familiar h, j, k, and l navigation keys.

What You Can Do

  • Snap the current window with Vim-style direction keys: h, j, k, and l.
  • Maximize the current window without entering macOS fullscreen.
  • Move a window to another display.
  • Cycle through visible windows while the panel is open.
  • Configure a global shortcut to open the panel.
  • Optionally configure a second global shortcut to move the focused window to the next display immediately.
  • Start Fling automatically when you log in.

First Run

  1. Launch Fling.
  2. Grant Accessibility permission when macOS asks for it.
  3. Look for the Fling icon in the menu bar.
  4. Open Settings... from the menu bar menu.
  5. Check or change the Activate panel shortcut.

If the permission prompt does not appear, enable Fling manually:

System Settings > Privacy & Security > Accessibility

Fling needs Accessibility permission because macOS only allows window managers to move and resize other apps through that permission.

Basic Usage

  1. Focus the window you want to control.
  2. Press the Activate panel shortcut.
  3. Press a Vim-style command key from the panel key table below.
  4. Keep using commands, cycle to another window, or dismiss the panel.

The border highlight shows which window Fling is targeting.

The core movement model follows Vim navigation:

h = left
j = down
k = up
l = right

Vim-Style Panel Keys

Key Action
h Snap target window to the left half
j Snap target window to the bottom half
k Snap target window to the top half
l Snap target window to the right half
Space Maximize target window
Shift+h Move target window to the previous display
Shift+l Move target window to the next display
Tab Focus the next usable window
Shift+j Focus the next usable window
Shift+k Focus the previous usable window
Esc / q Close the panel
Ctrl+c / Ctrl+[ Close the panel

Global Shortcuts

Open Settings... from the menu bar to configure global shortcuts.

Setting Default Description
Activate panel Configured in the app Opens or closes the floating panel
Move to next display Not set Moves the focused window to the next display without opening the panel

Shortcut recording requires at least one modifier key:

Control, Option, Shift, or Command

Menu Bar Options

The menu bar menu provides:

  • About Fling
  • Launch at Login
  • Settings...
  • Quit Fling

Window Cycling Notes

Fling tries to skip windows that are hidden, minimized, too small, off screen, or not real app windows. Finder's desktop layer is also skipped so cycling targets actual Finder windows instead of the desktop.

Build And Run From Source

For normal use, run the app from Xcode. The project is generated from project.yml:

brew install xcodegen
xcodegen generate
open Fling.xcodeproj

You can also run the Swift package directly:

swift run Fling

Packaging

For a local release build:

xcodegen generate
xcodebuild -project Fling.xcodeproj -scheme Fling -configuration Release build

To export a .app from an archive:

xcodegen generate
xcodebuild \
  -project Fling.xcodeproj \
  -scheme Fling \
  -configuration Release \
  -archivePath build/Fling.xcarchive \
  archive

xcodebuild \
  -exportArchive \
  -archivePath build/Fling.xcarchive \
  -exportPath build/export \
  -exportOptionsPlist ExportOptions.plist

The exported app will be placed under build/export.

For distribution to other Macs, you will also need Developer ID signing and notarization.

Requirements

  • macOS 14.0 or later
  • Accessibility permission
  • Xcode 15 or later if building from source

License

MIT

About

Vim-style macOS window manager

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages