45

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

function_call(
     'first_arg',
     'second')

function_call('first_arg', 'second')

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

4

10 回答 10

64

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

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

它是必然的M-^

(delete-indentation &optional arg)

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

于 2009-01-15T01:46:22.677 回答
31

看一下fixup-whitespace功能。它带有 Emacs,在simple.el. 它的文档是:

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

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

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

通常绑定到M-SPC

于 2009-01-15T00:47:35.807 回答
21

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

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

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

它绑定到 M-\。

(delete-horizo​​ntal-space & optional back-only)

删除点周围的所有空格和制表符。如果向后仅是非零,则仅在点之前删除它们。

于 2009-01-15T05:19:28.303 回答
6

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

例如,在您的情况下:

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

于 2009-01-15T03:13:25.373 回答
6

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

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

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

pull-next-lineM-JJ.emacs.

(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')
于 2009-01-15T15:25:15.147 回答
5

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

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

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

于 2009-01-15T00:46:42.597 回答
4

这样做的一个相当激烈的方式是饥饿删除模式:

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

于 2010-09-14T04:01:46.383 回答
3

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

foo


               bar

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

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

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

现在,您始终可以使用 Mx 单行删除两个单词之间的所有空格

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

(fset 'jline
   [?\M-b end ?\C-  ?\C-\M-f home ?\C-w escape ? ])
于 2009-11-28T18:13:19.373 回答
1

我这样做:

(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 ,

于 2009-01-15T03:30:42.297 回答
1

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

于 2009-01-15T05:24:53.423 回答