From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Omar Polo Newsgroups: gmane.emacs.devel Subject: Re: POLL: make C-x o transient Date: Mon, 25 Jan 2021 18:21:43 +0100 Message-ID: <87blddlyoo.fsf@omarpolo.com> References: <2EFBBE54-62F4-4373-82D6-DC8750B648BA@kuaishou.com> <87eei9xb5r.fsf@mail.linkov.net> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="32945"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: mu4e 1.4.13; emacs 28.0.50 Cc: "condy0919@gmail.com" , Stefan Monnier , Zhiwei Chen , emacs-devel@gnu.org To: Juri Linkov Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Mon Jan 25 18:23:24 2021 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l45aG-0008T0-7U for ged-emacs-devel@m.gmane-mx.org; Mon, 25 Jan 2021 18:23:24 +0100 Original-Received: from localhost ([::1]:35964 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l45aF-0002xY-0m for ged-emacs-devel@m.gmane-mx.org; Mon, 25 Jan 2021 12:23:23 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:33554) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l45Yp-0002Hc-06 for emacs-devel@gnu.org; Mon, 25 Jan 2021 12:21:55 -0500 Original-Received: from mail.omarpolo.com ([144.91.116.244]:55423) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l45Yl-0000nY-JW for emacs-devel@gnu.org; Mon, 25 Jan 2021 12:21:54 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=omarpolo.com; s=20200327; t=1611595305; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zkwslc5eMSy6gzjLfCbnBjbxVqepbpLy3T72yggASdY=; b=GU+jZvfJbuHS2lplw52nzMaVApdbSTvCOfKx/sJ1xGj/s867b/od7rcR0G8WgEAhu8N6XU PMiGElOY13v+26iU1PSJoMhO+zkevuIHlffele6Ky6fbN/l9Xi+loXcvvT2WA5r/h81Ign XiCPO2zLzVwSI04xgRyd0jjJlkaw6WM= Original-Received: from localhost (host-80-116-112-105.pool80116.interbusiness.it [80.116.112.105]) by mail.omarpolo.com (OpenSMTPD) with ESMTPSA id 263dfb62 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 25 Jan 2021 18:21:45 +0100 (CET) Original-Received: from venera (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id 6909d53f; Mon, 25 Jan 2021 18:21:43 +0100 (CET) In-reply-to: <87eei9xb5r.fsf@mail.linkov.net> Received-SPF: pass client-ip=144.91.116.244; envelope-from=op@omarpolo.com; helo=mail.omarpolo.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:263398 Archived-At: Juri Linkov writes: >>> Which will make `C-x o` invoke a transient version of `other-window' >>> like `text-scale-adjust=E2=80=99 does. >> >> I think the pattern is clear: `C-x ` are good candidates ;-) > > And non-letters too, especially `C-x {`, `C-x }`, `C-x ^`, ... > need to be repeatable. I'm using such quite messy blob of code, > it would be nice if someone would generalize this mess > without using advice-add. FWIW, I completely agree, and I'm using various hydras to achieve the same (defhydra hydra-other-window (global-map "C-x") ("o" other-window "next window") ("O" (other-window -1) "previous window")) (defhydra hydra-grep-like (global-map "M-g") ("n" next-error "next") ("p" previous-error "prev") ("RET" nil :exit t) ("q" nil :exit t)) (defhydra hydra-windowsize (global-map "C-x") ("{" shrink-window-horizontally) ("}" enlarge-window-horizontally)) (defhydra hydra-pages (global-map "C-x" :hint nil) ("[" backward-page) ("]" forward-page) ("RET" nil :exit t) ("q" nil :exit t)) (defhydra hydra-hscroll (global-map "C-x" :hint nil) (">" scroll-left) ("<" scroll-right)) > #+begin_src emacs-lisp > (defvar window-command-keymap > (let ((map (make-sparse-keymap))) > ;; Standard keys: > (define-key map "0" 'delete-window) > (define-key map "1" 'delete-other-windows) > (define-key map "2" 'split-window-below) > (define-key map "3" 'split-window-right) > (define-key map "o" 'other-window) > (define-key map "^" 'enlarge-window) > (define-key map "}" 'enlarge-window-horizontally) > (define-key map "{" 'shrink-window-horizontally) > (define-key map "-" 'shrink-window-if-larger-than-buffer) > (define-key map "+" 'balance-windows) > ;; Additional keys: > (define-key map "v" 'shrink-window) > (define-key map [down] 'shrink-window) > (define-key map [up] 'enlarge-window) > (define-key map [left] 'shrink-window-horizontally) > (define-key map [right] 'enlarge-window-horizontally) > map) > "Keymap for commands that operate on windows.") > > (advice-add 'enlarge-window-horizontally > :after (lambda (&rest _args) > (set-transient-map window-command-keymap))) > (advice-add 'shrink-window-horizontally > :after (lambda (&rest _args) > (set-transient-map window-command-keymap))) > (advice-add 'enlarge-window > :after (lambda (&rest _args) > (set-transient-map window-command-keymap))) > (advice-add 'shrink-window > :after (lambda (&rest _args) > (set-transient-map window-command-keymap))) > (defun window-command-prefix () > (interactive) > (message "Use window prefix keys...") > (set-transient-map window-command-keymap)) > (define-key ctl-x-map "wr" window-command-prefix) > > ;; (define-key window-command-keymap [digit-argument] 'ignore) > ;; (define-key window-command-keymap [universal-argument] 'ignore) > ;; (define-key window-command-keymap [?\C-u] 'universal-argument) > #+end_src