In vim, is er een manier om “zeer magisch” permanent en wereldwijd in te stellen?

Ik gebruik “zeer magisch” voor regexp-zoekopdrachten (d.w.z. /\v of %s/\v) maar ik zou willen dat ik een optie kon instellen zodat ik \v nergens meer hoef op te nemen. Is er een manier om dit te doen?


Antwoord 1, autoriteit 100%

Niet direct, maar u kunt altijd een mapping gebruiken:

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

Zelfs als je ‘zeer magisch’ zou kunnen instellen op de manier waarop je set nomagic, zou je dat echt niet willen, omdat het vrijwel elke bestaande plug-in zou breken.

Bewerken

Zie ook deze pagina.


Antwoord 2, autoriteit 25%

EDIT2: ik heb net deze plug-in ontdekt, die misschien beter is dan de oplossingen voor opnieuw toewijzen (die een aantal onvermijdelijke nadelen lijken te hebben; zie hieronder). Ik heb het echter nog niet getest, dus ik weet niet of het zich precies naar wens gedraagt.

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

EDIT3: ik gebruik de plug-in nu ongeveer anderhalf jaar en ik ben er dol op. Het verstoort echter nog steeds de zoekgeschiedenis (zie hieronder), en het verbreekt ook incsearch, dus ik heb het volgende in mijn Vim-configuratie:

" Since I use incsearch:
let g:VeryMagic = 0
nnoremap / /\v
nnoremap ? ?\v
vnoremap / /\v
vnoremap ? ?\v
" If I type // or ??, I don't EVER want \v, since I'm repeating the previous
" search.
noremap // //
noremap ?? ??
" no-magic searching
noremap /v/ /\V
noremap ?V? ?\V
" Turn on all other features.
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

Ik heb de suggestie van DrAI een tijdje gebruikt, maar vond het in de praktijk frustrerend vanwege het volgende gedrag:

Als je het volgende typt:
/{patroon}
:%s//{replacement}

…dan, zonder deze toewijzing, kunt u zien wat u gaat vervangen voordat u een vervanging uitvoert. Maar met de remapping heb je ineens s/\v/in plaats van s//; dit komt overeen met alles in het bestand, wat duidelijk verkeerd is.

Gelukkig heeft de opdracht szelf een alternatieve vorm die very magicgebruikt voor het zoeken. Dus hier zijn de mappings die ik momenteel gebruik in mijn .vimrc:

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

Merk op dat alleen het toewijzen van s/tot problemen leidt bij een poging om een ​​patroon te gebruiken dat eindigt op s; op dezelfde manier zou het toewijzen van g/problemen opleveren bij het gebruik van patronen die eindigen op g. Merk op dat de toewijzingen :g/en :g//voorkomen dat Vim de opdracht onmiddellijk weergeeft.

EDIT: Helaas lijkt er geen “magische” versie van :globalte zijn, daarom is de schijnbaar overbodige mapping van :g//gebruikt om ervoor te zorgen dat het globale commando het vorige zoekpatroon kan gebruiken.

Een ander nadeel is dat deze hertoewijzingen de zoekgeschiedenis verstoren. Overweeg bijvoorbeeld om *te gebruiken om te zoeken naar het volgende voorkomen van het woord onder de cursor. Dit zorgt ervoor dat Vim zoekt naar het patroon \<[word]\>, dat nietbegint met \v. Zonder de hierboven beschreven hertoewijzingen, typt u /en drukt u op de pijl omhoog om dat zoekpatroon op te roepen. Bijde hertoewijzingen moet u echter, na het typen van /, de automatisch ingevoegde \vverwijderen voordat u op de pijl omhoog drukt om dat op te roepen patroon.


Antwoord 3, autoriteit 2%

Om te reageren op het bovenstaande antwoordaangezien ik nog geen commentaar kan geven, van Hoe laat ik substitute() een andere magische modus gebruiken?, de vim-documenten en mijn eigen testen, gaat smagic(en sm) alleen in de modus magicen niet in de modus very magic.

                       *:snomagic* *:sno*
:[range]sno[magic] ...  Same as `:substitute`, but always use 'nomagic'.
            {not in Vi} 
                        *:smagic* *:sm*
:[range]sm[agic] ...    Same as `:substitute`, but always use 'magic'.
            {not in Vi}

Je moet bijvoorbeeld (‘s veranderen in )‘s in een bestand met :%sm/(/)/gen niet :%sm/\(/\)/g, die het volgende voor mij laat zien

E54: Unmatched \(
E54: Unmatched \(
E476: Invalid command

Om de modus very magicin te voeren, moet men in plaats daarvan \vgebruiken in de zoekexpressie van substitute(dwz :%s/\v\(/\)/g)
(Corrigeer me als ik het verprutst heb, ik ben vrij nieuw bij Vim)


Antwoord 4

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

Voeg een normale modustoewijzing toe die automatisch de \vvoor u invoegt wanneer u een zoekopdracht begint

mijn huidige configuratie in init.vim:
(Ik wil naar de eerste regel gaan en dan zoeken, en terugkeren met 's, dus msgg)

" vim has set:  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 can not detect filetype?
    nnoremap / msgg/\v^[^#";(//)(/*)]*
endif
nnoremap ? msgg/\v
" nnoremap / /\v
cnoremap s/ s/\v

todo: plug-in voor very magic
https://github.com/coot/EnchantedVim

Other episodes