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