我经常想进行多行函数调用并将其减少到一行。例如,转换...
function_call(
'first_arg',
'second')
到
function_call('first_arg', 'second')
emacs 是否有一些命令可以帮助解决这个问题。具体来说,是否有一个命令会删除从该点到第一个非空白字符的所有空白?
我经常想进行多行函数调用并将其减少到一行。例如,转换...
function_call(
'first_arg',
'second')
到
function_call('first_arg', 'second')
emacs 是否有一些命令可以帮助解决这个问题。具体来说,是否有一个命令会删除从该点到第一个非空白字符的所有空白?
你可以试试delete-indentation
,我最喜欢的将多行合并为一行的命令。在您的示例中,将光标放在“第二”行并点击M-^两次。以下是文档:
M-^运行命令
delete-indentation
,这是一个交互式编译的 Lisp 函数simple.el
。它是必然的M-^。
(delete-indentation &optional arg)
将此行加入上一行并在加入时修复空白。如果有填充前缀,则从该行的开头将其删除。使用参数,将此行加入下一行。
看一下fixup-whitespace
功能。它带有 Emacs,在simple.el
. 它的文档是:
修复点周围对象之间的空白。根据上下文,留一个空格或不留一个空格。
一个类似的函数,just-one-space
,
删除点周围的所有空格和制表符,留下一个空格
通常绑定到M-SPC。
具体来说,是否有一个命令会删除从该点到第一个非空白字符的所有空白?
有一个命令几乎可以做到这一点:
M-\ 运行命令 delete-horizontal-space,它是 `simple.el' 中的交互式编译 Lisp 函数。
它绑定到 M-\。
(delete-horizontal-space & optional back-only)
删除点周围的所有空格和制表符。如果向后仅是非零,则仅在点之前删除它们。
您始终可以使用 Mz 删除最多一个字符。
例如,在您的情况下:
Mz ' 删除单引号(不幸的是,这也会删除单引号,但这是一个小不便)。
我使用以下宏将下一行“拉”到当前行的末尾,压缩空格。
(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-line
在M-J
我J
的.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')
Alt-space 会将一串空白字符减少为单个空格字符,但不会删除换行符。不过,这应该会有所帮助。
要删除从点到第一个非空白字符(或换行符)的所有内容,请键入非空白字符、Alt-空格、退格(删除最终的空白字符),然后输入退格(删除您添加的字符。
要将多行函数声明转换为单行声明,请结合使用 Alt-space、backspace 和 Alt-E (goto-endofline) 命令。
这样做的一个相当激烈的方式是饥饿删除模式:
Hungry-Delete 是一种次要模式,它会导致删除以删除您要删除的方向上的所有空白。
稍微不同的方法是创建一个键盘宏来为您完成这项工作。因此,为了创建宏观阶段,一般情况如下:
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 ? ])
我这样做:
(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 ,
如果您希望所有删除都以这种方式进行,您可以查看 greedy-delete。