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?

È stato utile?

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 in simple.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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top