{"id":13837040,"url":"https://github.com/davidshepherd7/frames-only-mode","last_synced_at":"2025-09-18T18:31:47.602Z","repository":{"id":15118080,"uuid":"17845038","full_name":"davidshepherd7/frames-only-mode","owner":"davidshepherd7","description":"Make emacs play nicely with tiling window managers by setting it up to use frames rather than windows","archived":false,"fork":false,"pushed_at":"2024-02-13T22:26:41.000Z","size":110,"stargazers_count":152,"open_issues_count":4,"forks_count":5,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-02-17T08:35:10.923Z","etag":null,"topics":["emacs","tiling-window-manager","window-manager"],"latest_commit_sha":null,"homepage":"","language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"angular-ui/ui-ace","license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/davidshepherd7.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-03-17T22:07:04.000Z","updated_at":"2024-05-30T01:29:43.334Z","dependencies_parsed_at":"2024-02-13T22:45:42.894Z","dependency_job_id":null,"html_url":"https://github.com/davidshepherd7/frames-only-mode","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidshepherd7%2Fframes-only-mode","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidshepherd7%2Fframes-only-mode/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidshepherd7%2Fframes-only-mode/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidshepherd7%2Fframes-only-mode/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/davidshepherd7","download_url":"https://codeload.github.com/davidshepherd7/frames-only-mode/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":233494942,"owners_count":18684723,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["emacs","tiling-window-manager","window-manager"],"created_at":"2024-08-04T15:00:59.790Z","updated_at":"2025-09-18T18:31:42.319Z","avatar_url":"https://github.com/davidshepherd7.png","language":"Emacs Lisp","funding_links":[],"categories":["Emacs Lisp"],"sub_categories":[],"readme":"# Frames only mode\n\n[![CI](https://github.com/davidshepherd7/frames-only-mode/workflows/CI/badge.svg)](https://github.com/davidshepherd7/frames-only-mode/actions) \n[![MELPA](https://melpa.org/packages/frames-only-mode-badge.svg)](https://melpa.org/#/frames-only-mode)\n\nAn emacs global minor mode to use emacs frames (i.e. operating system windows)\ninstead of emacs' internal windowing system. This combines particularly well\nwith\n[tiling window managers](https://en.wikipedia.org/wiki/Tiling_window_manager)\nsuch as [XMonad](http://xmonad.org/).\n\nThere's a fairly rough screencast showing the kind of things you can do with this [here](https://www.youtube.com/watch?v=vi1BwRYJr6k).\n\n\n## Typical Setup\n\nBy default `frames-only-mode` doesn't modify any keybindings. To replace common\nwindow-using keybindings with their frame equivalents add\n`(frames-only-mode-remap-common-window-split-keybindings)` to your config.\n\nIn combination with `frames-only-mode` I recommend:\n\n* Running emacs as [server-client](http://wikemacs.org/wiki/Emacs_server).\n* Binding a window manager hotkey to open new emacs frames (see below).\n\n\nBind this shell command to a hotkey to automatically open a useful buffer in\na new frame (usually your most recently viewed buffer which isn't currently open):\n\n    emacsclient -c -n -e '(switch-to-buffer nil)'\n\n\n## Advanced Configuration\n\n### Integrating with command line git\n\nTo make this work nicely with git (e.g. to pop up a new frame when we run git commit from the command line) we need to set the editor to run an emacsclient in a new frame. However, unlike the case for running emacsclient instances from the window manager, we don't want it to detach from the console. We can achieve this by adding the following to the `~/.gitconfig` file:\n\n```\n[core]\n    editor = emacsclient -c\n```\n\nIf instead we only used `editor = emacsclient` it would try to open a new buffer in an existing frame. This often results in the commit message buffer showing up in a different workspace(!), or in the terminal.\n\n\n### Automatically killing (closing) certain frames\n\nSometimes when a buffer is closed/buried you want to kill the containing frame,\nfor example when pressing `q` in a help buffer. For things in Emacs itself this\nis usually configured by default, but for other things you can control this\nbehaviour using `frames-only-mode-kill-frame-when-buffer-killed-buffer-list`.\n\nFor example to automatically kill frames for buffers named `*foo*`:\n\n```\n  (add-to-list 'frames-only-mode-kill-frame-when-buffer-killed-buffer-list \"*foo*\")\n```\n\nThis variable also supports using regular expressions by using a cons cell where\nthe car (first) element is `'regexp` and the cdr (second) is the regexp. This is a\nlittle tricky because transient buffers are typically named with `*` characters\nat the start and end of their names which need escaping. For example to\nautomatically kill frames for popup buffers from po-mode which are named like\n`*foo.po*` do:\n\n```\n  (add-to-list 'frames-only-mode-kill-frame-when-buffer-killed-buffer-list '(regexp . \"\\\\*.*\\\\.po\\\\*\"))\n```\n\n(note the double-backslash escaping of the regexp special character here *\nbecause we want to treat it as a normal literal character).\n\n\n### Integration with default emacs completion\n\nIf you use the default emacs completion (or ido with a popup completion buffer)\nthen `frames-only-mode-use-windows-for-completion` can be used to control\nwhether the `*Completions*` buffer is displayed in a frame or an emacs window.\nThe default is to use an emacs window, which works well with any window manager.\nAlternatively the `*Completions*` buffer can be disabled entirely by setting\n`completion-auto-help` to `nil`.\n\n\n## Changelog\n\n### Unstable\n\n* Add support for eshell completion\n* Fix some customize group weirdness\n* Fix sometimes leaving additional frames open after quitting magit\n* Regexp support in kill-frame-when-buffer-killed-buffer-list\n* Add frames-only-mode-remap-common-window-split-keybindings\n\n\n\n## Other links\n\nThis mode originated in\n[a blog post](http://techtrickery.net/tearing-out-the-emacs-window-manager.html)\nwhich has some additional details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidshepherd7%2Fframes-only-mode","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdavidshepherd7%2Fframes-only-mode","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidshepherd7%2Fframes-only-mode/lists"}