用于删除最多非空白字符的Emacs命令

emacs whitespace 匿名 | 2020-02-27 02:21:13


我经常想做一个多行函数调用,并把它减少到一行。例如,将…
function_call(
'first_arg',
'second')

转换为
function_call('first_arg', 'second')

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





10 答案



您可以尝试
delete-indentation
,这是我最喜欢的将多行合并成一行的命令。在您的示例中,将光标放在带有“second”的行上,然后按M-^两次。这里是文档:
M-^运行命令
delete-indentation
,这是
simple.el

中的交互式编译Lisp函数,它绑定到M-^。
(delete-indentation &optional arg)

将这一行连接到previous,并在连接时修复空白。如果有填充前缀,请从此行的开头将其删除。带参数,将这一行连接到下一行。

2020-02-27 02:21:25
匿名


查看
fixup-whitespace
函数。它带有Emacs,位于
simple.el
中。它的文档是:
修复点周围对象之间的空白。
根据上下文,保留一个空格或不保留一个空格。
一个类似的函数,
just-one-space
删除点周围的所有空格和制表符,保留一个空格
通常绑定到M-SPC。

2020-02-27 02:21:40
匿名


具体来说,是否有一个命令可以删除从点到第一个非空白字符的所有空白?
有一个命令几乎可以做到这一点:
M-\运行命令delete horizontal space
这是一个在“simple.el”中交互式编译的Lisp函数。
它绑定到M-\。
(delete horizontal space&optional backward only)
删除点周围的所有空格和制表符。
如果backward only不是nil,只在点之前删除。

2020-02-27 02:21:56
匿名


我使用下面的宏将下一行“拉”到当前行的末尾,压缩空白。
(defun pull-next-line() 
(interactive)
(move-end-of-line 1)
(kill-line)
(just-one-space))

这与@jrockway的
move-line-up
delete-indentation
正好相反,我觉得这更自然。]
示例。在
function_call(
'first_arg',
'second')
的第一行调用
pull-next-line

产生
function_call( 'first_arg',
'second')

第二次调用它产生
function_call( 'first_arg', 'second')

2020-02-27 02:22:39
匿名


您始终可以使用M-z删除最多一个字符。
例如,在您的案例中:
M-z'删除单个报价(不幸的是,这也会删除单个报价,但这是一个小的不便)。

2020-02-27 02:22:18
匿名


Alt space会将一个空白字符串减少为一个空格字符,但不会删除换行符。不过,这还是有点帮助的。
要删除从point到第一个非空白字符(或换行符)的所有内容,请键入非空白字符、Alt空格、backspace(删除最后的空白字符),然后backspace(删除添加的字符。
要将多行函数声明转换为单行声明,使用Alt space、backspace和Alt-E(goto endofline)命令的组合。

2020-02-27 02:23:04
匿名


一个相当极端的方法是Hungry Delete模式:
Hungry Delete是一个小模式,它会导致Delete删除您要删除的方向上的所有空白。

2020-02-27 02:23:17
匿名


另一个稍微不同的方法是创建一个键盘宏来完成这项工作。
因此,对于创建宏阶段,一般情况下是这样的:
foo

bar

[一行“foo”,然后几行,再加上一些空格,写“bar”]
然后站在foo和bar之间,执行以下操作:
C-x(;开始录制宏
M-b;向后移到foo的开始
结束;移到foo的结束
C-space;放置标记
C-M-f;移到bar的结束
HOME;移到行的开头;抽出所有空白;只留下一个空白;结束记录宏;将其命名为,现在,您可以用M-x一行来删除两个单词之间的所有空格,确保您记得通过在.emacs文件中的某个位置发出M-x insert kbd宏来保存键盘宏,这就是它的外观:
(fset 'jline
[?\M-b end ?\C- ?\C-\M-f home ?\C-w escape ? ])

2020-02-27 02:23:34
匿名


我这样做:
(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 "[^[]]" 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 ,

2020-02-27 02:23:51
匿名


如果你想让所有的删除都这样做,你可能会签出贪婪的删除。

2020-02-27 02:24:01
匿名


World is powered by solitude
备案号:湘ICP备19012068号