通过Emacs,如何将两行合并为一行?

时间:2009-07-02 05:30:47

标签: emacs editor

我是Emacs的新手。我用谷歌搜索了这个但没有好的答案。其中之一是 Ctrl-n Ctrl-a Backspace 这有效,但很愚蠢。是否有一种快速简单的方法将一行线加入一行?

实际上,我现在可以使用Esc-q自动填充段落,但是如果没有UNDO,我怎么能让它恢复呢?

14 个答案:

答案 0 :(得分:176)

将点放在需要加入和调用的行组的 last 行的任意位置

M-^

重复直到合并所有行。

注意:它在所有现在连接的行之间留下一个空格。

答案 1 :(得分:32)

M-x join-line将加入两行。只需将其绑定到方便的按键。

答案 2 :(得分:8)

只需更换换行符。

答案 3 :(得分:7)

Multiple Cursors与M-^结合将所有选定的行折叠为一个删除了所有无关的空白区域。

例如,要选择整个缓冲区,调用多个游标模式,折叠成一行,然后禁用多个游标模式:

C-x h
M-x mc/edit-lines
M-^
C-g

答案 4 :(得分:5)

我喜欢Sublime文本的方式使用Command J加入行,所以我这样做:

(defun join-lines (arg)
  (interactive "p")
  (end-of-line)
  (delete-char 1)
  (delete-horizontal-space)
  (insert " "))

答案 5 :(得分:3)

您可以为此定义一个新命令,在使用Esc-q命令之前临时调整填充宽度:

;; -- define a new command to join multiple lines together --
(defun join-lines () (interactive)
 (setq fill-column 100000)
 (fill-paragraph nil)
 (setq fill-column 78)
)

显然,只有当你的段落少于100000个字符时,这才有效。

答案 6 :(得分:3)

我使用以下功能并将其绑定到' M-J'。

(defun concat-lines ()
  (interactive)
  (next-line)
  (join-line)
  (delete-horizontal-space))

如果您希望保持光标位置,可以使用save-excursion

答案 7 :(得分:3)

Emacs传统名称为"加入"是"填充"。是的,你可以加入 使用M-^ 两个行 - 这很方便 - 但更常见的是你会这样做 想加入n行。为此,请参阅fill*命令,例如 fill-regionfill-paragraph

有关详细信息,请参阅this 选择可以填补的东西。

答案 8 :(得分:0)

"如果没有UNDO,我怎么能让它恢复?":

(defun toggle-fill-paragraph ()
  ;; Based on http://xahlee.org/emacs/modernization_fill-paragraph.html
  "Fill or unfill the current paragraph, depending upon the current line length.
When there is a text selection, act on the region.
See `fill-paragraph' and `fill-region'."
  (interactive)
  ;; We set a property 'currently-filled-p on this command's symbol
  ;; (i.e. on 'toggle-fill-paragraph), thus avoiding the need to
  ;; create a variable for remembering the current fill state.
  (save-excursion
    (let* ((deactivate-mark nil)
           (line-length (- (line-end-position) (line-beginning-position)))
           (currently-filled (if (eq last-command this-command)
                                 (get this-command 'currently-filled-p)
                               (< line-length fill-column)))
           (fill-column (if currently-filled
                            most-positive-fixnum
                          fill-column)))
      (if (region-active-p)
          (fill-region (region-beginning) (region-end))
        (fill-paragraph))
      (put this-command 'currently-filled-p (not currently-filled)))))
(global-set-key (kbd "M-q") 'toggle-fill-paragraph)

答案 9 :(得分:0)

来自EmacsWiki: Unfill Paragraph

 ;;; Stefan Monnier <foo at acm.org>. It is the opposite of fill-paragraph    
    (defun unfill-paragraph (&optional region)
      "Takes a multi-line paragraph and makes it into a single line of text."
      (interactive (progn (barf-if-buffer-read-only) '(t)))
      (let ((fill-column (point-max))
            ;; This would override `fill-column' if it's an integer.
            (emacs-lisp-docstring-fill-column t))
        (fill-paragraph nil region)))

答案 10 :(得分:0)

因为join-line将在两行之间留一个空格,所以它仅支持连接两行。如果您想加入很多行而又没有一个空格,可以使用“搜索替换”模式来解决,如下所示:

  1. C-%
  2. 查询:输入C-q C-j Enter
  3. 替换:Enter
  4. 运行替换。 Enter

完成。

答案 11 :(得分:0)

2行基本连接:

(delete-indentation)

我希望在下面一行插入到当前行中而不移动光标:

("C-j" .
  (lambda (iPoint)
    "Join next line onto current line"
    (interactive "d")
    (next-line)
    (delete-indentation)
    (goto-char iPoint)))

答案 12 :(得分:0)

这个行为就像在 vscode 中一样。因此,仅当连接行包含除空格以外的其他内容时,它才会添加空格。我将它绑定到 alt+shift+j

基于 crux-top-join-line 的较短版本:

(global-set-key (kbd "M-J") (lambda () (interactive) (delete-indentation 1)))

基于 https://stackoverflow.com/a/33005183/588759 的更长版本。

;; https://stackoverflow.com/questions/1072662/by-emacs-how-to-join-two-lines-into-one/68685485#68685485
(defun join-lines ()
  (interactive)
  (next-line)
  (join-line)
  (delete-horizontal-space)
  (unless (looking-at-p "\n") (insert " ")))

(global-set-key (kbd "M-J") 'join-lines)

答案 13 :(得分:-1)

有史以来最简单的方式:

  
      
  1. M-hC-SPC
  2. 选择段落/行   
  3. M-q
  4.   
  5. 见证 Emagics(Emacs Magic)!!
  6.