Emacs命令删除非空白字符

时间:2009-01-15 00:37:15

标签: emacs whitespace

我经常想要进行多行函数调用并将其减少到一行。例如,转换...

function_call(
     'first_arg',
     'second')

function_call('first_arg', 'second')

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

10 个答案:

答案 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-horizo​​ntal-space     这是`simple.el'中的交互式编译Lisp函数。

     

它必然是M - \。

     

(delete-horizo​​ntal-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-updelete-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)

如果您希望所有删除操作都这样,您可以查看贪婪删除。