Commande Emacs à supprimer jusqu’à un caractère autre qu’un espace

Je souhaite souvent effectuer un appel de fonction multiligne et le réduire à une seule ligne. Par exemple, convertir …

function_call( 'first_arg', 'second') 

à

 function_call('first_arg', 'second') 

Est-ce que emacs a des commandes pour vous aider? Plus précisément, existe-t-il une commande qui supprime tous les espaces du point au premier caractère non blanc?

Vous pouvez essayer de delete-indentation , ma commande préférée pour joindre plusieurs lignes sur une seule ligne. Dans votre exemple, placez le curseur sur la ligne avec “second” et appuyez deux fois sur M- ^ . Voici les documents:

M- ^ exécute la commande delete-indentation , qui est une fonction Lisp compilée interactive en simple.el .

Il est lié à M- ^ .

(delete-indentation &optional arg)

Joignez cette ligne à la précédente et corrigez les espaces à la jointure. S’il existe un préfixe de remplissage, supprimez-le au début de cette ligne. Avec argument, joignez cette ligne à la ligne suivante.

Jetez un oeil à la fonction fixup-whitespace . Il vient avec Emacs, en simple.el . Ses documents sont:

Fixation d’espace blanc entre les objects autour du point. Laissez un espace ou aucun, selon le contexte.

Une fonction similaire, just-one-space , qui

Supprime tous les espaces et les tabulations autour du point, en laissant un espace

est généralement lié à M-SPC .

Plus précisément, existe-t-il une commande qui supprime tous les espaces du point au premier caractère non blanc?

Il y a une commande qui fait presque cela:

M- \ exécute la commande delete-horizontal-space qui est une fonction Lisp compilée interactive dans «simple.el».

Il est lié à M- \.

(delete-horizontal-space et optionnel uniquement vers l’arrière)

Supprimez tous les espaces et les tabulations autour du point. Si le retour en arrière est non nul, supprimez-les uniquement avant le point.

J’utilise la macro suivante pour “tirer” la ligne suivante à la fin de la ligne en cours, en compressant les espaces.

 (defun pull-next-line() (interactive) (move-end-of-line 1) (kill-line) (just-one-space)) 

C’est exactement le contraire de l’alignement par move-line-up de @ jrockway et de l’ delete-indentation de delete-indentation , que je trouve plus naturelle. La commande just-one-space dans la macro est exactement @ M-SPACE de Mike.

Je lie pull-next-line à MJ (en analogie avec Jim de Vim, pour “rejoindre”, commande) en utilisant ce qui suit dans mes .emacs .

 (global-set-key (kbd "MJ") 'pull-next-line) 

Exemple. Appelez la pull-next-line sur la première ligne de

 function_call( 'first_arg', 'second') 

les rendements

 function_call( 'first_arg', 'second') 

L’appeler une seconde fois rapporte

 function_call( 'first_arg', 'second') 

Alt-space réduira une chaîne d’espaces à un seul caractère d’espace, mais ne supprimera pas la nouvelle ligne. Pourtant, cela devrait aider un peu.

Pour tout supprimer d’un point à l’autre (ou nouvelle ligne), tapez un caractère autre qu’un espace blanc, Alt-espace, retour arrière (pour supprimer le dernier caractère d’espacement), puis effectuez un retour arrière (pour supprimer le caractère que vous avez ajouté).

Pour transformer la déclaration de fonction multi-lignes en une déclaration sur une seule ligne, utilisez une combinaison de commandes Alt, Espace arrière et Alt-E (goto-endofline).

Vous pouvez toujours utiliser Mz pour supprimer un caractère.

Par exemple dans votre cas:

Mz ‘pour supprimer le devis unique (malheureusement, cela supprimera également le devis unique, mais c’est un inconvénient mineur).

Une façon assez drastique de le faire est le mode Hungry-Delete :

Hungry-Delete est un mode mineur qui supprime tous les espaces dans la direction que vous supprimez.

Une approche légèrement différente consisterait à créer une macro clavier pour faire le travail à votre place. donc, pour créer la scène macro, un scénario général comme celui-ci:

 foo bar 

[une ligne avec “foo” puis quelques lignes plus tard et avec quelques espaces blancs, écrivez “bar”]

puis se tenant n’importe où entre toto et barre, procédez comme suit:

 Cx (; commence à enregistrer une macro
 Mb;  reculer au début de foo
 FIN ;  passer à la fin de foo
 Espace C;  marque de position
 CMf;  passer à la fin de la barre
 MAISON ;  se déplacer au début de la ligne
 Cw;  tirer tout l'espace blanc
 M-ESPACE;  ne laisser qu'un seul espace
 Cx);  fin d'enregistrement de la macro
 Mx nom-dernier-kbd-macro;  nommez-le, appelez-le jline ou quelque chose 

Maintenant, vous pouvez toujours supprimer tous les espaces entre deux mots avec Mx une ligne

Assurez-vous de ne pas oublier de sauvegarder votre macro de clavier en émettant Mx insert-kbd-macro quelque part dans votre fichier .emacs – à quoi cela ressemble:

 (fset 'jline [?\Mb end ?\C- ?\C-\Mf home ?\Cw escape ? ]) 

Je fais ça:

 (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)) 

Et les lier comme:

 (global-set-key (kbd "Cx ,") 'move-line-up) (global-set-key (kbd "Cx .") 'move-next-line-up) 

Donc, pour résoudre votre problème, sur la ligne qui dit “second)”, lancez simplement Cx , Cx ,

Si vous souhaitez que toutes vos suppressions agissent de cette manière, vous pouvez vérifier la suppression gourmande.