E 'possibile eseguire un'operazione di replace-string
all'interno di un'area rettangolare in emacs? Se é cosi, come?Cerca e sostituisci all'interno di un rettangolo in emacs
risposta
Se si attiva la modalità di selezione CUA:
M-xcua-selection-mode
RET
o permanentemente nel file init:
(cua-selection-mode 1)
È quindi possibile utilizzare le sue avanzate strutture di editing rettangolo.
(o se sei un utente cua-mode
, allora non c'è bisogno di farlo.)
- C-RET per segnare un calcio d'angolo.
- Sposta il punto nell'angolo opposto.
- M-r fare un regexp sostituire all'interno del rettangolo contrassegnato.
- C-RET per deselezionare/uscire dalla modifica del rettangolo.
Per la documentazione, cercare il "sostegno rettangolo di CUA" voce nel commento in Mxfind-library
RETcua-base
RET
Se non si desidera utilizzare le strutture cua rettangolo qualche ragione (forse se hai davvero bisogno dello replace-string
in modo specifico), una funzione personalizzata usando apply-on-rectangle
sarebbe piuttosto semplice da mettere insieme.
Edit: In realtà, un po 'più complessa di quanto mi aspettassi, ma la maggior parte del codice è la specifica interattivo e il supporto per il comportamento argomento prefisso 'delimitato'(entrambi basati su replace-string
).
Edit 2: ho deciso che questo era la pena di fare in modo più pieno di funzionalità:
che segue fornisce CxrM-% e CxrCM -%, che (si spera) si comportano come ci si aspetterebbe.
(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)
Se si è in modalità CUA, è possibile utilizzare cua-replace-in-rectangle in "M-r".
Ma questo sostituisce solo la prima occorrenza della cosa (comportamento predefinito vim replace-regexp). – Adobe
Per gli utenti malintenzionati, è possibile utilizzare il mio pacchetto evil-visual-replace per ottenere query-replace
e replace-regexp
all'interno di blocchi visivi malvagi.
Nel recente Emacs (ad esempio Emacs 25) si può fare questo, fuori dalla scatola usando M-%
(query-replace
) o C-M-%
(query-replace-regexp
).
Utilizzare M-x rectangle-mark-mode
per creare l'area rettangolare. Utilizzare C-x C-x
se necessario, per mettere il punto prima del segno. Quindi basta interrogare-sostituire.
Tuttavia, non hanno apportato la stessa modifica in Emacs 25 per replace-string
. Puoi farlo, se vuoi, semplicemente aggiungendo l'argomento region-noncontiguous-p
allo stesso modo in cui è stato fatto in query-replace
. Il codice è semplice:
(defun replace-string (from-string to-string &optional delimited start end backward
region-noncontiguous-p)
"..."
(declare (interactive-only
"use `search-forward' and `replace-match' instead."))
(interactive
(let ((common
(query-replace-read-args
(concat "Replace"
(if current-prefix-arg
(if (eq current-prefix-arg '-) " backward" " word")
"")
" string"
(if (use-region-p) " in region" ""))
nil)))
(list (nth 0 common) (nth 1 common) (nth 2 common)
(if (use-region-p) (region-beginning))
(if (use-region-p) (region-end))
(nth 3 common)
(if (use-region-p) (region-noncontiguous-p)))))
(perform-replace
from-string to-string nil nil delimited nil nil start end backward region-noncontiguous-p))
In alternativa, si può semplicemente scaricare biblioteca replace+.el
e utilizzare la versione di replace-string
da lì. Fa quello che vuoi.
FWIW, ho appena registrato Emacs bug#27897 per ottenere questa funzionalità aggiunta a replace-string
e diversi altri comandi nella stessa libreria, replace.el
.
C'è anche un bug anzu (che potrebbe sostituire la versione di 'query-replace') relativa a questo: https://github.com/syohex/emacs-anzu/issues/69 –
- 1. phpstorm regex cerca e sostituisci
- 2. Cerca e sostituisci in Visual Studio
- 3. Cerca e sostituisci stringa in un file molto grande
- 4. cerca e sostituisci con ruby regex
- 5. cerca e sostituisci per barra diretta
- 6. Vim - Cerca e sostituisci i risultati
- 7. Come si cerca/trova e sostituisci in una stringa standard?
- 8. Cerca e sostituisci word con il cursore in Vim
- 9. emacs stringa-inserisci-rettangolo vettore di numeri?
- 10. Trova e sostituisci intere parole (non sottostringhe) in Emacs
- 11. Cerca e sostituisci: qual è il collegamento corretto?
- 12. Cerca e sostituisci le proprietà formattate all'interno della stringa Java
- 13. Vim equivalente del rettangolo aperto di Emacs
- 14. Cerca e sostituisci con l'opzione "solo parola intera"
- 15. Vim Cerca/sostituisci: cosa devo sfuggire?
- 16. Cerca e sostituisci comandi dalla cronologia dei terminali
- 17. Cerca e sostituisci con Regex con le variabili sostitutive
- 18. Cerca e sostituisci parte della stringa nella banca dati
- 19. emacs: cerca la parte di un nome file
- 20. Perché c'è un rettangolo di cornice e un rettangolo di limiti in un UIView?
- 21. Emacs: sostituisci regexp con prompt per corrispondenza
- 22. Cerca e sostituisci più righe in file xml/di testo usando python
- 23. Trova e sostituisci stringa in un file
- 24. Come posso convertire un rettangolo in un rettangolo?
- 25. Cerca e sostituisci più valori con valori multipli/diversi in PHP5?
- 26. Emacs cerca con esattezza l'espressione regolare invece di parziale
- 27. Sostituisci in C# e sostituisci Tutto in Java
- 28. Rendere un'immagine in un rettangolo
- 29. Disegna un rettangolo in Golang?
- 30. Trova e sostituisci in un file di grandi dimensioni
Grazie! Sfortunatamente, sembra che io possa segnare un angolo con 'C-RET' nella GUI di emacs, non in modalità terminale. – user545424
Ciò sarà dovuto al fatto che il terminale non invia questa sequenza. Potresti trovare un xterm più efficace (vedi anche http://stackoverflow.com/questions/4337837/send-c-to-emacs-in-vt100-xterm-terminal-mac-os-xs-terminal). Ho anche aggiornato la mia risposta con un codice più completo per l'approccio non CUA. – phils
Richiesta di funzione: cerca nel rettangolo. Ho una colonna enorme e ho bisogno di controllare non ha altro che 'DPP'. Uso alcune regexp complesse e, se la colonna è veramente grande, ho un overflow dello stack regexp. – Adobe