J'ai vu cette même question pour VIM et c'est quelque chose que je voulais moi-même savoir faire pour Emacs. Dans ReSharper, j'utilise CTRL-D pour cette action. Quel est le plus petit nombre de commandes pour effectuer cela dans Emacs?
155
Réponses:
j'utilise
qui se décompose en
C-a
: déplacer le curseur au début de la ligneC-SPACE
: commencer une sélection ("set mark")C-n
: déplacer le curseur sur la ligne suivanteM-w
: copier la régionC-y
: coller ("yank")Le précité
revient au même (TMTOWTDI)
C-a
: déplacer le curseur au début de la ligneC-k
: couper ("tuer") la ligneC-k
: couper la nouvelle ligneC-y
: paste ("yank") (nous sommes de retour à la case départ)C-y
: collez à nouveau (maintenant nous avons deux copies de la ligne)Ce sont tous les deux embarrassants par rapport à
C-d
votre éditeur, mais dans Emacs, il y a toujours une personnalisation.C-d
est liédelete-char
par défaut, alors qu'en est-ilC-c C-d
? Ajoutez simplement ce qui suit à votre.emacs
:(La version elisp de @ Nathan est probablement préférable, car elle ne se cassera pas si l'une des combinaisons de touches est modifiée.)
Attention: certains modes Emacs peuvent réclamer
C-c C-d
autre chose.la source
C-S-backspace C-y C-y
?En plus des réponses précédentes, vous pouvez également définir votre propre fonction pour dupliquer une ligne. Par exemple, en plaçant ce qui suit dans votre fichier .emacs, Cd dupliquera la ligne actuelle.
la source
Symbol's function definition is void: move-beginning-of-line
Del
de cette fonction?Del
à la normale tout en conservant le nouveauC-d
:(global-set-key (kbd "<delete>") 'delete-char)
doit être ajouté après laC-d
définition.Placez le curseur sur la ligne, sinon au début, faites un CTRL- A, puis:
CTRL-K
CTRL-K
CTRL-Y
CTRL-Y
la source
Ma version d'une fonction pour dupliquer une ligne qui fonctionne bien avec undo et ne gâche pas la position du curseur. C'était le résultat d'une discussion dans gnu.emacs.sources de novembre 1997 .
Ensuite, vous pouvez définir CTRL-D pour appeler cette fonction:
la source
crux-duplicate-current-line-or-region
fonctionne mieux pour moi, car avec votre fonction, il annule la duplication de ligne et la dernière opération également.Au lieu de
kill-line
(C-k
) comme dans l'C-a
C-k
C-k
C-y
C-y
utilisation de lakill-whole-line
commande:Les avantages par rapport à cela
C-k
incluent que peu importe où se trouve le point sur la ligne (contrairement àC-k
ce qui nécessite d'être au début de la ligne) et qu'il tue également la nouvelle ligne (encore une fois, quelque choseC-k
ne fonctionne pas).la source
Voici encore une autre fonction pour faire cela. Ma version ne touche pas l'anneau de destruction et le curseur se retrouve sur la nouvelle ligne où il se trouvait sur l'original. Il dupliquera la région si elle est active (mode de marque transitoire), ou dupliquera par défaut la ligne dans le cas contraire. Il fera également plusieurs copies si on lui donne un préfixe arg, et commentera la ligne d'origine si on lui donne un préfixe négatif arg (ceci est utile pour tester une version différente d'une commande / instruction tout en conservant l'ancienne).
Je l'ai lié à
C-c d
:Cela ne doit jamais être réaffecté par un mode ou quoi que ce soit, car
C-c
suivi d'une seule lettre (non modifiée) est réservé aux liaisons utilisateur.la source
C-c d
j'obtiens l'erreurcommand-execute: Wrong type argument: commandp, duplicate-line-or-region
. Une idée de ce qui se passe? J'utilise Emacs 25.1.1 sur WindowsL'ajout de Nathan à votre fichier .emacs est la voie à suivre, mais il pourrait être légèrement simplifié en remplaçant
avec
céder
la source
installez duplicate-thing de melpa:
Mx package-install RET duplicate-thing
et ajoutez cette liaison de touches au fichier init :
(global-set-key (kbd "Mc") 'duplicate-thing)
la source
Je ne me souviens pas très bien comment la duplication de ligne fonctionne ailleurs, mais en tant qu'ancien utilisateur de SciTE, j'ai aimé une chose à propos de SciTE-way: cela ne touche pas la position du curseur! Donc, toutes les recettes ci-dessus n'étaient pas assez bonnes pour moi, voici ma version hippie:
Notez que rien n'est réellement tué dans le processus, laissant les marques et la sélection actuelle intactes.
BTW, pourquoi vous aimez tant à secouer le curseur quand il y a ce joli truc de kill-whole-line (CS-backspace)?
la source
parce que je ne sais pas, je vais commencer cette ronde de golf avec une balle lente:
ctrl-k, y, y
la source
quelque chose que vous voudrez peut-être avoir dans votre .emacs est
Ce qui tue fondamentalement la ligne entière plus la nouvelle ligne chaque fois que vous invoquez kill-line (c'est-à-dire via Ck). Ensuite, sans code supplémentaire, vous pouvez simplement faire Ca Ck Cy Cy pour dupliquer la ligne. Il se décompose en
Mais si vous l'utilisez souvent, alors peut-être qu'une liaison de clé dédiée pourrait être une meilleure idée, mais l'avantage d'utiliser simplement Ca Ck Cy Cy est que vous pouvez dupliquer la ligne ailleurs, au lieu de juste en dessous de la ligne actuelle.
la source
J'ai
copy-from-above-command
lié à une clé et l'utilise. Il est fourni avec XEmacs, mais je ne connais pas GNU Emacs.la source
GNU Emacs 23.2.1 (amd64-portbld-freebsd8.1) of 2010-11-14 on [host clipped]
.Il existe un package appelé Avy Il a la commande avy-copy-line. Lorsque vous utilisez cette commande, chaque ligne de votre fenêtre reçoit une combinaison de lettres. Ensuite, il vous suffit de taper combinaison et vous obtenez cette ligne. Cela fonctionne également pour la région. Ensuite, il vous suffit de taper deux combinaisons.
Ici vous pouvez voir l'interface:
la source
la source
Les défauts sont horribles pour cela. Cependant, vous pouvez étendre Emacs pour qu'il fonctionne comme SlickEdit et TextMate, c'est-à-dire copier / couper la ligne actuelle lorsqu'aucun texte n'est sélectionné:
Placez ce qui précède dans
.emacs
. Ensuite, pour copier une ligneM-w
,. Pour supprimer une ligneC-w
,. Pour dupliquer une ligneC-a M-w C-y C-y C-y ...
,.la source
`` J'ai écrit ma propre version de
duplicate-line
, parce que je ne veux pas bousiller le ring.la source
J'ai aimé la version de FraGGod, sauf pour deux choses: (1) Il ne vérifie pas si le tampon est déjà en lecture seule avec
(interactive "*")
, et (2) il échoue sur la dernière ligne du tampon si cette dernière ligne est vide (comme vous ne peut pas tuer la ligne dans ce cas), laissant votre tampon en lecture seule.J'ai apporté les modifications suivantes pour résoudre ce problème:
la source
Avec les emacs récents, vous pouvez utiliser Mw n'importe où dans la ligne pour le copier. Alors ça devient:
la source
M-w
est lié àeasy-kill
. Vérifiez que c'est ce que vous obtenez quand vous faitesC-h c M-w
J'ai vu des solutions très complexes, de toute façon ...
la source
@ [Kevin Conner]: Assez proche, pour autant que je sache. La seule autre chose à considérer est d'activer
kill-whole-line
pour inclure la nouvelle ligne dans le Ck.la source
[
et]
en@[Kevin Conner]
ctrl- k, ctrl- k, (position au nouvel emplacement) ctrl-y
Ajoutez un ctrl- asi vous ne commencez pas au début de la ligne. Et le 2ème ctrl- kest de saisir le caractère de nouvelle ligne. Il peut être supprimé si vous voulez juste le texte.
la source
Lorsqu'il est appelé de manière interactive sans région active, COPY (Mw) une seule ligne à la place:
Lorsqu'il est appelé de manière interactive sans région active, KILL (Cw) une seule ligne à la place.
Aussi, sur une note connexe:
la source
J'en écris un pour ma préférence.
Mais j'ai trouvé que cela poserait un problème lorsque la ligne actuelle contient des caractères multi-octets (par exemple des caractères CJK). Si vous rencontrez ce problème, essayez plutôt ceci:
la source
Cette fonctionnalité doit correspondre à l'implémentation de JetBrains en termes de duplication à la fois par ligne ou par région, puis en laissant le point et / ou la région active comme prévu:
Juste un wrapper pour contourner le formulaire interactif:
Qui appelle ça,
Ou ca
Et puis j'ai ce lié à meta + shift + d
la source
Comme mentionné dans d'autres réponses, lier les traits de touche au code lisp est une meilleure idée que de les lier à d'autres frappes de touche. Avec la réponse de @ mw, le code duplique la ligne et déplace la marque à la fin de la nouvelle ligne. Cette modification maintient la position de la marque à la même colonne sur la nouvelle ligne:
la source
Si vous utilisez Spacemacs, vous pouvez simplement utiliser
duplicate-line-or-region
, lié à:la source
Avec des arguments de préfixe, et quel est (j'espère) un comportement intuitif:
Le curseur restera sur la dernière ligne. Vous pouvez également spécifier un préfixe pour dupliquer les prochaines lignes à la fois:
Je me retrouve souvent à utiliser les deux, en utilisant une fonction wrapper pour changer le comportement de l'argument de préfixe.
Et un raccourci clavier:
(global-set-key (kbd "C-S-d") 'duplicate-line)
la source
ajoutez elisp ci-dessus à votre init.el, et vous obtenez la fonction couper / copier toute la ligne maintenant, alors vous pouvez F3 F4 pour dupliquer une ligne.
la source
Le moyen le plus simple est la méthode de Chris Conway.
C'est la méthode par défaut mandatée par EMACS. À mon avis, il vaut mieux utiliser la norme. Je suis toujours attentif à la personnalisation de sa propre liaison de clé dans EMACS. EMACS est déjà assez puissant, je pense que nous devrions faire de notre mieux pour nous adapter à ses propres raccourcis clavier.
Bien que ce soit un peu long, mais quand vous y êtes habitué, vous pouvez faire vite et vous trouverez que c'est amusant!
la source
Voici une fonction pour dupliquer la ligne courante. Avec des arguments de préfixe, il dupliquera la ligne plusieurs fois. Par exemple,
C-3 C-S-o
dupliquera la ligne actuelle trois fois. Ne change pas de tuerie.la source