Repita a última inserção de texto

10

No Vim, você pode pressionar .para repetir a última alteração, incluindo a inserção de texto.

Enquanto no Emacs, C-x zapenas repete o último comando. Estou ciente de que as macros podem ser usadas aqui, mas mais do que muitas vezes percebo que preciso reinserir o mesmo texto tarde demais. Quando preciso inseri-lo apenas mais uma vez , definir uma macro é inútil.

P: Existe uma maneira de repetir a inserção de texto dentro do Emacs?

ooi
fonte
11
Qual é o "texto" que você deseja repetir? Tecnicamente falando, a última inserção é apenas o último caractere, o que provavelmente não é o que você procura. Então, como você definiria uma "inserção de texto" para sua finalidade? Esclarecer também pode ajudá-lo a encontrar maneiras de alcançá-lo.
T. Verron 02/12/14
Hmm boa pergunta - como definir a última modificação contínua no buffer . Talvez uma modificação do buffer entre dois movimentos de ponto que não sejam resultado de uma modificação do buffer ( C-f, pesquisa, etc.)? Se isso faz algum sentido ...
ooi
Esclareça o que você quer com uma receita. Existem muitos tipos de "inserção" (maneiras de inserir texto). Você está inserindo interativamente? Se sim, como?
Tirou
Interativamente. Mas, idealmente, não importa como ou o quê. É como se eu tivesse esquecido de começar a definir uma macro . Nesse caso, o problema é quando é isso. Talvez algum gancho possa ser usado.
ooi
2
Como você define 'última inserção' no Emacs? Como não existe uma opção de modo de edição / comando, como no vi, até onde devemos ir na história? Normalmente, apenas seleciono "a última inserção" ( C-spacemovo o cursor M-wpara copiar) e C-ycolo quantas vezes forem necessárias.
Alain

Respostas:

7

dot-modeé um "modo secundário para repetir digitação ou comandos" e pode fazer o que você precisa. Basicamente, apenas repete as últimas inserções / exclusões que você faz. É bem parecido com o .Vi (m).

Bill Benedetto
fonte
2
O que isso faz?
Malabarba
11
Bem-vindo ao Emacs.SE. No momento, sua resposta está mais próxima de um comentário do que de uma resposta. Você poderia editá-lo para explicar o que dot-modefaz e como fornece a funcionalidade que o OP está tentando obter?
Dan
7

É como se eu tivesse esquecido de começar a definir uma macro

Você pode usar kmacro-edit-lossage( C-x C-k l) para isso: permite visualizar as 300 últimas teclas digitadas (incluindo inserções simples) e editá-las como uma macro.

Para uso simples, basta localizar o início da inserção que deseja repetir, excluir todo o texto de "Macro:" para esse ponto e pressionar C-c C-c. Agora você tem uma macro que pode ser usada para executar as mesmas ações, como se não tivesse esquecido de registrá-la.

Infelizmente, isso falhará se os últimos 300 pressionamentos de tecla incluírem cliques do mouse.

Editar: O código a seguir altera para que apenas as chaves após o último evento do mouse sejam mantidas.

(defadvice recent-keys (after tv/recent-keys-no-mouse first ())
  "Return only the keys since the last mouse event"
  (let* ((vec ad-return-value)
         (lst (append vec nil))
         (nmax (length vec))
         (i (- nmax 1)))
    (while
        (and
         (>= i 0)
         (not
          (let ((mod (event-modifiers (elt vec i))))
            (or (memq 'click mod)
                (memq 'double mod)
                (memq 'triple mod)
                (memq 'drag mod)
                (memq 'down mod)))))
      (setq i (- i 1)))
    (setq ad-return-value (vconcat (nthcdr (+ i 1) lst) nil))))

(defun tv/kmacro-edit-lossage-no-mouse ()
  "Same as `kmacro-edit-lossage', but fallback if the keys contain mouse events.

Source: http://emacs.stackexchange.com/a/4071/184"
  (interactive)
  (ad-activate-regexp "tv/recent-keys-no-mouse")
  (call-interactively #'kmacro-edit-lossage)
  (ad-deactivate-regexp "tv/recent-keys-no-mouse"))

;; If you want this function to replace the default one, uncomment this line:
; (global-set-key (kbd "C-x C-k l") 'tv/kmacro-edit-lossage-no-mouse)
T. Verron
fonte
Costumo rolar com o mouse, seria legal ver como removê-los da macro.
ooi
Uau, esse comando seria útil se não falhasse completamente se os últimos 300 incluíssem cliques do mouse. Talvez não inclua os cliques e informe o usuário em vez de se recusar a trabalhar.
Nanny
@ nanny eu adicionei alguns elisp para habilitar um fallback (imo) melhor do que apenas falhar com uma mensagem de erro: com esta função, apenas as chaves após o último evento do mouse serão mantidas. Eliminar completamente os eventos do mouse também deve ser possível, mas o resultado da macro seria algo imprevisível.
T. Verron
@ooi Não faço ideia se você recebeu ping automaticamente pelo comentário anterior, então aqui está o seu ping também.
505 Verry # 3/14
Obrigado, eu estava trabalhando na mesma coisa. Eu acho que pode ser possível filtrar os argumentos de edmacro-fix-menu-commands. É preciso um argumento opcional que pode ignorar os eventos do mouse. Mas não sei o suficiente sobre o sistema de aconselhamento para fazê-lo funcionar.
Nanny
4

Eu acho que a dabbrev-expandfunção poderia fazer o truque. Vamos supor que você já digitou algumas palavras: emacs, emoção, emoji, ... Da próxima vez que digitar uma palavra iniciada por 'em', você poderá pressionar M-/e o emacs proporá que você insira uma das palavras já inseridas começando por 'em'. Continue batendo M-/e o emacs mostrará 'emoji', depois 'emoção, então ...

Você também pode dar uma olhada em repeat-complex-command . O exemplo popular é: você deseja repetir o comando query-replaceem muitos buffers diferentes sempre usando os mesmos argumentos, substitua “pitt” por “patt”.

Você o executa uma vez, acessa uma janela diferente e digita C-x ESC ESCpara executá-lo novamente.

E para finalizar, posso sugerir a inserção repetida ? Esse arquivo irá ajudá-lo a inserir, usando algum tipo de lógica. É mais como ", repita a última inserção, mas para cada iteração, os argumentos serão alterados.

Este exemplo pode ser encontrado no arquivo el :

;; You can also iterate over lists:
;;   My desk is cluttered
;;   My desk is a real mess
;;   My desk is very hard to see
;;   My desk is buried
;;
;; from m-x insert-patterned
;;    ";;   My desk is %s"
;;    (cluttered "a real mess" "very hard to see" buried)

Espero que ajude.

Nsukami _
fonte
11
Talvez você possa expandir um pouco ...
T. Verron
@ T.Verron Feito :)
Nsukami _
11
Repita-complexo-comando é como repeat(que o OP menciona), não é realmente útil para inserções de texto. Repeat-insertprecisa ser pensado antes de inserir o texto, como uma macro. Mas dabbrev-expandé uma boa ideia!
T. Verron