From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Sean Whitton Newsgroups: gmane.emacs.bugs Subject: bug#69097: [PATCH] Add 'kill-region-or-word' command Date: Fri, 06 Sep 2024 14:54:58 +0100 Message-ID: <87r09wvqdp.fsf@zephyr.silentflame.com> References: <871q9g8z8k.fsf@posteo.net> <874jbe65u0.fsf@posteo.net> <8634qwkbtc.fsf@mail.linkov.net> <86h6fceij2.fsf@gnu.org> <87edaeevmr.fsf@zephyr.silentflame.com> <87a5l2evdn.fsf@zephyr.silentflame.com> <86ikzqbzac.fsf@gnu.org> <87seujf8bb.fsf@posteo.net> <867cbu9uce.fsf@gnu.org> <87cyllg57r.fsf@posteo.net> <87zfopbxdk.fsf@zephyr.silentflame.com> <87seuhbx87.fsf@zephyr.silentflame.com> <87zfopep5q.fsf@posteo.net> <86r0a16i71.fsf@gnu.org> <877cbshf4h.fsf@posteo.net> <87a5gnzf5f.fsf@zephyr.silentflame.com> <87y146jv6z.fsf@posteo.net> <87ikvaxmbm.fsf@zephyr.silentflame.com> <871q1yw4fz.fsf@posteo.net> <877cbpvzkm.fsf@zephyr.silentflame.com> <86frqd10k1.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="14790"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: philipk@posteo.net, rms@gnu.org, 69097@debbugs.gnu.org, juri@linkov.net, stefankangas@gmail.com, acorallo@gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Sep 06 15:56:17 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1smZRg-0003ba-Bw for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 06 Sep 2024 15:56:16 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1smZRV-0003Ll-ET; Fri, 06 Sep 2024 09:56:05 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1smZRT-0003Ke-5V for bug-gnu-emacs@gnu.org; Fri, 06 Sep 2024 09:56:03 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1smZRS-0003GJ-Sc for bug-gnu-emacs@gnu.org; Fri, 06 Sep 2024 09:56:02 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=MIME-Version:Date:References:In-Reply-To:From:To:Subject; bh=X7RoJ3YTnzgykbjTg4wGFX+K33ZQKsRSzNIX6ScTUyQ=; b=govzyQUBKQTXX0VE9yV4vIvIXRSXfV9dgN9PPn2mnEO04Q8HJe5CxZkLfTuwkAufdKbZ2M14yaJLu1roe02XETCzlMsYyRVDabJGLlL8GeFcCtw+zbxcnq1ECbxpH/kOaVwLoL0h8vX++JhKHzgBOLyy4lG3kGMAwzdIaplTY47M31DKUgupCi4wun9OIOt/DyJ1CGRLHa7lwURA78TVwO2KeWUuPXPKIKTNc3m5mam6Kgd+wHGG11XoOAJ9UsVpHnMh+EWA5Qd3N5i5xJmxIuiAaI+4TOfNXgYxewilyl48uGUdmEjji6wEyQROexjnrzWpdhy32X4ROYJ1oILzVA==; Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1smZRR-0000uN-Sh for bug-gnu-emacs@gnu.org; Fri, 06 Sep 2024 09:56:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Sean Whitton Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 06 Sep 2024 13:56:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 69097 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 69097-submit@debbugs.gnu.org id=B69097.17256309142328 (code B ref 69097); Fri, 06 Sep 2024 13:56:01 +0000 Original-Received: (at 69097) by debbugs.gnu.org; 6 Sep 2024 13:55:14 +0000 Original-Received: from localhost ([127.0.0.1]:52552 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1smZQf-0000bP-Bt for submit@debbugs.gnu.org; Fri, 06 Sep 2024 09:55:13 -0400 Original-Received: from sendmail.purelymail.com ([34.202.193.197]:57596) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1smZQZ-0000SR-Cd for 69097@debbugs.gnu.org; Fri, 06 Sep 2024 09:55:11 -0400 DKIM-Signature: a=rsa-sha256; b=RS/WLF7C4KAzomaMIFLFTeTdEp41BcnyUhzfprWT70yvuN9rRNAiwVq+Wfrfb0YudcFcgaZmrGccjVvaL7LRejxon7mylwRDjLkEIBGscQSXcGQisL+qiJvnZiYVW5zIzN8o/hCND2ydjAQnIL2y7DIfyGvU3E3tcXZWQfAG+fFLOp80nPbar4Re4cIkyGe6BkdxIHbBU9Tgo2jVEDkkwKA+VvK3/r/sJyAOs+kmgo1mezwaPu6XwrKVtIi0YHXlNLLyAf8Sq/ZYpcHRsx0D95+4PuQQkwU6YHoF3vQ0bFT5Aa9f6gWXdbZEtI3Sliq/OWha62cowWqAwHtSy3NEew==; s=purelymail1; d=spwhitton.name; v=1; bh=XsRNMUAbZUmdYcQ4A5M0cEXDOYM2yqURolKMyktfL8o=; h=Received:Received:From:To:Subject:Date; DKIM-Signature: a=rsa-sha256; b=HBI3p47WZLxeW9IfjkqQCsNPzKrwfkmHgzp2wD/KYK5o9s/QMZmBQJt0YdtAgvf9sTyLKXpGxnmv789mWeRH08AWkU6Zj/HL8pN1bxmijN1+WAAPY/u96Ql2d2h7zYcM8v0q2l35YOLytqIdcIYwiRx0ffRPZTvrxiuCoXHZxtBD7ZUhgenxR3DsnafmQqEQ+SX8lI6xR6UIYL2yx/hc7bNonJXDtGIM5slYdkIU+uxTAQxDLCi5cehYjh/JC4JLgCs0E2SWWBS1d6YaufNMbf6/wjPAdAL1mW/nb6USyJvzhs1GNDCrk3NQBRXoSkALwcanQK8sXCrt954INZe4Gg==; s=purelymail1; d=purelymail.com; v=1; bh=XsRNMUAbZUmdYcQ4A5M0cEXDOYM2yqURolKMyktfL8o=; h=Feedback-ID:Received:Received:From:To:Subject:Date; Feedback-ID: 20115:3760:null:purelymail X-Pm-Original-To: 69097@debbugs.gnu.org Original-Received: by smtp.purelymail.com (Purelymail SMTP) with ESMTPSA id 1129177749; (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384); Fri, 06 Sep 2024 13:54:59 +0000 (UTC) Original-Received: by zephyr.silentflame.com (Postfix, from userid 1000) id 5FE74949A14; Fri, 6 Sep 2024 14:54:58 +0100 (BST) In-Reply-To: <86frqd10k1.fsf@gnu.org> (Eli Zaretskii's message of "Fri, 06 Sep 2024 14:30:54 +0300") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:291314 Archived-At: --=-=-= Content-Type: text/plain Hello, On Fri 06 Sep 2024 at 02:30pm +03, Eli Zaretskii wrote: > Thanks, but I see no reason to document this command in the manual, > certainly not in the ELisp reference (it's a command, not a function). > IMO it's obscure enough to be documented only in NEWS. That's quite fine with me. > Should this be "[:space:]\\n\\r" instead? if not, why not? > > Also note that [:space:] depends on mode-specific syntax table, so I > question the wisdom of using it in a command that's supposed to be > mode-agnostic. Both excellent points, thank you. I looked at the POSIX standard and came up with a new default value. >> +This command is like `forward-word' except that words are always >> +delimited by whitespace, regardless of the buffer's syntax table. >> +Like `forward-word', this command respects fields. >> + >> +This emulates how C-w at the Unix terminal or shell identifies words. >> +See the `unix-word-rubout' command in Info node `(readline)Commands For >> +Killing'." > > This should try to be more explicit about what "word" means for this > command. Since it's so different from any notion of "word" in Emacs, > I would even seriously consider not to use that word, or maybe quote > it (in addition to explaining what it means). This is very helpful. You're right. In the attached, I've tried using "unix-word". Let me know what you think of that. > Also, since this is a command, its doc string should clearly separate > what happens in interactive invocation from what happens when called > from Lisp. DELIM belongs to the latter. (Is it even useful to > provide that option for Lisp-only calls? what's the use case for > that?) > > And finally, I wonder why we need this command? AFAIU, the original > intent was to implement something similar to unix-word-rubout, not a > new movement command. If the plan has changed, I think we need to > discuss the need once again. I think it was unhelpful of me to send this in without callers. I'm sorry about that. The reason for adding this is that it factors out what is in common between what Philip is doing, and unix-word-rubout. So in the attached revised patch, I've included unix-word-rubout. I've also included a second readline command which I have bound in my own init. It demonstrates why there is a need for DELIM. By the way, forward-unix-word could also be a plain function. I made it a command because, well, why not. Let me know if you think it should be switched back to a function. -- Sean Whitton --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-New-commands-for-moving-and-killing-unix-words.patch >From c047e640399bb923728ed9967e8545d53b22ea5c Mon Sep 17 00:00:00 2001 From: Sean Whitton Date: Fri, 6 Sep 2024 11:35:46 +0100 Subject: [PATCH] New commands for moving and killing unix-words * lisp/simple.el (forward-unix-word, unix-word-rubout) (unix-filename-rubout): New commands. * etc/NEWS: Document them. --- etc/NEWS | 7 +++++++ lisp/simple.el | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index f3e719a34d3..54cf0a3df52 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -123,6 +123,13 @@ When using 'visual-wrap-prefix-mode' in buffers with variable-pitch fonts, the wrapped text will now be lined up correctly so that it's exactly below the text after the prefix on the first line. +--- +** New commands for moving and killing unix-words. +Unix-words are words separated by whitespace regardless of the buffer's +syntax table. In a Unix terminal or shell, C-w kills by unix-word. +The new commands 'forward-unix-word', 'unix-word-rubout' and +'unix-filename-rubout' allow you to bind keys to operate more similarly +to the terminal. * Changes in Specialized Modes and Packages in Emacs 31.1 diff --git a/lisp/simple.el b/lisp/simple.el index 2453a129d0a..0322ac0cd8c 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -8892,6 +8892,63 @@ current-word ;; If we found something nonempty, return it as a string. (unless (= start end) (buffer-substring-no-properties start end))))) + +(defun forward-unix-word (arg &optional delim) + "Move forward ARG unix-words. +A unix-word is whitespace-delimited. +Interactively, ARG is the numeric prefix argument, defaulting to 1. +A negative ARG means go backwards to the beginning of unix-words. + +Unix-words differ from Emacs words in that they are always delimited by +whitespace, regardless of the buffer's syntax table. This command +emulates how C-w at the Unix terminal or shell identifies words. + +When called from Lisp, DELIM specifies what characters are considered +whitespace. It is a string as might be passed to `skip-chars-forward'. +The default is \" \\f\\n\\r\\t\\v\". Do not prefix a `^' character." + (interactive "^p") + (unless (zerop arg) + ;; We do skip over newlines by default because `backward-word' does. + (let* ((delim (or delim " \f\n\r\t\v")) + (ndelim (format "^%s" delim)) + (start (point)) + (fun (if (> arg 0) + #'skip-chars-forward + #'skip-chars-backward))) + (dotimes (_ (abs arg)) + (funcall fun delim) + (funcall fun ndelim)) + (constrain-to-field nil start)))) + +(defun unix-word-rubout (arg) + "Kill ARG unix-words backwards. +A unix-word is whitespace-delimited. +Interactively, ARG is the numeric prefix argument, defaulting to 1. +A negative ARG means to kill forwards. + +Unix-words differ from Emacs words in that they are always delimited by +whitespace, regardless of the buffer's syntax table. Thus, this command +emulates C-w at the Unix terminal or shell identifies words. +See also this command's nakesake in Info node +`(readline)Commands For Killing'." + (interactive "^p") + (let ((start (point))) + (forward-unix-word (- arg)) + (kill-region start (point)))) + +(defun unix-filename-rubout (arg) + "Kill ARG unix-words backwards, also treating `/' as whitespace. +A unix-word is whitespace-delimited. +Interactively, ARG is the numeric prefix argument, defaulting to 1. +A negative ARG means to kill forwards. + +This is like `unix-word-rubout' (which see), but `/' is also considered +whitespace. See this command's namesake in Info node +`(readline)Commands For Killing'." + (interactive "^p") + (let ((start (point))) + (forward-unix-word (- arg) "/ \f\n\r\t\v") + (kill-region start (point)))) (defcustom fill-prefix nil "String for filling to insert at front of new line, or nil for none." -- 2.39.2 --=-=-=--