Como transpor argumentos de linha de comando com atalhos de teclado do emacs?

1

Usando o Bash, com o conjunto de atalhos do emacs, a atalho de teclas das palavras-chave de transposição ( M-t ) não transpõe argumentos, mas "palavras" (por sua própria definição de palavras).

Então, se eu tiver isso:

vimdiff project-number-One/Vagrantfile project-number-Two/Vagrantfile.old

e meu cursor está entre o primeiro e o segundo argumento quando eu entro na opção t , eu termino com

vimdiff project-number-One/project Vagrantfile-number-Two/Vagrantfile.old

que obviamente não é o que eu quero. Como posso transpor argumentos?

    
por iconoclast 16.10.2014 / 20:29

3 respostas

2

No bash, diferentes comandos possuem diferentes noções de palavras. C-w mata para o espaço em branco anterior, mas a maioria dos outros comandos, incluindo M-t usa palavras delimitadas por pontuação.

Com o cursor entre o primeiro e o segundo argumento, C-w C-e SPC C-y transpõe as duas palavras.

Se você quiser vincular uma chave à transposição de palavras delimitadas por espaços em branco, é mais complicado. Veja comportamento confuso de atalhos de estilo no estilo emacs no bash . Aqui está um código minimamente testado.

transpose_whitespace_words () {
  local prefix=${READLINE_LINE:0:$READLINE_POINT} suffix=${READLINE_LINE:$READLINE_POINT}
  if [[ $suffix =~ ^[^[:space:]] ]] && [[ $prefix =~ [^[:space:]]+$ ]]; then
    prefix=${prefix%${BASH_REMATCH[0]}}
    suffix=${BASH_REMATCH[0]}${suffix}
  fi
  if [[ $suffix =~ ^[[:space:]]+ ]]; then
    prefix=${prefix}${BASH_REMATCH[0]}
    suffix=${suffix#${BASH_REMATCH[0]}}
  fi
  if [[ $prefix =~ ([^[:space:]]+)([[:space:]]+)$ ]]; then
    local word1=${BASH_REMATCH[1]} space=${BASH_REMATCH[2]}
    prefix=${prefix%${BASH_REMATCH[0]}}
    if [[ $suffix =~ [^[:space:]]+ ]]; then
      suffix=${suffix#${BASH_REMATCH[0]}}
      READLINE_LINE=${prefix}${BASH_REMATCH[0]}$space$word1$suffix
      READLINE_POINT=$((${#READLINE_LINE} - ${#suffix}))
    fi
  fi
}
bind -x '"\e\C-t": transpose_whitespace_words'

Isso tudo é mais fácil em zsh…

    
por 17.10.2014 / 02:10
2

Se o seu cursor estiver lá:

vimdiff projectOne/Vagrantfile projectTwo/Vagrantfile
                              ^

Pressione Alt + BTTBBTFTBBTT

Ou simples:

Pressione Ctrl + W , Ctrl + E , insira um espaço em branco e pressione Ctrl + Y

    
por 16.10.2014 / 21:47
0

Você precisa pressionar BTTBBT em vez de um único T .

    
por 16.10.2014 / 20:37