W Vimie szuka się nowych linii jako \n
, ale nowe linie w ciągu zastępującym należy wprowadzić jako \r
. Rozumiem, że istnieją powody takiego zachowania , ale dla moich celów po prostu uważam to za irytujące. Chcę móc używać \n
(zasadniczo) tej samej rzeczy zarówno we wzorcu wyszukiwania, jak i w łańcuchu zastępczym: w szczególności we wzorcu wyszukiwania powinien on pasować do nowych linii, a w łańcuchu zastępczym powinien wstawiać nowe linie.
Czy istnieje sposób na uzyskanie tego zachowania? Nie sądzę, aby proste zmiany mapowania działały, ponieważ polecenie zastępcze musi zostać przeanalizowane w celu ustalenia, czy \n
jest częścią wzorca wyszukiwania, czy ciągu zastępującego.
c_CTRL-\_e
zgetcmdline() =~#
, a nie szczegóły regex używane, nie sądzę, że zasługuje na swoją własną odpowiedź.Odpowiedzi:
Musisz podpiąć się do linii poleceń; albo podczas wykonywania go za pośrednictwem
<CR>
, albo natychmiast po wprowadzeniu\n
. Za pomocą:help c_CTRL-\_e
możesz ocenić funkcję i zmodyfikować wiersz poleceń. Oto wersja demonstracyjna, którą możesz rozbudować i ulepszyć (kontrola zamiany jest teraz bardzo uproszczona):źródło
<C-\>e
to całkiem fajna funkcja, o której nie wiedziałam..vimrc
, z wyjaśnieniem.Jak napisał Ingo Karkat, rozwiązanie można znaleźć za pomocą
c_CTRL-\_e
. Oto wersja, której używam, która jest identyczna z oryginalnym rozwiązaniem, z wyjątkiem wzorca wyrażenia regularnego. (Ponieważ jest to tak naprawdę odpowiedź Ingo Karkat z niewielkim ulepszeniem zasugerowanym przez Ingo Karkat , nie sądzę, że tak naprawdę zasługuje na swoją własną odpowiedź, ale chyba jestem przegłosowany: http://chat.stackexchange.com/transcript/ wiadomość / 15021397 # 15021397 )Objaśnienie wzoru wyrażenia regularnego:
[%>]s
zapewnia, że wymiana nastąpi tylko wtedy, gdys
nastąpi natychmiast po zasięgu\([um]\w*\)\?
dopasowuje odmianys
polecenia, takie jaksmagic
.\(.\)
będzie pierwszym znakiem niebędącym słowem, ponieważ wszystkie znaki słowne zostaną już zjedzone\w
w opcjonalnej grupie. Pamiętaj, że jest to grupa2
. Jest to zwykle znak separatora/
. Zauważ, że_
będący znakiem słownym jest również prawidłowym separatorem, więc wzorzec nie będzie działał poprawnie, jeśli_
zostanie użyty w ten sposób._
Jednak nigdy nie używam jako separatora, więc nie będę się tym martwić. Podobnie, istnieją pewne znaki, które nie są znakami słownymi, ale których nie należy używać jako separatorów, ale nie martwię się o to tutaj, ponieważ w takim przypadku polecenie i tak powinno się nie powieść. Chciałem\W
tutaj skorzystać , ale z jakiegoś powodu to nie działało, kiedy go testowałem..\{-}
powinien pasować do wzorca (\{-}
jest podobny do Perla*?
).\(\\\)\@<!\2
dopasowuje następne wystąpienie znaku separatora nie poprzedzone ukośnikiem wstecznym. Odpowiednikiem Perla byłoby(?<!\\)\2
..*
pasuje do tego, co do tej pory znajdowało się w ciągu zastępującym.\\$
pasuje tylko wtedy, gdy dotychczasowe polecenie kończy się odwrotnym ukośnikiem.źródło
:h range
. Nie łapiesz wszystkich zakresów (nie jestem pewien, czy istnieje dobry sposób, aby to zrobić.)Alternatywna odpowiedź przy użyciu wtyczki (jest to rozwiązanie, z którego zdecydowałem się skorzystać, chociaż działa tylko z Vimem 7.4+):
Używając Enchanted Vim , włóż
let g:VeryMagicSubstituteNormalise = 1
swój.vimrc
.(Ta wtyczka korzysta z wtyczki CRDispatcher , która pozwala na zastępowanie tekstu w poleceniach po naciśnięciu klawisza Enter, ale przed wykonaniem polecenia. Nie
\n
jest więc wymagane ponowne mapowanie , a podstawienie jest niewidoczne dla użytkownika, sprawiając\n
wrażenie , jakby miał to samo „znaczenie” w obu kontekstach).źródło