Trate símbolos como palavras nos modos prog

12

Existem vários comandos no Emacs que se aplicam a "palavras". Exemplos incluem forward-word, kill-word, upcase-word, mark-word, transpose-words, etc. A definição de "palavra" parece variar um pouco entre os comandos. Por exemplo, forward-wordirá parar com um sublinhado dentro de uma palavra (por exemplo foo_bar), mas mark-wordnão para o sublinhado.

É possível alterar a definição de "palavra" quando estou no modo prog, para que o Emacs use os limites de palavras apropriados para a sintaxe do idioma atual?

Quando estou dentro c-mode, quero forward-wordpular os sublinhados, e quando estou lisp-mode, quero forward-wordpular os hífens e os sublinhados, etc.

nispio
fonte

Respostas:

4

O Emacs já deve usar " os limites de palavras apropriados para a sintaxe do idioma atual ". Caso contrário, registre um bug para o modo principal desse idioma.

Mas talvez você não esteja realmente falando de palavras . Talvez você queira dizer sintaxe do símbolo , não sintaxe da palavra. O Emacs distingue os dois.

Para sintaxe de símbolos, use comandos de símbolos, não comandos de palavras:, forward-symboletc. Na sua descrição, é isso que você realmente deseja.

Se você realmente deseja usar uma função de palavra em um símbolo, pode alterar a categoria de sintaxe de caracteres específicos para ter uma sintaxe constituinte da palavra em vez da sintaxe constituinte do símbolo. Mas geralmente não é isso que você quer fazer e não precisa fazê-lo.

Consulte o manual do Elisp para obter informações sobre sintaxe de caracteres. E consulte o manual do Emacs e o manual do Elisp para obter comandos e outras funções que operam em símbolos (não símbolos Lisp, mas texto com sintaxe de símbolo, em qualquer idioma).

E lembre-se de que as operações no sexps também são úteis também para atuar em símbolos: C-M-f( forward-sexp), C-M-t( transpose-sexps), etc.

Desenhou
fonte
C-M-festá vinculado forward-sexpe não se comporta nada como o que você descreve. Você está certo de que o que eu quero é navegar por símbolos, mas não vejo essa opção.
Nispio 9/10/2014
O @nispio forward sexpé essencialmente a forward-symbolmaior parte do tempo, com a versatilidade adicional de também repassar chaves. Você deveria dar uma chance.
Malabarba 10/10
@ Malabarba Eu discordo totalmente que forward-sexpé uma aproximação aproximada de forward-symbol. Para iniciantes, ele pode confundir você sobre funções inteiras, aterrando centenas de linhas a partir de onde você começou. Ele também pula sobre listas de argumentos, etc. E tente o seguinte: dado o seguinte código lisp, (global-set-key [remap list-buffers] 'ibuffer)coloque o cursor no meio da palavra remape execute forward-sexpalgumas vezes. Isso gera um erro quando atinge o fechamento ]. Não, obrigado.
Nispio 10/10
@nispio Eu sempre uso uma combinação de navegação por sexp e palavras. Dessa forma, posso evitar qualquer um desses problemas, tendo a versatilidade de ambos. Mas é tudo uma questão de preferência. ;-) Se você sabe que nunca perderá a navegação por palavras, superword-modepode ser o seu cara.
Malabarba 10/10
Desculpe, eu não deveria ter sugerido isso C-M-fe C-M-tagir sobre símbolos (eles atuam sobre sexps). Vou editar para corrigir essa impressão. Mas você certamente pode vincular forward-symbola qualquer chave que desejar, se a achar particularmente útil. Não existe transpose-symbols, mas você pode escrever um, novamente, se achar que é útil.
Tirou
11

Dê uma olhada superword-modee subword-mode. A Superword trata os sublinhados como parte de uma palavra em vez de um limite; portanto, foo_bar seria tratada como uma única palavra .
A subpalavra faz o oposto, exceto para camelCase, portanto fooBaré tratada como duas palavras em vez de uma.

Parece que o comportamento que você deseja é cc-modeusar superword-mode.

(add-hook 'c-mode-common-hook 'superword-mode)

Eu recomendaria a leitura na fonte subword-mode, pois, mesmo que esses dois modos não estejam fazendo exatamente o que você deseja, devem mostrar como alterar o comportamento de detecção de palavras.

Discussão mais longa sobre emacsredux e ergomacs .

dgtized
fonte
É possível fazer superword-modeum bom jogo paredit? Por exemplo, paredit-forward-kill-wordnão exclui a palavra inteira (contendo sublinhados) quando superword-modeestá ativada.
Renan Ranelli 10/10
Está mudando a definição de uma palavra e pareditestá respeitando isso, então acho que está fazendo o que é solicitado.
dgtized
O fato é que o pareditado não está respeitando isso. paredit-forward-kill-wordnão mata a mesma palavra definida por superword-mode.
Renan Ranelli 10/10
Oh, eu li errado. Hmm. Basta dar uma olhada paredit-forward-kill-worde parece que está fazendo sua própria análise. Portanto, pode ser capaz de trocar isso, mas provavelmente não.
dgtized
3

Se eu entendi sua pergunta, você pode modificar a tabela de sintaxe da linguagem, por exemplo, para c ++:

(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

M-x apropos a pesquisa da tabela de sintaxe também deve ajudá-lo.

Nsukami _
fonte