Comando Emacs per eliminare caratteri fino a non spazi bianchi
-
22-07-2019 - |
Domanda
Spesso desidero effettuare una chiamata di funzione multilinea e ridurla a una linea. Ad esempio, converti ...
function_call(
'first_arg',
'second')
a
function_call('first_arg', 'second')
Emacs ha alcuni comandi per aiutarti. In particolare, esiste un comando che eliminerà tutto lo spazio dal punto al primo carattere non bianco?
Soluzione
Potresti provare delete-indentation
, il mio comando preferito per unire più righe in una riga. Nel tuo esempio, posiziona il cursore sulla riga con " secondo " e premi M- ^ due volte. Ecco i documenti:
M- ^ esegue il comando
delete-indentation
, che è una funzione Lisp compilata interattiva insimple.el
.È associato a M- ^ .
(delete-indentation & amp; optional arg)
Unisci questa linea al precedente e correggi gli spazi bianchi al join. Se è presente un prefisso di riempimento, eliminarlo dall'inizio di questa riga. Con argomento, unisci questa riga alla seguente riga.
Altri suggerimenti
Dai un'occhiata alla funzione fixup-whitespace
. Viene fornito con Emacs, in simple.el
. I suoi documenti sono:
Correggi lo spazio bianco tra gli oggetti attorno al punto. Lascia uno spazio o nessuno, a seconda del contesto.
Una funzione simile, solo uno spazio
, quella
Elimina tutti gli spazi e le schede attorno al punto, lasciando uno spazio
è in genere associato a M-SPC .
In particolare, esiste un comando che eliminerà tutto lo spazio dal punto al primo carattere non bianco?
C'è un comando che fa quasi quello:
M- \ esegue il comando delete-horizontal-space che è una funzione Lisp compilata interattiva in `simple.el '.
È associato a M- \.
(delete-horizontal-space & amp; optional back-only)
Elimina tutti gli spazi e le schede attorno al punto. Se il solo backward è diverso da zero, eliminali solo prima del punto.
Puoi sempre usare M-z per cancellare fino a un carattere.
Ad esempio nel tuo caso:
M-z 'per eliminare fino alla singola citazione (purtroppo anche questa eliminerà la singola citazione, ma questo è un piccolo inconveniente).
Uso la seguente macro per " pull " la riga successiva alla fine della riga corrente, comprimendo gli spazi bianchi.
(defun pull-next-line()
(interactive)
(move-end-of-line 1)
(kill-line)
(just-one-space))
Questo è esattamente l'opposto del move-line-up
di @ jrockway e del delete-indentation
, che trovo più naturale. Il comando just-one-space
nella macro è esattamente il M-SPACE
di @ Mike.
Associo pull-next-line
a MJ
(in analogia con il J
di Vim, per il comando " join " ;, usando il comando seguendo nel mio .emacs
.
(global-set-key (kbd "M-J") 'pull-next-line)
Esempio. Chiamando pull-next-line
sulla prima riga di
function_call(
'first_arg',
'second')
rendimenti
function_call( 'first_arg',
'second')
Chiamarlo una seconda volta produce
function_call( 'first_arg', 'second')
Alt-spazio riduce una stringa di spazi bianchi a un singolo carattere di spazio, ma non cancella la nuova riga. Tuttavia, ciò dovrebbe aiutare un po '.
Per eliminare tutto dal punto al primo non-spazio (o newline), digita un carattere non-spazio, Alt-spazio, backspace (per rimuovere il carattere finale dello spazio), quindi backspace (per eliminare il carattere che hai aggiunto.
Per trasformare la dichiarazione della funzione multilinea in una dichiarazione a riga singola, utilizzare una combinazione di comandi Alt-spazio, backspace e Alt-E (goto-endofline).
Un modo piuttosto drastico di farlo è Modalità Hungry-Delete :
Hungry-Delete è una modalità minore che provoca l'eliminazione per eliminare tutti gli spazi bianchi nella direzione in cui si sta eliminando.
Un approccio leggermente diverso sarebbe la creazione di una macro di tastiera per fare il lavoro per te. così, per creare il macro stage uno scenario generale come questo:
foo
bar
[una linea con " foo " poi un paio di righe più tardi e con alcuni spazi bianchi, scrivi "barra"]
quindi in piedi ovunque tra foo e bar, fai quanto segue:
C-x ( ; start recording macro M-b ; move backwards to the beginning of foo END ; move to the end of foo C-space ; place mark C-M-f ; move to the end of bar HOME ; move to the beginning of the line C-w ; yank out all the white space M-SPACE ; leave only one space C-x ) ; end recording the macro M-x name-last-kbd-macro ; name it, call it jline or something
Ora puoi sempre rimuovere tutto lo spazio tra due parole con M-x una riga
Assicurati di ricordare di salvare la macro della tastiera emettendo M-x insert-kbd-macro da qualche parte nel tuo file .emacs - ecco come appare:
(fset 'jline
[?\M-b end ?\C- ?\C-\M-f home ?\C-w escape ? ])
Faccio questo:
(defun move-line-up ()
"Removes leading spaces from the current line, and then moves
the current line to the end of the previous line."
(interactive)
(let (start end)
(save-excursion
(beginning-of-line)
; get first non-space character, only look on this line
(let ((search-end (save-excursion (end-of-line) (point))))
(re-search-forward "[^[:space:]]" search-end))
(setq end (1- (point)))
(previous-line)
(end-of-line)
(setq start (point))
(delete-region start end))
(goto-char start)))
(defun move-next-line-up ()
"Moves the next line to the end of the current line"
(interactive)
(next-line)
(move-line-up))
E associa questi come:
(global-set-key (kbd "C-x ,") 'move-line-up)
(global-set-key (kbd "C-x .") 'move-next-line-up)
Quindi, per risolvere il tuo problema, sulla riga che dice "secondo)", basta eseguire C-x, C-x,
Se vuoi che tutte le tue eliminazioni agiscano in quel modo, potresti dare un'occhiata a greedy-delete.