31

replace-stringemacsで長方形の領域内で操作を実行することは可能ですか? もしそうなら、どのように?

4

4 に答える 4

29

CUA 選択モードを有効にする場合:

M-x cua-selection-mode RET

またはあなたのinitファイルに永久に:

(cua-selection-mode 1)

その後、高度な長方形編集機能を使用できます。

(または、cua-modeユーザーの場合は、その必要はありません。)

  • C-RET角をマークします。
  • ポイントを反対側のコーナーに移動します。
  • M-rマークされた長方形内で正規表現の置換を行います。
  • C-RET矩形編集のマークを解除/終了します。

ドキュメントについては、の解説で「CUA 長方形サポート」の見出しを探してください。M-x find-library RET cua-base RET

何らかの理由で cua 長方形機能を使用したくない場合 (おそらく本当に特別に必要replace-stringな場合)、カスタム関数を使用apply-on-rectangleすると、非常に簡単にまとめることができます。

編集:実際には、予想よりも少し複雑ですが、ほとんどのコードはインタラクティブな仕様であり、「区切り」前置引数の動作のサポートです(両方とも に基づいていますreplace-string)。

編集2 :これは、より完全な機能を備えた方法で行う価値があると判断しました:

以下はC-xrM-%C-xrC-M-%を提供します。これらは (うまくいけば) 期待どおりに動作します。

(require 'rect)

(defun my-search-replace-in-rectangle
  (start end search-pattern replacement search-function literal)
  "Replace all instances of SEARCH-PATTERN (as found by SEARCH-FUNCTION)
with REPLACEMENT, in each line of the rectangle established by the START
and END buffer positions.

SEARCH-FUNCTION should take the same BOUND and NOERROR arguments as
`search-forward' and `re-search-forward'.

The LITERAL argument is passed to `replace-match' during replacement.

If `case-replace' is nil, do not alter case of replacement text."
  (apply-on-rectangle
   (lambda (start-col end-col search-function search-pattern replacement)
     (move-to-column start-col)
     (let ((bound (min (+ (point) (- end-col start-col))
                       (line-end-position)))
           (fixedcase (not case-replace)))
       (while (funcall search-function search-pattern bound t)
         (replace-match replacement fixedcase literal))))
   start end search-function search-pattern replacement))

(defun my-replace-regexp-rectangle-read-args (regexp-flag)
  "Interactively read arguments for `my-replace-regexp-rectangle'
or `my-replace-string-rectangle' (depending upon REGEXP-FLAG)."
  (let ((args (query-replace-read-args
               (concat "Replace"
                       (if current-prefix-arg " word" "")
                       (if regexp-flag " regexp" " string"))
               regexp-flag)))
    (list (region-beginning) (region-end)
          (nth 0 args) (nth 1 args) (nth 2 args))))

(defun my-replace-regexp-rectangle
  (start end regexp to-string &optional delimited)
  "Perform a regexp search and replace on each line of a rectangle
established by START and END (interactively, the marked region),
similar to `replace-regexp'.

Optional arg DELIMITED (prefix arg if interactive), if non-nil, means
replace only matches surrounded by word boundaries.

If `case-replace' is nil, do not alter case of replacement text."
  (interactive (my-replace-regexp-rectangle-read-args t))
  (when delimited
    (setq regexp (concat "\\b" regexp "\\b")))
  (my-search-replace-in-rectangle
   start end regexp to-string 're-search-forward nil))

(defun my-replace-string-rectangle
  (start end from-string to-string &optional delimited)
  "Perform a string search and replace on each line of a rectangle
established by START and END (interactively, the marked region),
similar to `replace-string'.

Optional arg DELIMITED (prefix arg if interactive), if non-nil, means
replace only matches surrounded by word boundaries.

If `case-replace' is nil, do not alter case of replacement text."
  (interactive (my-replace-regexp-rectangle-read-args nil))
  (let ((search-function 'search-forward))
    (when delimited
      (setq search-function 're-search-forward
            from-string (concat "\\b" (regexp-quote from-string) "\\b")))
    (my-search-replace-in-rectangle
     start end from-string to-string search-function t)))

(global-set-key (kbd "C-x r M-%") 'my-replace-string-rectangle)
(global-set-key (kbd "C-x r C-M-%") 'my-replace-regexp-rectangle)
于 2012-06-21T02:18:38.037 に答える
0

CUA モードの場合は、'Mr' にバインドされた cua-replace-in-rectangle を使用できます。

于 2013-11-07T23:23:56.447 に答える