Jak zamienić tekst między cudzysłowami w vi

106

Powiedz, że mam ten wiersz kodu:

$query = "SELECT * FROM table";

Czy w vi / vim jest polecenie, które może natychmiast usunąć wszystko między cudzysłowami i ustawić kursor między nimi, abym mógł zacząć pisać?

Nikola
źródło

Odpowiedzi:

182

Użyj ci", co oznacza: zmień to, co wewnątrz podwójnych cudzysłowów.

Możesz także manipulować innymi obiektami tekstowymi w podobny sposób, np .:

  • ci' - zmiana w pojedynczych cudzysłowach
  • ciw - zmiana wewnątrz słowa
  • ci( - zmiana w nawiasach
  • dit - usuń wewnątrz tagu HTML itp.

Więcej o różnych obiektach tekstowych VIM tutaj .

Eugene Yarmash
źródło
2
Wydaje się, że działa tylko z vim, ale NIE vi. (Nie jestem pewien)
Ivan Chau
U mnie działa to tylko w bieżącej linii, a nie w żadnym miejscu w dokumencie.
I wreszcie
jakie polecenie zrobiłoby to wstecz? Dzieje się tak, jeśli chcesz zamienić tekst w cudzysłowach, który znajduje się za kursorem.
dtburgess
1
@dtburgess: Jeden sposób F"ci".
Eugene Yarmash
ci 'and ci "działa dobrze, ale ci (nie działa dla mnie. Czy ktoś ma jakieś pomysły dlaczego?
Vram Vardanian
24

Możesz wybierać między cudzysłowami, a następnie usuwać ( d), zmieniać ( c) itp. Za pomocą

vi"

Podobnie możesz podstawić nawiasy klamrowe, nawiasy, elementy XML itp. W ten sposób:

vi(
vi{
vit

lub po prostu zmienić / usunąć, zrobić odpowiedni di", ci"itp Podstawiając ado iwoli obejmujący otaczające elementy (aby zaznaczyć lub zmienić uchwyty i zawartość, na przykład)

Brian Agnew
źródło
5

Zrobiłem wtyczkę vim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

Zapewnia obiekty tekstowe dla najbliższych par cudzysłowów dowolnego typu i obsługuje cudzysłowy obejmujące wiele wierszy. Używanie tylko iqlub aqpozwala na operowanie na treści pojedynczych ('), podwójnych (") lub tylnych (`) cudzysłowów, które obecnie otaczają kursor, znajdują się przed lub za nim (w tej kolejności) Innymi słowy, w razie potrzeby przeskakuje do przodu lub do tyłu, aby dotrzeć do cudzysłowów.

Łatwiej jest to zrozumieć, patrząc na przykłady (kursor jest wyświetlany |):

  1. Przed foo '1, |2, 3' bar:; po naciśnięciu diq:foo '|' bar
  2. Przed foo| '1, 2, 3' bar:; po naciśnięciu diq:foo '|' bar
  3. Przed foo '1, 2, 3' |bar:; po naciśnięciu diq:foo '|' bar
  4. Przed foo '1, |2, 3' bar:; po naciśnięciu daq:foo | bar
  5. Przed foo| '1, 2, 3' bar:; po naciśnięciu daq:foo | bar
  6. Przed foo '1, 2, 3' |bar:; po naciśnięciu daq:foo | bar

Powyższe przykłady są podane dla pojedynczych cudzysłowów, wtyczka działa dokładnie tak samo dla cudzysłowów podwójnych (") i odwrotnych (`).

Można również używać innych operatorów: ciq, diq, yiq, viq, itd

Aby uzyskać więcej informacji, zajrzyj na stronę github, do której link znajduje się powyżej.

Anton Beloglazov
źródło
3

Już od wewnątrz cytatów możesz zrobić

di"

Przeczytaj jako usuń w środku ”

Sam Peacey
źródło
6
Kursor nie musi znajdować się w ciągu znaków w podwójnych cudzysłowach, ponieważ polecenie domyślnie zmienia pierwszy taki ciąg w linii
Eugene Yarmash
1
Dzięki, dobrze wiedzieć! Pokazuje tylko, że powinienem uważniej czytać. :)
Sam Peacey,
3

Oprócz odpowiedzi Briana możesz również p(wklejać) i y(szarpać) nową wartość, więc jeśli chcesz zastąpić wartość w cudzysłowach inną wartością, możesz zrobić yi"na zaznaczeniu, które chcesz skopiować, vi"aby zaznaczyć obszar którą chcesz zastąpić, a następnie po prostu ppoprawnie zamienić wartość.

Ulisses Caon
źródło
0

Wybrana odpowiedź jest odpowiednia TYLKO dla ViM, ale NIE dla vi. Pytanie jest również niedokładne, ponieważ autor nie wspomniał, jaka jest początkowa pozycja kursora. Jeśli założymy, że kursor znajduje się w cudzysłowie, to dla vi odpowiedź będzie wyglądać tak:

T"ct"

Gdzie:

T ”- cofnij się zaraz po znaku„

c - polecenie zmiany

t "- podaje pozycję końcową komendy c, w której ma przestać kasować znaki, innymi słowy zakres do zmiany

user1337
źródło