Режим Vim Visual: выберите текущий блок под курсором

869
krystah

Учитывая, что у нас есть текущие данные:

ID NAME AGE  1 Joan 29 2 Peterson 16 3 Hunt 47 4 Wenche 12 5 Kennedy 29 6 Lottie 31 

И курсор является на Nин NAME, как я хотел бы идти о выборе текста, так что, если |есть разделители визуального блока, выбор должен быть такой

ID |NAME | AGE  1 |Joan | 29 2 |Peterson| 16 3 |Hunt | 47 4 |Wenche | 12 5 |Kennedy | 29 6 |Lottie | 31 

Конечный пробел после каждого элемента, чтобы соответствовать ширине, Petersonне является необходимым, но мне нужен быстрый способ выделить текущий блок, если он существует.

6
Просматривая текущие ответы, я понял, что должен был указать дальше - я НЕ хочу использовать магические числа. В случае «4j» 4 - магическое число. Я хочу быстрый способ сделать это без необходимости тратить время на ручной подсчет и этот джаз. krystah 10 лет назад 0
Я предоставил решение без «магических чисел», но вы не запретили искать буквы, которые я до сих пор использую. Вам нужно будет пойти на какую-то уступку с точки зрения нахождения самого длинного слова в столбце, чтобы блок выбора соответствовал нужному размеру (если вы хотите, чтобы пробел также был идеальным). treddy 10 лет назад 0
Я имел в виду часть вашего ответа "9999999j". Есть несколько причин, почему я не хочу использовать такие магические числа. Основная причина, очевидно, в том, что он не очень хорошо играет, если под таблицей данных есть контент. Если бы был только способ спуститься до пустой строки .. Хм. krystah 10 лет назад 0
4 или 9999 не являются магическими числами (они, очевидно, отличаются и зависят от контекста, поэтому в них нет ничего магического), но то, что вы * хотите *, является магическим методом: он будет работать одинаково в любом контексте. Если вы ничего не нашли в `: help`, на vim.org или в vim wiki, его просто не существует. Вы просите нас написать эту функцию для вас? romainl 10 лет назад 0
Это именно то, что я имею в виду под «магическим». Негибкие, зависящие от контекста числа. Я пытаюсь обойти это без прибегая к грандиозной функции или существующего плагина. Итак, в основном я спрашиваю следующее: существует ли известный текстовый объект Vim, который охватывает текущий блок? Если да, я хотел бы услышать это. Если нет, я прибегну к плагину. krystah 10 лет назад 0
Ну, это в точности противоположно магическому числу, но как бы то ни было, нет собственного текстового объекта «зубчатая колонка текста» (как вы уже знаете, если вы читали `: help motion.txt`), но для этого есть плагин Конечно, смотрите мой ответ. romainl 10 лет назад 0

4 ответа на вопрос

1
romainl

С курсором на Nо NAME, я бы просто сделать следующее без особого ухода за игрой в гольф:

<C-v>}hhhhhhhh 

Но плагин textobj-column делает именно то, что вы хотите. Волшебно.

Все эти решения кажутся слишком ручными для моего первоначального намерения, поэтому я пойду на плагин, спасибо. krystah 10 лет назад 0
0
treddy

Вот один из способов сделать это:

  1. Сначала используйте control-vдля входа в режим визуального блока
  2. Затем введите, 2jчтобы перейти на две строки вниз к Petersonзаписи
  3. Используйте нижний регистр, eчтобы переместить выделение блока в конец словаPeterson
  4. Тип 4jдля перемещения выделения вниз по последним четырем строкам

Изменить: Если вы действительно настаиваете на том, чтобы избежать «магических чисел», вы можете сделать что-то, как описано здесь: https://stackoverflow.com/questions/3736678/how-do-you-select-a-whole-column-in-visual- блок-режим

  1. :set nosol(чтобы Gкоманда не возвращалась к первой строке при выборе визуального блока)
  2. control-v
  3. /P (вы сказали, что нет магических чисел, но не запретили поиск букв - если пробел не имеет решающего значения, вы можете проигнорировать это)
  4. e (перейти к концу слова)
  5. G (переместить выделение блока вниз)

Другие советы:

  • если вам нужно повторно выбрать тот же блок позже, вы можете набрать gv
  • vиспользуется для посимвольного визуального режима и Vдля построчной, в то время control-vкак выше указано для блочного визуального режима

Полезные ссылки (кроме интернета):

  • Книга Practical VimДрю Нейла действительно хорошо написана
Да, и вы, и ответы ygonchos достигли цели в конце концов, но я ищу способ сделать это без «магических чисел». Я уточнил в комментарии ниже мой вопрос. krystah 10 лет назад 0
0
ygoncho

Существуют сценарии, облегчающие эту задачу, но при условии, что вы хотите использовать raw vim, вот мой самый известный способ сделать это:

а. Убедитесь, что ваша последняя строка файла заполнена пробелами, что-то вроде этого:

"______________________________________",

затем перейдите к первой букве N в «Имя». Хит ctrl-v, w, 999999jи колонка будет выбрана.

Последняя строка должна быть заполнена пробелами, если ваш файл заканчивается новой строкой, поскольку в визуальном режиме нельзя выбрать части файла, которые не были созданы. если последняя строка является жизнеспособным контентом, вам это не нужно. ctrl-v+wвыбирает слово, затем 999999jпросто берет курсор «вниз» на 99999 строк (или меньше, если файл меньше).

Примечание. Вы увидите, что это выделение всего столбца, и пробелы немного отличаются от того, что вы указали (но вы сказали, что это неважно). Насколько мне известно, если вы хотите, чтобы столбец был выровнен по концу самого большого слова, а не по началу следующего, вам нужно будет вручную найти самый большой размер слова, выбрать визуальную длину и затем выполнить что - то вроде 99999j.

Да, и вы, и ответы Тредди выполняете эту работу, но я ищу способ сделать это без «магических чисел». Посмотрите на комментарий ниже моего вопроса :) krystah 10 лет назад 0
0
jgeralnik

То же, что и ответ игончо, но без «магических чисел»

Ctrl-V, W, G

G идет прямо к последней строке файла, не разбивая '9' несколько раз

Это было моей первоначальной мыслью при чтении решения, но G не обращает внимания на ваше текущее горизонтальное положение и вполне может переместить вас к первому символу последней строки, если это действительно последний символ в файле. Вид неприглядный krystah 10 лет назад 0
Во-первых, 99999j тоже. Но при условии, что ваши данные отформатированы как в вопросе без пустой строки в конце, это работает просто отлично. jgeralnik 10 лет назад 0
Идея использования этого вопроса заключалась в том, чтобы легко отформатировать и работать со статическими массивами и тому подобным, поэтому у меня практически никогда не будет ничего ниже этого. Но посмотрите на плагин, связанный с romainl, он действительно аккуратный! krystah 10 лет назад 0