我经常希望将多行函数调用转化为一行。例如,将...
function_call(
'first_arg',
'second')
function_call('first_arg', 'second')
Emacs是否有一些命令来帮助完成这个任务?具体而言,是否有一个命令可以从光标位置到第一个非空白字符删除所有空白字符?
我经常希望将多行函数调用转化为一行。例如,将...
function_call(
'first_arg',
'second')
function_call('first_arg', 'second')
Emacs是否有一些命令来帮助完成这个任务?具体而言,是否有一个命令可以从光标位置到第一个非空白字符删除所有空白字符?
你可以尝试使用我的最爱命令delete-indentation
来将多行合并成一行。在你的例子中,将光标放在"second"所在的那一行,然后按两次M-^键。以下是文档:
M-^键执行
delete-indentation
命令,它是一个交互式的编译过的Lisp函数,位于simple.el
文件中。它绑定到M-^键上。
(delete-indentation &optional arg)
将当前行与上一行连接,并在连接处修复空格。如果存在填充前缀,则从该行开头删除它。使用参数时,将当前行与下一行连接。
fixup-whitespace
函数。它是Emacs中的一个函数,在simple.el
文件中。这里是它的文档:
类似的函数还有整理点附近对象之间的空白,根据上下文留下一个空格或者不留。
just-one-space
,它会删除光标周围所有的空格和制表符,只留下一个空格。通常将其绑定到M-SPC。您可以始终使用M-z删除一个字符。
例如,在您的情况下:
M-z '可以删除单引号(不幸的是,这也会删除单引号,但这只是一个小问题)。
(defun pull-next-line()
(interactive)
(move-end-of-line 1)
(kill-line)
(just-one-space))
move-line-up
和delete-indentation
相反,我发现后者更自然。宏中的just-one-space
命令恰好是@Mike的 M-SPACE
。
我将pull-next-line
绑定到M-J
(类似于Vim的 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+空格将把一串空格缩减为一个单个空格字符,但不会删除换行符。这应该有所帮助。
要删除从光标到第一个非空格字符(或换行符)的所有内容,请键入一个非空格字符,然后依次按下Alt+空格、退格键(删除最后一个空格字符),再次按下退格键(删除您添加的字符)。
要将多行函数声明转换为单行声明,请使用组合的Alt+空格、退格和Alt+E(转到行尾)命令。
一个稍微不同的方法是创建一个键盘宏来为您完成这项工作。因此,要创建宏阶段,可以像下面这样进行一般情况的设想:
foo
bar
[一行文字中包含 "foo",然后几行后有一些空格,再写 "bar"]
然后在 foo 和 bar 之间的任何位置,执行以下操作:
C-x ( ; 开始录制宏 M-b ; 向后移动到 foo 的开头 END ; 移动到 foo 的结尾 C-space ; 标记 C-M-f ; 移动到 bar 的结尾 HOME ; 移动到行的开头 C-w ; 删除所有空格 M-SPACE ; 只留一个空格 C-x ) ; 结束录制宏 M-x name-last-kbd-macro ; 命名它,称其为 jline 或其他名称
现在您可以使用 M-x one-line 始终删除两个单词之间的所有空格。
请确保在您的 .emacs 文件中发出 M-x 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)
所以为了解决你的问题,在代码中写有"second)"的那一行,只需要运行C-x , C-x ,
即可。