현재 줄이 "비어 있는지"확인하는 가장 쉬운 방법 (공백 무시)?


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 문자열에서 writing \s은 writing 과 같습니다 s. 아마도 당신은 의미했다 "^\\s*$".
YoungFrog

3
일반적인 의견으로, elisp는 문자열로 작업하는 것과는 반대로 (다른 언어에서와 같이) 버퍼에 대한 작업 측면에서 생각하기 시작하면 더 의미 가 있습니다 . 일부 테스트를 수행하기 위해 문자열을 분리하고 추출하는 것은 (a) 비효율적이며 (b) 귀하의 처분에 따른 도구 수를 크게 줄입니다. Elisp는 버퍼의 내용을 직접 처리하는 데 정말 능숙 합니다.
phils

1
@YoungFrog, 또한 \\s-대신 해야합니다 \\s. 해당 하이픈은 elisp regexp에 필요합니다.
Kaushal Modi

답변:


24

이와 같은 것이 "쉬운"것입니까?

(defun current-line-empty-p ()
  (save-excursion
    (beginning-of-line)
    (looking-at "[[:space:]]*$")))

12

당신이 가진 것에 가까운 간단한 방법 :

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

나는이 솔루션이 수정되지 않기 때문에 좋아한다 match-data.
nispio

1
\\s-대신에 있어야 합니다 \s. 그 해결책을 시도 했습니까?
Kaushal Modi

이상하게도, 나는 그것을 조금 사용합니다. 그러나 나는 이것을 메모리에서 썼다. 당신이 올바른지.
PythonNut

1
여전히 하이픈이 없습니까? :)
Kaushal Modi

그것은 일찍 일어 났고 아직 완전히 깨지 않았습니다.
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는 실제로 불필요합니다). Dan이 그의 답변에서하는 것처럼 skip-syntax-*대신 사용할 수도 있습니다.


3
탭만 포함 된 행을 공백으로 식별하지 않습니다. skip-syntax-*여기서 사용할 올바른 함수 세트입니다.
Gilles '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

@JeanPierre (thing-at-point 'line)는 줄 끝에 줄 바꿈을 포함합니다. 현재 줄이 비어 있지 않으면 정규 표현식이 해당 줄 바꿈과 일치합니다. 여기서 string-match-pnil을 반환 하는 유일한 시간 은 버퍼의 마지막 줄에 있습니다 (그리고 Dario, 버퍼가 줄 바꿈으로 끝나지 않으면 버전은 마지막 줄에서 작동하지 않습니다).
Gilles 'SO- 악마 그만'

더 나은 수정은 문자열의 모든 줄의 시작과 일치하는 대신 문자열의 시작과 일치하는 것입니다. PythonNut의 답변을 편집했습니다.
Gilles '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.