【问题标题】:delete (NOT kill) a line in emacs. External clipboard is not appended to the kill ring删除(不杀死)emacs 中的一行。外部剪贴板未附加到杀伤环
【发布时间】:2011-12-07 20:57:24
【问题描述】:

很多时候我发现自己需要粘贴一条从任何地方到 emacs 的 minibuffer 的路径。为了快速清除小缓冲区,我导航到开头并执行 C-k(杀戮线)。

这有效地用我刚刚在迷你缓冲区中杀死的临时路径覆盖了我在系统剪贴板中的任何路径。用 M-y 导航 kill ring 不会带来我在系统剪贴板中的路径。

有没有办法删除当前行而不杀死它(即删除它并将其添加到终止环)?

到目前为止,我正在标记该行并按下 delete 并激活 delete-selection-mote。我想要一个类似于 C-k 的一键解决方案。

【问题讨论】:

  • 不,他在询问文本删除的特定子集,即行,类似于 C-k(杀死其余行)。另一个问题更笼统。
  • 对于这个特定的例子,如果路径是绝对的(例如以/~ 开头,或者像C:/ 对于NTEmacs),那么你可能不需要删除已经在那里,因为 Emacs 可以识别新路径的开始并忽略前面的文本。 find-file 肯定是这种情况,我想,对于任何调用 read-file-name
  • 路径可以是绝对的或相对的。重点是完全删除迷你缓冲区中的任何内容。此外,我想要一种通用的方法来删除一条线而不将其附加到杀伤环
  • 您是否考虑过简单地移动到要插入文本的位置,将其粘贴进去,然后删除剩余的文本?

标签: emacs


【解决方案1】:

从 Emacs 23.2 开始,您可以将 save-interprogram-paste-before-kill 设置为非零值(提示 Tyler)以将剪贴板选择复制到 kill ring 上,以便通过 Cy My kbd>:

(setq save-interprogram-paste-before-kill t)

如果您使用的是旧版 Emacs,以下建议具有相同的功能:

(defadvice kill-new (before kill-new-push-xselection-on-kill-ring activate)
  "Before putting new kill onto the kill-ring, add the clipboard/external selection to the kill ring"
  (let ((have-paste (and interprogram-paste-function
                         (funcall interprogram-paste-function))))
    (when have-paste (push have-paste kill-ring))))

而且,你可以做这样的事情(可怕的键绑定,自定义以适应)来从前面删除该行:

(define-key minibuffer-local-map (kbd "C-S-d") 'delete-line)
(defun delete-line (&optional arg)
  (interactive "P")
  ;; taken from kill-line
  (delete-region (point)
                 ;; It is better to move point to the other end of the kill
                 ;; before killing.  That way, in a read-only buffer, point
                 ;; moves across the text that is copied to the kill ring.
                 ;; The choice has no effect on undo now that undo records
                 ;; the value of point from before the command was run.
                 (progn
                   (if arg
                       (forward-visible-line (prefix-numeric-value arg))
                     (if (eobp)
                         (signal 'end-of-buffer nil))
                     (let ((end
                            (save-excursion
                              (end-of-visible-line) (point))))
                       (if (or (save-excursion
                                 ;; If trailing whitespace is visible,
                                 ;; don't treat it as nothing.
                                 (unless show-trailing-whitespace
                                   (skip-chars-forward " \t" end))
                                 (= (point) end))
                               (and kill-whole-line (bolp)))
                           (forward-visible-line 1)
                         (goto-char end))))
                   (point))))

【讨论】:

  • 我认为这复制了save-interprogram-paste-before-kill的功能?
  • @Tyler 荣耀,确实如此。我会适当地更新我的答案(以及我的 .emacs)。谢谢。
  • 这非常有用。向你和泰勒致敬。
【解决方案2】:

从 Emacs 23.2 开始,这个问题可以通过 save-interprogram-paste-before-kill 解决。如果将此变量设置为t,则剪贴板中的内容将被添加到杀戮环中,并且不会被您的下一次杀戮丢弃。

文档:

在替换之前将剪贴板字符串保存到 kill ring 中。 当一个人在另一个程序中选择某些东西并将其粘贴到 Emacs 中时, 但是在实际粘贴之前在 Emacs 中杀死了一些东西, 除非此变量为非零,否则此选择消失, 在这种情况下,其他程序的选择将保存在“kill-ring”中 在 Emacs 杀死之前,仍然可以使用 C-y M-y 粘贴它。

【讨论】:

    【解决方案3】:

    来自Xahlee's page,它显示了几个令人讨厌的命令。

    (defun my-delete-word (arg)
      "Delete characters forward until encountering the end of a word.
    With argument, do this that many times.
    This command does not push erased text to kill-ring."
      (interactive "p")
      (delete-region (point) (progn (forward-word arg) (point))))
    
    (defun my-backward-delete-word (arg)
      "Delete characters backward until encountering the beginning of a word.
    With argument, do this that many times.
    This command does not push erased text to kill-ring."
      (interactive "p")
      (my-delete-word (- arg)))
    
    (defun my-delete-line ()
      "Delete text from current position to end of line char."
      (interactive)
      (delete-region
       (point)
       (save-excursion (move-end-of-line 1) (point)))
      (delete-char 1)
    )
    
    (defun my-delete-line-backward ()
      "Delete text between the beginning of the line to the cursor position."
      (interactive)
      (let (x1 x2)
        (setq x1 (point))
        (move-beginning-of-line 1)
        (setq x2 (point))
        (delete-region x1 x2)))
    
    ; Here's the code to bind them with emacs's default shortcut keys:
    
    (global-set-key (kbd "M-d") 'my-delete-word)
    (global-set-key (kbd "<M-backspace>") 'my-backward-delete-word)
    (global-set-key (kbd "C-k") 'my-delete-line)
    (global-set-key (kbd "C-S-k") 'my-delete-line-backward)
    

    【讨论】:

      【解决方案4】:

      没有。

      来自GNU Emacs Manual

      我们已经描述了基本的删除命令 C-d (delete-char) 和 (delete-backward-char)。请参阅擦除。

      其他删除命令是那些只删除空格的命令 字符:空格、制表符和换行符。 M-\(删除水平空间) 删除点前后的所有空格和制表符。和 一个前缀参数,这只会删除之前的空格和制表符 观点。 M- (just-one-space) 也一样,但只留下一个空格 一个接一个的空格,无论存在多少空格 以前(即使以前没有)。带有数字参数 n,它在点之后留下n个空格。

      【讨论】:

      • 任何人都有宏移动到行尾,激活标记,移动到行首然后清除选择?:P
      【解决方案5】:

      类似的东西呢:

      (defun del-line (p1)
        (interactive "d")
        (move-end-of-line 1)
        (when (eq p1 (point)) ; special case when p1 is already at the end of the line
           (forward-line))
        (delete-region p1 (point)))
      

      行为应该类似于C-k,但不会影响系统剪贴板或kill-ring。

      ETA:我更仔细地阅读了 Trey 的解决方案,看起来这只是他解决方案的一个简单案例。它在我(非常!)有限的测试中有效,但在一些更复杂的杀戮线代码正常工作的特殊情况下可能会失败。

      【讨论】:

        【解决方案6】:

        找到了答案。

        先发在这里:https://unix.stackexchange.com/questions/26360/emacs-deleting-a-line-without-sending-it-to-the-kill-ring/136581#136581

        ;; Ctrl-K with no kill
        (defun delete-line-no-kill ()
          (interactive)
          (delete-region
           (point)
           (save-excursion (move-end-of-line 1) (point)))
         (delete-char 1)
        )
        (global-set-key (kbd "C-k") 'delete-line-no-kill)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-21
          • 1970-01-01
          相关资源
          最近更新 更多