複数行の関数呼び出しを行い、それを1行に減らしたいことがよくあります。たとえば、変換...
function_call(
'first_arg',
'second')
に
function_call('first_arg', 'second')
Emacsにはこれを支援するいくつかのコマンドがありますか?具体的には、ポイントから最初の非空白文字までのすべての空白を削除するコマンドはありますか?
複数の行を1行に結合するための私のお気に入りのコマンドであるdelete-indentation
を試してみてください。あなたの例では、「second」の行にカーソルを置き、 M-^ 2回。ドキュメントは次のとおりです。
M-^ コマンド
delete-indentation
を実行します。これは、simple.el
でインタラクティブにコンパイルされたLISP関数です。にバインドされています M-^。
(delete-indentation &optional arg)
この行を前の行に結合し、結合時に空白を修正します。塗りつぶしプレフィックスがある場合は、この行の先頭から削除します。引数を使用して、この行を次の行に結合します。
fixup-whitespace
関数を見てください。 simple.el
にEmacsが付属しています。そのドキュメントは次のとおりです。
ポイントの周りのオブジェクト間の空白を修正します。コンテキストに応じて、スペースを1つ残すか、まったく残さないでください。
同様の関数、just-one-space
、
ポイントの周りのすべてのスペースとタブを削除し、1つのスペースを残します
通常はにバインドされています M-SPC。
具体的には、ポイントから最初の非空白文字までのすべての空白を削除するコマンドはありますか?
ほとんどそれを行うコマンドがあります:
M- \は、 `simple.el 'のインタラクティブにコンパイルされたLISP関数であるコマンドdelete-horizontal-spaceを実行します。
M- \にバインドされています。
(delete-horizontal-space&optional back-only)
ポイントの周りのすべてのスペースとタブを削除します。 back-onlyがnil以外の場合は、ポイントの前にのみ削除してください。
いつでもM-zを使用して最大1文字まで削除できます。
たとえばあなたの場合:
M-z 'は一重引用符まで削除します(残念ながら、これにより一重引用符も削除されますが、それは小さな不便です)。
次のマクロを使用して、次の行を現在の行の終わりに「プル」し、空白を圧縮します。
(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
です。
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')
Alt-spaceは、空白の文字列を1つのスペース文字に減らしますが、改行を削除しません。それでも、それは少し役立つはずです。
ポイントから最初の非空白(または改行)まですべてを削除するには、非空白文字、Alt-スペース、バックスペース(最後の空白文字を削除する)、バックスペース(追加した文字を削除する)を入力します。
複数行の関数宣言を単一行の宣言に変換するには、Alt-space、backspace、およびAlt-E(goto-endofline)コマンドを組み合わせて使用します。
これを行うためのかなり抜本的な方法は Hungry-Delete モードです:
Hungry-Deleteは、削除する方向のすべての空白を削除するマイナーモードです。
少し異なるアプローチは、あなたのために仕事をするためのキーボードマクロを作成することです。したがって、マクロステージを作成するための一般的なシナリオは次のとおりです。
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 ? ])
すべての削除をそのように機能させたい場合は、greedy-deleteをチェックしてください。
私はこれをします:
(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 ,
を実行するだけです。