2

私のinit-fileにはこのきちんとした関数があります:

(defun comment-or-uncomment-region-or-line()
  "Comments or uncomments the region or the current line if there's no active region."
  (interactive)
  (let (beg end)
    (if (region-active-p)
      (setq beg (region-beginning) end (region-end))
      (setq beg (line-beginning-position) end (line-end-position))
    )
    (comment-or-uncomment-region beg end)
    (next-line)
  )
)

しかし、私がそれについて気に入らないのは、次の状況です。

Lorem ipsum dolor sit amet, consec|tetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proi|dent, sunt in culpa qui officia deserunt
mollit anim id est laborum.

注: | 領域のポイントまたはマークのいずれかを示します。

この領域にコメントを付けると、次のようになります。

Lorem ipsum dolor sit amet, consec// tetur adipisicing elit, sed do eiusmod tempor
// incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
// exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
// dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
// Excepteur sint occaecat cupidatat non proi
// dent, sunt in culpa qui officia deserunt
// mollit anim id est laborum.

代わりに、私はそれを単純にしたい:

// Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
// incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
// exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
// dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
// Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
// mollit anim id est laborum.

つまり、最初と最後の行の真ん中にマークとポイントがあるかどうかに関係なく、領域を拡張/拡張して、行全体(最初と最後)を包含するようにします。

それに応じて動作するようにこの関数を変更する方法はありますか?

4

2 に答える 2

5

を呼び出しline-beginning-positionline-end-position、実際にポイントを目的の場所に移動した後:

(defun comment-or-uncomment-region-or-line()
  "Comments or uncomments the region or the current line if there's no active region."
  (interactive)
  (let (beg end)
    (if (region-active-p)
        (progn
          (setq beg (region-beginning) end (region-end))
          (save-excursion
            (setq beg (progn (goto-char beg) (line-beginning-position))
                  end (progn (goto-char end) (line-end-position)))))
      (setq beg (line-beginning-position)
            end (line-end-position)))
    (comment-or-uncomment-region beg end)
    (next-line)))
于 2012-11-01T23:11:20.133 に答える
2

function1 つの方法は、ポイントの を返すを作成して:my-region-bolそれを渡し(region-beginning)、同様point-at-eol-of-pointにリージョンがアクティブなときにそれらを使用することです。

私はすぐに次のことを試しました。残りは記入してください。

(defun :my-region-bol () (interactive) 
  (if (region-active-p)
      (save-excursion
        (goto-char (region-beginning))
        (point-at-bol))
    nil))


(defun comment-or-uncomment-region-or-line()
  "Comments or uncomments the region or the current line if there's no active region."
  (interactive)
  (let (beg end)
    (if (region-active-p)
      (setq beg (:my-region-bol) end (region-end))
      (setq beg (line-beginning-position) end (line-end-position))
    )
    (comment-or-uncomment-region beg end)
    (next-line)
  )
)

編集

上記は、最初の呼び出しでポイントとマークが変わるため、そのままでは適切ではない場合があります。私は以下を使用できますが、リージョンが変更されるため、必要な場合とそうでない場合があります。

(defun :my-bol-at (point) (interactive) 
  (save-excursion
    (goto-char point)
    (point-at-bol)))

(defun :my-eol-at (point) (interactive) 
  (save-excursion
    (goto-char point)
    (point-at-eol)))


(defun :my-expand-region-to-whole-line () (interactive)
  (when (region-active-p)
    (let ((beg (region-beginning)) (end (region-end)))
      (goto-char (:my-bol-at beg))
      (set-mark (point))
      (goto-char (:my-eol-at end)))))
于 2012-11-01T23:06:10.580 に答える