【问题标题】:Emacs Command to Delete Up to Non-Whitespace CharacterEmacs 命令删除最多非空白字符
【发布时间】:2010-10-01 12:10:55
【问题描述】:

我经常想进行多行函数调用并将其减少到一行。比如转换...

function_call(
     'first_arg',
     'second')

到

function_call('first_arg', 'second')

emacs 是否有一些命令可以帮助解决这个问题。具体来说,是否有一个命令会删除从点到第一个非空白字符的所有空白?

【问题讨论】:

    标签: emacs whitespace


    【解决方案1】:

    Alt-space 会将一串空白字符减少为单个空格字符,但不会删除换行符。不过,这应该会有所帮助。

    要删除从点到第一个非空白字符(或换行符)的所有内容,请键入非空白字符、Alt-空格、退格(删除最后的空白字符),然后输入退格(删除您添加的字符。

    要将多行函数声明转换为单行声明,请结合使用 Alt-space、backspace 和 Alt-E (goto-endofline) 命令。

    【讨论】:

    • 感谢 Alt-space .. 刚刚搜索过,我知道必须存在类似的东西。只是不知道名称或键绑定。
    • 这很棒,我做了一个宏并将它绑定到一个键上。谢谢!
    【解决方案2】:

    看看fixup-whitespace 函数。它带有 Emacs,在 simple.el。它的文档是:

    修复点周围对象之间的空白。 根据上下文,留一个空格或不留一个空格。

    一个类似的函数,just-one-space,那个

    删除点周围的所有空格和制表符,留下一个空格

    通常绑定到 M-SPC。

    【讨论】:

    • M-SPACE 是“just-one-space”而不是“fixup-whitespace”。不过,它们似乎做的事情几乎相同。
    【解决方案3】:

    您可以尝试delete-indentation,这是我最喜欢的将多行合并为一行的命令。在您的示例中,将光标放在带有“second”的行上并点击 M-^ 两次。以下是文档:

    M-^ 运行命令delete-indentation,这是simple.el 中的交互式编译Lisp 函数。

    绑定到M-^。

    (delete-indentation &optional arg)

    将此行加入上一行并在加入时修复空白。如果有填充前缀,则从该行的开头将其删除。带参数,将此行加入下一行。

    【讨论】:

    • 不错的一个。我想知道在哪里可以找到这样的功能。对我帮助很大。
    【解决方案4】:

    您始终可以使用 M-z 删除最多一个字符。

    例如在你的情况下:

    M-z ' 删除单引号(不幸的是,这也会删除单引号,但这是一个小不便)。

    【讨论】:

    • 一个非常有用的技术。我正在养成双击字符键的习惯,以克服这个小缺点。
    【解决方案5】:

    我这样做:

    (defun move-line-up ()
      "Removes leading spaces from the current line, and then moves
    the current line to the end of the previous line."
      (interactive)
      (let (start end)
        (save-excursion
          (beginning-of-line)
          ; get first non-space character, only look on this line
          (let ((search-end (save-excursion (end-of-line) (point))))
            (re-search-forward "[^[:space:]]" search-end))
          (setq end (1- (point)))
          (previous-line)
          (end-of-line)
          (setq start (point))
          (delete-region start end))
        (goto-char start)))
    
    (defun move-next-line-up ()
      "Moves the next line to the end of the current line"
      (interactive)
      (next-line)
      (move-line-up))
    

    并将这些绑定为:

    (global-set-key (kbd "C-x ,") 'move-line-up)
    (global-set-key (kbd "C-x .") 'move-next-line-up)
    

    所以要解决你的问题,在写着“第二)”的那一行,运行C-x , C-x ,

    【讨论】:

      【解决方案6】:

      具体来说,是否有一个命令会删除从点到第一个非空白字符的所有空白?

      有一个命令几乎可以做到这一点:

      M-\ 运行命令 delete-horizo​​ntal-space 这是 `simple.el' 中的一个交互式编译的 Lisp 函数。

      它绑定到 M-\。

      (删除水平空格和可选的仅向后)

      删除点周围的所有空格和制表符。 如果backward-only 不为零,则只在点之前删除它们。

      【讨论】:

        【解决方案7】:

        如果您希望所有删除操作都以这种方式进行,您可以查看 greedy-delete。

        【讨论】:

          【解决方案8】:

          我使用以下宏将下一行“拉”到当前行的末尾,压缩空格。

          (defun pull-next-line() 
            (interactive) 
            (move-end-of-line 1) 
            (kill-line)
            (just-one-space))
          

          这与@jrockway 的move-line-up 和delete-indentation 完全相反,我觉得这更自然。宏中的just-one-space 命令正是@Mike 的M-SPACE。

          我在.emacs 中使用以下内容将pull-next-line 绑定到M-J(类似于Vim 的J,用于“加入”,命令)。

          (global-set-key (kbd "M-J") 'pull-next-line)
          

          示例。在第一行调用pull-next-line

          function_call(
               'first_arg',
               'second')
          

          产量

          function_call( 'first_arg',
               'second')
          

          再次调用它会产生

          function_call( 'first_arg', 'second')
          

          【讨论】:

            【解决方案9】:

            一种稍微不同的方法是创建一个键盘宏来为您完成这项工作。 因此,为了创建宏观阶段,一般情况如下:

            foo
            
            
                           bar
            

            [一行有“foo”,然后几行,还有一些空格,写成“bar”]

            然后站在 foo 和 bar 之间的任意位置,执行以下操作:

            C-x ( ; 开始录制宏 M-b ;向后移动到 foo 的开头 结尾 ;移动到 foo 的末尾 C-空间;地标 C-M-f ;移动到小节的末尾 家 ;移动到行首 CW ;拉出所有的空白 M-空间;只留一个空格 C-x);结束录制宏 M-x name-last-kbd-macro ;给它起个名字,叫它 jline 什么的

            现在您可以随时使用 M-x 单行删除两个单词之间的所有空格

            确保您记得通过在 .emacs 文件中的某处发出 M-x insert-kbd-macro 来保存您的键盘宏 - 这就是它的外观:

            (fset 'jline
               [?\M-b end ?\C-  ?\C-\M-f home ?\C-w escape ? ])
            

            【讨论】:

              【解决方案10】:

              一个相当激进的方法是Hungry-Delete模式:

              Hungry-Delete 是一种次要模式,它会导致删除以删除您要删除的方向上的所有空白。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-08-04
                • 1970-01-01
                • 1970-01-01
                • 2011-05-25
                • 2015-01-25
                • 1970-01-01
                • 1970-01-01
                • 2012-02-09
                相关资源
                最近更新 更多