From dd17f2dcc7993cfba7569ec40295602cff97fc0a Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Thu, 29 May 2025 20:04:45 +0200 Subject: [PATCH] Move window manipulation functions from configuration.org to lisp/gpolonkai/windows.el --- configuration.org | 75 ---------------------------------- init.el | 1 + lisp/gpolonkai/windows.el | 86 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 75 deletions(-) create mode 100644 lisp/gpolonkai/windows.el diff --git a/configuration.org b/configuration.org index 68ab411..c8881f1 100644 --- a/configuration.org +++ b/configuration.org @@ -2,81 +2,6 @@ This is a collection of functions and commands i wrote or stole from all around the internet. -** Window manipulation - -*** Bury a window - -#+begin_src emacs-lisp -(defun gpolonkai/bury-window (window) - "Quit WINDOW without killing it." - (interactive) - (quit-window nil window)) -#+end_src - -*** Scroll a specific window up or down - -#+begin_src emacs-lisp -(defun gpolonkai/scroll-window-up (window) - "Scroll WINDOW up as `scroll-up-command' would." - (interactive) - (save-selected-window - (select-window window) - (scroll-up))) - -(defun gpolonkai/scroll-window-down (window) - "Scroll WINDOW down as `scroll-down-command' would." - (interactive) - (save-selected-window - (select-window window) - (scroll-down))) -#+end_src - -*** Transpose windows - -#+begin_src emacs-lisp -(defun gpolonkai/transpose-windows (arg) - "Transpose the buffers shown in two windows." - (interactive "p") - (let ((selector (if (>= arg 0) 'next-window 'previous-window))) - (while (/= arg 0) - (let ((this-win (window-buffer)) - (next-win (window-buffer (funcall selector)))) - (set-window-buffer (selected-window) next-win) - (set-window-buffer (funcall selector) this-win) - (select-window (funcall selector))) - (setq arg (if (plusp arg) (1- arg) (1+ arg)))))) -#+end_src - -*** Toggle window split between horizontal and vertical - -#+begin_src emacs-lisp -(defun gpolonkai/toggle-window-split () - (interactive) - (if (= (count-windows) 2) - (let* ((this-win-buffer (window-buffer)) - (next-win-buffer (window-buffer (next-window))) - (this-win-edges (window-edges (selected-window))) - (next-win-edges (window-edges (next-window))) - (this-win-2nd (not (and (<= (car this-win-edges) - (car next-win-edges)) - (<= (cadr this-win-edges) - (cadr next-win-edges))))) - (splitter - (if (= (car this-win-edges) - (car (window-edges (next-window)))) - 'split-window-horizontally - 'split-window-vertically))) - (delete-other-windows) - (let ((first-win (selected-window))) - (funcall splitter) - (if this-win-2nd (other-window 1)) - (set-window-buffer (selected-window) this-win-buffer) - (set-window-buffer (next-window) next-win-buffer) - (select-window first-win) - (if this-win-2nd (other-window 1)))) - (error "This works only for two windows!"))) -#+end_src - ** Org-mode related *** Wrapper around ~org-agenda~ to open my own custom list diff --git a/init.el b/init.el index 41b611e..6b002c0 100644 --- a/init.el +++ b/init.el @@ -58,6 +58,7 @@ ;; Custom functions and commands (load "gpolonkai/utilities") +(load "gpolonkai/windows") ;; I started moving my configuration to this Org file. It’s easier to document this way. (org-babel-load-file (expand-file-name "configuration.org" user-emacs-directory)) diff --git a/lisp/gpolonkai/windows.el b/lisp/gpolonkai/windows.el new file mode 100644 index 0000000..e64be35 --- /dev/null +++ b/lisp/gpolonkai/windows.el @@ -0,0 +1,86 @@ +;;; gpolonkai/windows.el --- Window manipulation +;;; +;;; SPDX-License-Identifier: GPL-3.0-or-later +;;; Copyright © 2025 Gergely Polonkai +;;; This library is free software; you can redistribute it and/or +;;; modify it under the terms of the GNU Lesser General Public +;;; License as published by the Free Software Foundation; either +;;; version 3 of the License, or (at your option) any later version. +;;; +;;; This library is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; Lesser General Public License for more details. +;;; +;;; You should have received a copy of the GNU Lesser General Public +;;; License along with this library; if not, write to the +;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;;; Boston, MA 02111-1307, USA. +;;; +;;; Commentary: +;;; +;;; Utility functions stolen from the Internet or written by me +;;; +;;; Code: + +(defun gpolonkai/bury-window (window) + "Quit WINDOW without killing it (effectively burying it under other windows)." + (interactive) + (quit-window nil window)) + +(defun gpolonkai/scroll-window-up (window) + "Scroll WINDOW up as `scroll-up-command' would." + (interactive) + (save-selected-window + (select-window window) + (scroll-up))) + +(defun gpolonkai/scroll-window-down (window) + "Scroll WINDOW down as `scroll-down-command' would." + (interactive) + (save-selected-window + (select-window window) + (scroll-down))) + +(defun gpolonkai/transpose-windows (arg) + "Transpose the buffers shown in two windows." + (interactive "p") + (let ((selector (if (>= arg 0) 'next-window 'previous-window))) + (while (/= arg 0) + (let ((this-win (window-buffer)) + (next-win (window-buffer (funcall selector)))) + (set-window-buffer (selected-window) next-win) + (set-window-buffer (funcall selector) this-win) + (select-window (funcall selector))) + (setq arg (if (plusp arg) (1- arg) (1+ arg)))))) + +(defun gpolonkai/toggle-window-split () +"Toggle window split between horizontal and vertical." + (interactive) + (if (= (count-windows) 2) + (let* ((this-win-buffer (window-buffer)) + (next-win-buffer (window-buffer (next-window))) + (this-win-edges (window-edges (selected-window))) + (next-win-edges (window-edges (next-window))) + (this-win-2nd (not (and (<= (car this-win-edges) + (car next-win-edges)) + (<= (cadr this-win-edges) + (cadr next-win-edges))))) + (splitter + (if (= (car this-win-edges) + (car (window-edges (next-window)))) + 'split-window-horizontally + 'split-window-vertically))) + (delete-other-windows) + (let ((first-win (selected-window))) + (funcall splitter) + (if this-win-2nd (other-window 1)) + (set-window-buffer (selected-window) this-win-buffer) + (set-window-buffer (next-window) next-win-buffer) + (select-window first-win) + (if this-win-2nd (other-window 1)))) + (error "This works only for two windows!"))) + +(provide 'gpolonkai/windows) + +;;; windows.el ends here