68 votes

Dans vim, y a-t-il un moyen de définir "très magique" de manière permanente et globale ?

J'utilise "very magic" pour les recherches regex (c.-à-d. /\v ou %s/\v) mais j'aimerais pouvoir définir une option pour ne plus avoir à inclure \v n'importe où. Est-ce possible de le faire?

66voto

DrAl Points 29528

Pas directement, cependant vous pouvez toujours utiliser un mapping :

:nnoremap / /\v
:cnoremap %s/ %s/\v

Même si vous pouviez définir 'very magic' de la manière dont vous pouvez le faire avec set nomagic, vous ne voudriez vraiment pas le faire car cela casserait à peu près tous les plugins existants.

Éditer

Voir aussi cette page.

1 votes

Bon point concernant les plugins. Je n'y avais pas pensé. Merci pour la réponse.

0 votes

J'ai ajouté un lien vers une page wikia qui pourrait vous être utile.

21 votes

+1 Merci. Pour ce que ça vaut, cela semble être plus généraliste : :cnoremap s/ s/\v.

16voto

Kyle Strand Points 2340

EDIT2: Je viens de découvrir ce plugin, qui pourrait être meilleur que les solutions de remappage (qui semblent avoir quelques inconvénients inévitables; voir ci-dessous). Je ne l'ai pas encore testé, donc je ne sais pas s'il se comporte exactement comme désiré.

http://www.vim.org/scripts/script.php?script_id=4849

EDIT3: J'utilise le plugin depuis environ un an et demi, et je l'adore. Cependant, il interfère toujours avec l'historique de recherche (voir ci-dessous), et il casse également incsearch, donc j'ai ce qui suit dans ma configuration Vim:

" Puisque j'utilise incsearch :
let g:VeryMagic = 0
nnoremap / /\v
nnoremap ? ?\v
vnoremap / /\v
vnoremap ? ?\v
" Si je tape // ou ??, je ne veux JAMAIS de \v, car je répète la recherche précédente.
noremap // //
noremap ?? ??
" recherche sans magie
noremap /v/ /\V
noremap ?V? ?\V

" Activer toutes les autres fonctionnalités.
let g:VeryMagicSubstituteNormalise = 1
let g:VeryMagicSubstitute = 1
let g:VeryMagicGlobal = 1
let g:VeryMagicVimGrep = 1
let g:VeryMagicSearchArg = 1
let g:VeryMagicFunction = 1
let g:VeryMagicHelpgrep = 1
let g:VeryMagicRange = 1
let g:VeryMagicEscapeBackslashesInSearchArg = 1
let g:SortEditArgs = 1

J'ai utilisé la suggestion de DrAI pendant un certain temps, mais j'ai trouvé cela frustrant en pratique en raison du comportement suivant :

Si vous tapez ce qui suit : /{pattern} :%s//{replacement}

... alors, sans ce remappage, vous pouvez voir ce que vous êtes sur le point de remplacer avant de le faire. Mais avec le remappage, vous avez soudainement s/\v/ au lieu de s//; cela correspond à tout dans le fichier, ce qui est évidemment incorrect.

Heureusement, la commande s elle-même a une forme alternative qui utilise la recherche very magic. Voici donc les remappages que j'utilise actuellement dans mon .vimrc:

nnoremap / /\v
vnoremap / /\v
cnoremap %s/ %smagic/
cnoremap >s/ >smagic/ 
nnoremap :g/ :g/\v
nnoremap :g// :g//

Remarquez que le simple remappage de s/ conduit à des problèmes lors de l'utilisation d'un motif se terminant par s; de même, le remappage de g/ causerait des problèmes lors de l'utilisation de motifs se terminant par g. Notez que les remappages :g/ et :g// empêchent Vim d'afficher immédiatement la commande.

EDIT: Malheureusement, il ne semble pas y avoir de version "magique" de :global, c'est pourquoi le remappage apparemment superflu de :g// est utilisé pour s'assurer que la commande globale peut utiliser le motif de recherche précédent.

Un autre inconvénient est que ces remappages interfèrent avec l'historique de recherche. Par exemple, considérons l'utilisation de * pour rechercher la prochaine occurrence du mot sous le curseur. Cela fait en sorte que Vim recherche le motif \<[mot]\>, qui ne commence pas par \v. Sans les remappages décrits ci-dessus, en tapant / et en appuyant sur la flèche vers le haut, vous rappellerez ce motif de recherche. Avec les remappages, cependant, après avoir tapé /, vous devez supprimer le \v inséré automatiquement avant d'appuyer sur la flèche vers le haut pour rappeler ce motif.

1 votes

cnoremap >s/ >smagic/ ne semble pas fonctionner lorsque je sélectionne une plage visuelle. J'ai également essayé d'échapper le crochet à cnoremap \>s/ \>smagic/ mais cela n'a pas fonctionné non plus.

0 votes

@DaveKennedy Avez-vous essayé le plugin? Il est beaucoup plus fiable pour moi; je n'ai eu que très peu de problèmes avec cela. Je n'utilise plus les mappings répertoriés dans ce deuxième bloc de code.

1voto

Anonymous Points 382

Pour répondre à la réponse ci-dessus car je ne peux pas encore commenter, de Comment faire en sorte que substitute() utilise un autre mode magique?, la documentation de vim et mes propres tests, smagic (et sm) n'entrent que en mode magic et non pas en mode very magic.

                        *:snomagic* *:sno*
:[range]sno[magic] ...  Identique à `:substitute`, mais utilise toujours 'nomagic'.
            {not in Vi} 

                        *:smagic* *:sm*
:[range]sm[agic] ...    Identique à `:substitute`, mais utilise toujours 'magic'.
            {not in Vi}

Par exemple, on devrait faire en sorte que les ( se transforment en ) dans un fichier avec :%sm/(/)/g et non pas :%sm/\(/\)/g, ce qui m'affiche ce qui suit

E54: Unmatched \(
E54: Unmatched \(
E476: Commande invalide

Au lieu de cela, pour entrer en mode very magic, on devrait utiliser \v dans l'expression de recherche de substitute (c'est-à-dire :%s/\v\(/\)/g) (Merci de me corriger si j'ai fait une erreur, je suis assez nouveau sur Vim)

0voto

pen good Points 1

https://learnvimscriptthehardway.stevelosh.com/chapters/31.html#magic

Ajoutez un mapping en mode normal qui insérera automatiquement le \v pour vous chaque fois que vous commencez une recherche

ma configuration actuelle dans init.vim:
(Je veux aller à la première ligne, puis effectuer une recherche, et revenir en utilisant 's, donc msgg)

" vim a défini:  au BufNewFile,BufRead *.ahk  setf autohotkey
if &filetype == 'vim'
    nnoremap / msgg/\v^[^"]*
elseif &filetype == 'autohotkey'
    echo 'ahk'
    nnoremap / msgg/\v^[^;]*
    " todo 
    " https://github.com/hnamikaw/vim-autohotkey
elseif expand('%:t') == 'wf_key.ahk'
    nnoremap / msgg/\v^[^;]*

elseif &filetype  == 'zsh'
    nnoremap / msgg/\v^[^#]*
else
    " vscode neovim ne peut pas détecter le type de fichier?
    nnoremap / msgg/\v^[^#";(//)(/*)]*
endif

nnoremap ? msgg/\v
" nnoremap / /\v
cnoremap s/ s/\v

todo: plugin pour very magic https://github.com/coot/EnchantedVim

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X