Вопрос или проблема
перейти к строке и столбцу команды vi
Я долго смешивал использование emacs
и vi
(vim
). Каждый из них имеет свои преимущества. Я парсирую вывод ошибок из процесса компиляции и получаю номер строки и столбца, но я могу использовать emacs
для прямого перехода к строке и столбцу:
emacs +15:25 myfile.xml
В vi
у меня есть только номер строки (согласно странице man)
vi +15 myfile.xml
Существует опция для перемещения курсора на шаблон (vi +/pattern myfile.xml
), но у меня она никогда не работала. Но это не помогло бы мне, поскольку шаблон не всегда является первым вхождением в файле.
Как я могу запустить vi
, чтобы он переместился на столбец 25 в строке 15 моего файла? Могу ли я что-то сделать с опцией -c
?
Вы можете использовать:
vi '+normal 15G25|' myfile.xml
С помощью плагина file-line вы можете просто добавить номер строки и столбца к имени файла, как при вызове Vim, так и внутри с помощью команд, таких как :edit
:
vim myfile.xml:15:25
На всякий случай есть -c 'normal 14j24l'
, который переместит вас на строку 15, символ 25.
Я не знаю об опции -c
, но вы должны иметь возможность сделать:
vi '+cal cursor(15,25)' myfile.xml
(убедитесь, что вы используете кавычки из-за круглых скобок ()
)
Стоит отметить:
-c command
Запустите данную ex-команду при старте. Только одна опция -c разрешена для vi; Vim принимает до 10. Старая форма этой опции, +command
, все еще поддерживается.
Опция +command
имеет то же ограничение на одну ex команду
при использовании vi
.
Опция +/pattern
также ограничена одной командой с vi
.
(взято из vim и ex редактор)
Вы можете добавить следующий код в ваш vimrc, чтобы при возврате к вашему файлу, vim автоматически возвращался на старую позицию:
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif
Я хотел создать алиас, который позволил бы мне использовать vi file:line:col
(полезно при копировании из вывода grep
), и, похоже, это выполняет свою задачу. (Буду рад улучшениям.)
alias vi='vi_with_line_col() {
local filename line column
if [[ "$1" =~ ^(.+):([0-9]+):([0-9]+)?$ ]]; then
if [ -n "$BASH_VERSION" ]; then
filename="${BASH_REMATCH[1]}"
line="${BASH_REMATCH[2]}"
column="${BASH_REMATCH[3]:-}"
else
filename="${match[1]}"
line="${match[2]}"
column="${match[3]:-}"
fi
if [ -n "$column" ]; then
command vi +"call cursor($line, $column)" "$filename"
else
command vi +"$line" "$filename"
fi
else
if [[ "$1" =~ ^(.+):([0-9]+)?$ ]]; then
if [ -n "$BASH_VERSION" ]; then
filename="${BASH_REMATCH[1]}"
line="${BASH_REMATCH[2]:-}"
else
filename="${match[1]}"
line="${match[2]:-}"
fi
command vi +"$line" "$filename"
else
command vi "$@"
fi
fi
}; vi_with_line_col'
Ответ или решение
Вопрос заключается в том, как в текстовом редакторе vi
(или vim
) переместить курсор на определённую строку и столбец файла, учитывая, что при запуске редактора можно указать только номер строки.
Для того чтобы открыть файл и сразу перейти к нужной строке и столбцу, вы можете использовать следующую команду:
vi '+normal 15G25|' myfile.xml
Разберём эту команду подробнее:
+normal
— это команда, которая позволяет выполнить команду в нормальном режиме по окончании загрузки.15G
— перемещает курсор на строку 15.25|
— перемещает курсор на столбец 25 в указанной строке.
Таким образом, после выполнения этой команды редактор vi
откроет файл myfile.xml
и установит курсор на строку 15 и столбец 25.
Кроме того, в vim
вы можете воспользоваться более удобной функцией, если у вас установлен плагин file-line
. В этом случае вы сможете открыть файл, указав строку и столбец в формате:
vim myfile.xml:15:25
Если нужно просто указать строку и продолжить работу, вы также можете использовать команду:
vi '+15' myfile.xml
Это откроет файл с курсором на строке 15, а затем вам нужно будет вручную переместить курсор к нужному столбцу.
Существует также возможность использования опции -c
, но в vi
она ограничена одной командой. В vim
вы можете использовать несколько команд с этой опцией. Например, следующая команда установит курсор на строку 15 и столбец 25:
vi -c 'normal 15G25|' myfile.xml
Если вы хотите автоматизировать этот процесс, можно создать алиас в вашем .bashrc
или .zshrc
файле, чтобы быстро переходить к указанной строке и столбцу, используя формат файл:строка:столбец
. Пример алиаса может выглядеть так:
alias vi='vi_with_line_col() {
local filename line column
if [[ "$1" =~ ^(.+):([0-9]+):([0-9]+)?$ ]]; then
filename="${BASH_REMATCH[1]}"
line="${BASH_REMATCH[2]}"
column="${BASH_REMATCH[3]:-}"
if [ -n "$column" ]; then
command vi +"call cursor($line, $column)" "$filename"
else
command vi +"$line" "$filename"
fi
else
command vi "$@"
fi
}; vi_with_line_col'
Этот алиас позволит вам использовать формат vi файл:строка:столбец
для быстрого открытия файлов в vi
с указанием позиции курсора.
Таким образом, существует несколько методов для достижения желаемого результата, и вы можете выбрать наиболее удобный для вашего рабочего процесса.