web-dev-qa-db-ja.com

空白以外の文字まで削除するEmacsコマンド

複数行の関数呼び出しを行い、それを1行に減らしたいことがよくあります。たとえば、変換...

function_call(
     'first_arg',
     'second')

function_call('first_arg', 'second')

Emacsにはこれを支援するいくつかのコマンドがありますか?具体的には、ポイントから最初の非空白文字までのすべての空白を削除するコマンドはありますか?

42
Cristian

複数の行を1行に結合するための私のお気に入りのコマンドであるdelete-indentationを試してみてください。あなたの例では、「second」の行にカーソルを置き、 M-^ 2回。ドキュメントは次のとおりです。

M-^ コマンドdelete-indentationを実行します。これは、simple.elでインタラクティブにコンパイルされたLISP関数です。

にバインドされています M-^

(delete-indentation &optional arg)

この行を前の行に結合し、結合時に空白を修正します。塗りつぶしプレフィックスがある場合は、この行の先頭から削除します。引数を使用して、この行を次の行に結合します。

60
Bill White

fixup-whitespace関数を見てください。 simple.elにEmacsが付属しています。そのドキュメントは次のとおりです。

ポイントの周りのオブジェクト間の空白を修正します。コンテキストに応じて、スペースを1つ残すか、まったく残さないでください。

同様の関数、just-one-space

ポイントの周りのすべてのスペースとタブを削除し、1つのスペースを残します

通常はにバインドされています M-SPC

29
Brian Clapper

具体的には、ポイントから最初の非空白文字までのすべての空白を削除するコマンドはありますか?

ほとんどそれを行うコマンドがあります:

M- \は、 `simple.el 'のインタラクティブにコンパイルされたLISP関数であるコマンドdelete-horizo​​ntal-spaceを実行します。

M- \にバインドされています。

(delete-horizo​​ntal-space&optional back-only)

ポイントの周りのすべてのスペースとタブを削除します。 back-onlyがnil以外の場合は、ポイントの前にのみ削除してください。

19

いつでもM-zを使用して最大1文字まで削除できます。

たとえばあなたの場合:

M-z 'は一重引用符まで削除します(残念ながら、これにより一重引用符も削除されますが、それは小さな不便です)。

6
Amjith

次のマクロを使用して、次の行を現在の行の終わりに「プル」し、空白を圧縮します。

(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.emacsにバインドします(VimのJ、「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')
6
Chris Conway

Alt-spaceは、空白の文字列を1つのスペース文字に減らしますが、改行を削除しません。それでも、それは少し役立つはずです。

ポイントから最初の非空白(または改行)まですべてを削除するには、非空白文字、Alt-スペース、バックスペース(最後の空白文字を削除する)、バックスペース(追加した文字を削除する)を入力します。

複数行の関数宣言を単一行の宣言に変換するには、Alt-space、backspace、およびAlt-E(goto-endofline)コマンドを組み合わせて使用​​します。

5
Mike

これを行うためのかなり抜本的な方法は Hungry-Delete モードです:

Hungry-Deleteは、削除する方向のすべての空白を削除するマイナーモードです。

4
Pavel Chuchuva

少し異なるアプローチは、あなたのために仕事をするためのキーボードマクロを作成することです。したがって、マクロステージを作成するための一般的なシナリオは次のとおりです。

foo


               bar

[「foo」が含まれる行、数行後に空白が含まれる行、「bar」と記述します]

次に、fooとbarの間のどこかに立って、次の手順を実行します。

 Cx(;マクロの記録を開始
 Mb; fooの先頭に戻る
 END; fooの末尾に移動
 C-スペース;マークを配置
 CMf;バーの末尾に移動
 HOME;行の先頭に移動
 Cw;すべての空白をヤンクアウト
 M-SPACE;そのままにします1つのスペース
 Cx);マクロの記録を終了します
 M-x name-last-kbd-macro;名前を付けて、jlineなどと呼びます

これで、M-x1行で2つの単語間のすべての空白をいつでも削除できます

.emacsファイルのどこかにM-xinsert-kbd-macroを発行して、キーボードマクロを保存することを忘れないでください-これは次のようになります。

(fset 'jline
   [?\M-b end ?\C-  ?\C-\M-f home ?\C-w escape ? ])
3
Ayal Gelles

すべての削除をそのように機能させたい場合は、greedy-deleteをチェックしてください。

1
Ivan Andrus

私はこれをします:

(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 ,を実行するだけです。

1
jrockway