我经常想要进行多行函数调用并将其减少到一行。例如,转换...
function_call(
'first_arg',
'second')
到
function_call('first_arg', 'second')
emacs是否有一些命令可以帮助解决这个问题。具体来说,是否有一个命令会删除从该点到第一个非空白字符的所有空格?
答案 0 :(得分:59)
您可以尝试delete-indentation
,这是我最喜欢的将多行连接成一行的命令。在您的示例中,将光标放在带有“second”的行上,然后按两次 M - ^ 。以下是文档:
M - ^ 运行命令
delete-indentation
,这是simple.el
中交互式编译的Lisp函数。它绑定到 M - ^ 。
(delete-indentation &optional arg)
将此行加入上一行并修复连接时的空格。如果有填充前缀,请从该行的开头删除它。使用参数,将此行连接到以下行。
答案 1 :(得分:27)
查看fixup-whitespace
功能。它在simple.el
中附带了Emacs。它的文档是:
修复点周围对象之间的空白区域。 根据上下文,留一个空格或不留空格。
类似的功能,just-one-space
,
删除点周围的所有空格和制表符,留下一个空格
通常绑定到 M-SPC 。
答案 2 :(得分:17)
具体来说,是否有一个命令会删除从该点到第一个非空白字符的所有空格?
有一个命令几乎可以做到:
M- \运行命令delete-horizontal-space 这是`simple.el'中的交互式编译Lisp函数。
它必然是M - \。
(delete-horizontal-space& optional back-only)
删除点周围的所有空格和制表符。 如果backward-only是非nil,则只在point之前删除它们。
答案 3 :(得分:6)
您始终可以使用M-z删除字符。
例如在你的情况下:
M-z'删除单引号(不幸的是,这也将删除单引号,但这是一个小小的不便)。
答案 4 :(得分:6)
我使用下面的宏将下一行“拉”到当前行的末尾,压缩空格。
(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
。
我使用pull-next-line
中的以下内容将M-J
绑定到J
(类似于Vim的.emacs
,用于“join”,命令)。
(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')
答案 5 :(得分:5)
Alt-space会将空格字符串减少为单个空格字符,但不会删除换行符。不过,这应该有所帮助。
要删除从点到第一个非空格(或换行符)的所有内容,请键入非空白字符,Alt-space,退格键(以删除最终的空格字符),然后退格(以删除您添加的字符。< / p>
要将多行函数声明转换为单行声明,请使用Alt-space,Backspace和Alt-E(goto-endofline)命令的组合。
答案 6 :(得分:4)
执行此操作的一种相当激烈的方式是Hungry-Delete模式:
Hungry-Delete是一种次要模式,会导致删除删除您要删除的方向上的所有空格。
答案 7 :(得分:3)
稍微不同的方法是创建一个键盘宏来为您完成工作。 所以,为了创建一个宏观阶段的一般情况如下:
foo
bar
[带有“foo”的行然后几行以及一些空格,写上“bar”]
然后站在foo和bar之间的任何地方,执行以下操作:
C-x ( ; start recording macro M-b ; move backwards to the beginning of foo END ; move to the end of foo C-space ; place mark C-M-f ; move to the end of bar HOME ; move to the beginning of the line C-w ; yank out all the white space M-SPACE ; leave only one space C-x ) ; end recording the macro M-x name-last-kbd-macro ; name it, call it jline or something
现在,您始终可以使用M-x单行删除两个单词之间的所有空格
确保您记得通过在.emacs文件中的某处发布M-x insert-kbd-macro来保存键盘宏 - 这就是它的外观:
(fset 'jline
[?\M-b end ?\C- ?\C-\M-f home ?\C-w escape ? ])
答案 8 :(得分: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 ,
答案 9 :(得分:1)
如果您希望所有删除操作都这样,您可以查看贪婪删除。