vim не перемещается на ожидаемую строку

Если имена ваших каталогов такие простые, как вы показываете (по крайней мере, если они не содержат пробелов или других странностей), вы можете просто сделать:

for d in $(ls | sort -r | rev | uniq -s1 | rev); do echo "$d"; done

Измените echo "$ 4d" на то, что должен делать ваш цикл. Однако это не удастся, если имена ваших каталогов не совсем такие, как вы их показываете, поскольку он уязвим для всех ошибок синтаксического анализа ls. Он работает, сначала перечисляя каталоги, сортируя их в обратном порядке, меняя их местами (так a1 становится 1a ), сохраняя только уникальные строки, но игнорируя 1-й символ ( uniq - s1 ) и перевернув их, чтобы вернуть исходное имя.

0
17.02.2018, 15:16
2 ответа

Finalmente he llegado a la solución aceptada. Gracias a @B Layer por su cooperación (p. mencionando que el comando wsolo escribe líneas completas en un archivo ). He votado tu respuesta.

:let i=1
:1000 | exec 'normal! )hvggd' | exec 'if i<10 | let num="0". i | else | let num=i | endif' | call writefile(split(@@, "\n", 1), '/tmp/test'. num. '.txt') | let i=i+1

Después de eso, repite el comando presionando @:si el último fragmento tiene menos de 1000 líneas, obtendrás un error. Simplemente guarde el resto manualmente.

Después de 5 ejecuciones tuve lo esperado:

$ wc -l /tmp/test*.txt
  1001 /tmp/test01.txt
  1000 /tmp/test02.txt
  1001 /tmp/test03.txt
  1006 /tmp/test04.txt
  1001 /tmp/test05.txt

Para aquellos que quieran usarlo, explicaré brevemente los pasos clave:

:1000

Mover a la línea 1000 (Los fragmentos deben tener al menos 1000 líneas de largo)

exec 'normal! )hvggd'

Mover al comienzo de la siguiente oración y un carácter hacia atrás para que el primer carácter de la siguiente oración no se elimine después. Para que funcione correctamente en oraciones que se distribuyen en varias líneas, se debe configurar whichwrap=h,l, que no es el valor predeterminado que yo sepa. Seleccione todo, desde la posición actual del cursor hasta el comienzo y elimínelo. El contenido eliminado se guardará en el registro.

call writefile(split(@@, "\n", 1), '/tmp/test'. num. '.txt')

Escribir el contenido del registro (el fragmento )en un archivo

Partí del supuesto de que no habrá más de 99 fragmentos. Si necesita más, ajuste la parte relacionada con el relleno según sea necesario.

-1
28.01.2020, 02:24

La ​​raíz del problema es el gval final. No es necesario ya que la selección visual persiste desde la parte anterior del comando. Peor aún, no es inofensivo porque cuando haces gvcuando ya estás en modo Visual , el área Visual actual y anterior se intercambian . ¡Lo que significa que se vuelve a seleccionar la selección anterior!

Aunque se eliminó la selección anterior, la selección se aplica a la misma área... o al menos a lo que queda de ella. En este caso, esa sería la primera de las oraciones line 2.restantes.

Para demostrarlo, observe lo que sucede cuando ingresa esto dos veces:2G)hvgggvd. Esto es exactamente lo que sucede en la línea de comando, menos la escritura en disco, pero con comandos en modo 100% normal.

Entonces, de todos modos, solo necesitamos perder el gvy esto funcionará:

:2 | exec 'normal! )hvgg' | exec "'<,'>w! /tmp/part1.txt" | exec 'normal! d'

Más allá de eso, hay mucho ruido en este comando que se puede limpiar. Dos de los execy las comillas que los acompañan no son necesarios:

:2 | exec 'norm! )hvgg' | '<,'>w! /tmp/part1.txt | norm! d

Actualización:En respuesta a uno de sus comentarios esto...

'<,'>

es una operación por líneas que selecciona desde la primera línea de la última área visual seleccionada hasta la última línea de la misma área. Para obtener rangos sabios de caracteres, debe usar back -tics como este:

`<,`>

Sin embargo, esto no funcionará con :w... es solo una operación lineal.

Señalaría que esto está fuera del alcance de su pregunta, que pregunta por qué se está eliminando un texto en particular... por lo que es posible que desee hacer una pregunta separada para escribir en el archivo con carácter.

Actualización 2:Aquí hay un enfoque totalmente diferente a su problema...

Cree una macro con el siguiente comando

:let @q = ")hs\<CR>\<ESC>k:let @a=@a+1\<CR>:1,.w /tmp/part\<C-R>a.txt\<CR>dgg"
  • Ejecute este comando::let @a = 0.
  • Coloque el cursor sobre una frase y, en modo Normal,ejecuta la macro con@q

Esto se comportará de la forma en que describe :la oración y todo lo que esté arriba se escribirá en un archivo llamado /tmp/part1.txty el texto guardado se eliminará. Ahora muévase a cualquier otra oración y haga @qnuevamente y esta vez sucederá lo mismo pero escribirá a /tmp/part2.txt. Cada vez que ejecute la macro, el nombre del archivo se incrementará automáticamente -. Puede restablecer el índice nuevamente con :let @a = 0.

Al igual que la actualización anterior, esta no aborda la pregunta real formulada, pero como soy amable, estoy brindando ayuda adicional.(Y OP sigue sin aceptar mi respuesta.)

4
28.01.2020, 02:24

Теги

Похожие вопросы