現在の行が「空」であるかどうかを確認する最も簡単な方法(空白を無視)?


14

現在の行が空であるかどうかを確認したいだけです(空白のみが含まれている場合は、空であると見なします)。

これが私の初期バージョンです。

(defun strip-text-properties(txt)
  (set-text-properties 0 (length txt) nil txt)
  txt)

(defun is-current-line-empty ()
  (interactive)
  (setq c-line (thing-at-point 'line))
  (string-match "^\s*$" (strip-text-properties c-line)))

現在の行が空かどうかを確認する最も簡単な方法は何ですか?


3
Lisp文字列で\sは、書き込みはwriting と同等sです。おそらくあなたが意味した"^\\s*$"
YoungFrog

3
一般的なコメントとして、elispは(他の言語でよくあることですが)文字列を使用するのとは対照的に、バッファに対するアクションの観点から考え始めると、より意味があります。何らかのテストを実行するために文字列を分離して抽出することは、(a)非効率的であり、(b)自由に使えるツールの数を劇的に削減する可能性があります。Elispは、バッファの内容を直接処理するのが得意です。
phils

1
@YoungFrog、またの\\s-代わりになり\\sます。そのハイフンは、elisp正規表現で必要です。
カウシャルモディ

回答:



12

あなたが持っているものに近い簡単な方法:

(defun current-line-empty-p ()
  (string-match-p "\\`\\s-*$" (thing-at-point 'line)))

変更しないので、このソリューションが気に入っていmatch-dataます。
nispio

1
\\s-代わりに持っている必要があり\sます。その解決策を試しましたか?
カウシャルモディ

奇妙なことに、私はかなりそれを使用しています。しかし、私はこれを記憶から書き留めたところです。あなたは正しいです。
PythonNut

1
まだハイフンが抜けていますか?:)
カウシャルモディ

それは早く、私はまだ完全に目覚めていませんでした。
PythonNut

4
(defun blank-line-p (&optional pos)
  "Returns `t' if line (optionally, line at POS) is empty or
composed only of whitespace."
  (save-excursion
    (goto-char (or pos (point)))
    (beginning-of-line)
    (= (point-at-eol)
       (progn (skip-syntax-forward " ") (point)))))

1

私は提案します:

(defun blank-line-p ()
  (and (progn (skip-chars-backward " ") (bolp))
       (progn (skip-chars-forward " ") (eolp))))

prognスキップ関数はnilを返さないため、実際にはsは不要であることに注意してください)。ダンが答えたように、skip-syntax-*代わりに使用することもできます。


3
これは、タブのみを含む行を空白として識別しません。skip-syntax-*ここで使用する適切な関数セットです。
ジル「SO-悪であるのをやめる」

1

comment-dwim-2パッケージの別の簡単なソリューションを次に示します

(defun is-empty-line-p ()
  (string-match "^[[:blank:]]*$"
        (buffer-substring (line-beginning-position)
                          (line-end-position))))

1

これはPythonNutが答えたものの修正であり、私にとってはうまくいきませんでした(なぜですか?):

(defun current-line-blank ()
  (= 0 (string-match-p "^\\s-*$" (thing-at-point 'line))))

string-match-p現在の行が空白でない場合は常に、次の行のインデックスを返しました。そこで、戻り値が0であることを確認しました。


次の行のインデックスは?どういう意味?(およびemacs.SEにようこそ!)
ジャンピエール

@JeanPierreに(thing-at-point 'line)は、行末に改行が含まれています。現在の行が空白でない場合、正規表現はその改行で一致します。唯一の時間string-match-p、ここではnilを返しますが、バッファの最後の行にある(とダリオ・バッファが改行で終わっていない場合は、お使いのバージョンでは、最後の行では動作しません)。
ジル「SO-悪であるのをやめる」

より良い修正方法は、文字列内の行の先頭と一致する代わりに、文字列の先頭と一致することです。PythonNutの答えを編集しました。
ジル「SO-悪であるのをやめる」

0

current-indentation 行末の列と比較できる、先頭の空白に続く列を提供します。

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.