Прапусціць вертыкальны пропуск/непробельные блокі (выгляд вертыкальныя М-F/M-B)

Скажам, кропка знаходзіцца на 0 тут:

as0sasasa
asasasasa
as1sasasa
    asa
as3sasasa
asasasasa
as2sasasa

Я хацеў бы мець каманду - як вертыкальны наперад-слова - што пры запуску неаднаразова скакаў першы ў кропцы 1, затым да кропкі 2. І яшчэ адна каманды - вертыкальны сыходзяць назад слова - што б затым перайсці назад да 3, і, нарэшце, да 0 раз.


Прэцэдэнты (гл каментары)

У мяне ёсць некалькі табліц ў латэксе, якія структураваныя наступным чынам:

header    text    text    text    
          text    text    text    
          text    text    text    
header    text    text    text    
          text    text    text    
          text    text    text    

Гэтая каманда будзе карысная для пераходу да розных асобнікам загаловак . Акрамя таго, я часта фарматаваць звычайны тэкст, як гэта

texttexttexttexttexttext
  texttexttexttexttexttext
  texttexttexttexttext
  texttexttexttexttexttexttext
  texttexttexttexttexttext
  texttexttexttexttext
texttexttexttext
  texttext
    texttexttext
    texttexttext
texttext

І я хацеў бы выкарыстаць гэтую каманду, каб прапусціць больш глыбока парэзаныя часткі тэксту ( «спыняецца» будзеш на адважным курсіў, калі пачынаючы з <�Ь> <�я> х ).


абнаўленне

Я даў рашэнне аналагічнай просьбай аб пераходу да частак непробельные сімвалы ўздоўж слупка .

1
Гэта падобна на змяненне emacs.stackexchange.com/questions/22091/… .
дададзена аўтар J.R., крыніца
Ці магу я спытаць, што такая каманда будзе добра? Я не магу думаць аб любой сітуацыі, дзе я знайшоў бы, што каманда карысная.
дададзена аўтар Qudit, крыніца
@glucas Дзякуй за спасылку. Гэта функцыя робіць зусім тое, што мне трэба, гэта толькі дацягвае у тым, што ён не прапускае непробельных блокі, толькі прабелы. Вызначана карысна ў любым выпадку, для мяне.
дададзена аўтар Arch Stanton, крыніца
@Qudit Глядзіце абноўлены пытанне. Я не чакаў, што на ваш пытанне, як гэта адбываецца даволі часта мне быць у выпадку неабходнасці такога руху. Для Vim ёсць нават убудова для гэтага. Ці ёсць які-небудзь каманды (акрамя наперад пункт ) я прапускаю, магчыма?
дададзена аўтар Arch Stanton, крыніца

5 адказы

Вось іншы падыход.

(defun my-down ()
  (interactive)
  (when (eq this-command last-command) (line-move-visual 1))
  (while (not (looking-at "[[:digit:]]")) (line-move-visual 1)))

(defun my-up ()
  (interactive)
  (when (eq this-command last-command) (line-move-visual -1))
  (while (not (looking-at "[[:digit:]]")) (line-move-visual -1)))

(global-set-key "\C-o" 'my-down)
(global-set-key "\C-t" 'my-up)

Гэта таксама будзе працаваць, калі ў вас кароткая лінія, напрыклад, наступны да апошняга тут:

as0sasasa
asasasasa
as1sasasa
    asa
as3sasasa
a
as2sasasa
2
дададзена
@ArchStanton Не, наперад-слова працуе не на аснове прабелаў, а на аснове сінтаксісу слова ці Самавызначаліся функцыі. Глядзіце дакумент аб перамяшчэнне наперад-слова .
дададзена аўтар Mike Spivey, крыніца
@ArchStanton Але перамяшчэнне наперад-слова у вертыкальным кірунку з'яўляецца адзінай бясспрэчнай ясна спецыфікацыяй ў вашым пытанні.
дададзена аўтар Mike Spivey, крыніца
Дзякуючы Дрю, але вы сканцэнтраваны на маіх «мэтавых» бытийных лічбаў, у той час як гэта было толькі дапаможным сродкам для explaning пытанне. Адзінае адрозненне павінна быць паміж прабеламі і без прабелаў. Я маю на ўвазе, каманда, якую я хацеў бы мець павінен працаваць аднолькава ў любым слупку тэксту, калі ён утрымоўвае тую ж паслядоўнасць прабельных і і непробельных блокі па вертыкалі. Я зрабіў іншы прыклад па гэтым пытанні ў vi.sx, якая застаецца актуальнай для гэтага, можа быць, лепш.
дададзена аўтар Arch Stanton, крыніца
@Tobias аналогіі з наперад-слова быў абмежаваны функцыянальнасцю, толькі каб зрабіць гэтае пытанне, мы спадзяемся трохі ясней.
дададзена аўтар Arch Stanton, крыніца
@Tobias Я спадзяваўся, што прыклад ахопліваў бы такую ​​ролю.
дададзена аўтар Arch Stanton, крыніца

(АП пытанне, па-відаць, не выказана вельмі ясна, і гэта, здаецца, трансфармавацца ...)

Мабыць, мэта зараз рабіць ўніз (па вертыкалі) версію наперад-слова .

Для гэтага вы можаце выкарыстоўваць каманду дш-уніз-слова (ці дш-уверх-слова , для вертыкальнай назад-слова ), з бібліятэкі <�моцны> Go Дзе ( <�моцны> gowhere.el ).

gw-downward-word is defined like this:

  1. У той час як не на слова-ўстаноўчы характар, перайсці да наступнага слова паўкокс.
  2. Затым перайдзіце да наступнага несловообразующим паўкокс.

Крок 1 перамяшчаецца ў пачатак наступнага слова. Крок 2 рухаецца (толькі) у мінулым гэтага слова.

(defun gw-downward-word (_pos &optional n)
  "Like `forward-word', but move down, not across."
  (interactive "i\np")
  (setq n  (or n  1))
  (dotimes (_i  n)
    (if (and (not (eobp))  (gw-word-char-after-p (point)))
        (gw-to-next-where-vertical #'gw-not-word-char-after-p)
      (let ((pos  (point)))
        (condition-case err
            (progn (gw-to-next-where-vertical #'gw-word-char-after-p)
                   (gw-to-next-where-vertical #'gw-not-word-char-after-p))
          (error (progn (goto-char pos) (error "%s" (error-message-string err)))))))))
1
дададзена
Нават ваш «заканчвае адну лінію далей ад жаданай мэты " паказвае, як незразумела, вы былі - вы не былі ў стане выразна паказаць, што <�я> патрабаваны мэтавай ёсць. <�Код> M-е робіць менавіта гэта: спыняецца на першым несловообразующим паўкокс пасля слова. У Emacs, <�я> слова </я> сінтаксіс азначае нешта, і вы (і любы рэжым) можна вызначыць, якія менавіта знакі з'яўляюцца словы (-constituent) сімвалы. Сінтаксіс сімвала, апрыёры, адрозніваецца. См [Сінтаксіс Desciptors]() gnu.org/software/Emacs/ручной/html_node/Elisp/& hellip; & ZWNJ ;. Калі вы хочаце _ або незалежна ад таго, каб мець сінтаксіс слоў, то вызначыць яго такім чынам.
дададзена аўтар Ryan Eastabrook, крыніца
Я не думаю, што маё пытанне не ясна, для тэксту супраць непробельной двухсэнсоўнасці, акрамя. Гэта даволі цікава, што я знайшоў значна менш цяжкасцяў, якія тлумачаць яго на vi.sx, чым тут, і што толькі часткова працоўны раствор (які зараз звязаны з пытаннем) ёсць «зло» тэг. Падобна на тое, VIM і Emacs карыстальнікаў <�я> думаю </я> аб руху па-рознаму.
дададзена аўтар Arch Stanton, крыніца
Ва ўсякім выпадку, гэты адказ у асноўным працуе, але так жа, як Тобіас ён адрознівае паміж тэкстам і сімваламі, і ён заканчвае адну лініі за межамі «жаданай мэты».
дададзена аўтар Arch Stanton, крыніца
«Мой» вертыкальны наперад-слова павінен спыніцца на апошнім радку слаба блока непробельных знакаў. Вертыкальны аналаг адсталай-словы павінен спыніцца на першым радку блока непробельных знакаў.
дададзена аўтар Arch Stanton, крыніца

Наступны сюсюкаюць код спрабуе быць як мага бліжэй да наперад-слова / назад слова , як гэта магчыма без рэалізацыі знайсці слова-краёвай функцыі стала .

Ён працуе з межамі слоў, вызначаных сінтаксічнай табліцай бягучага рэжыму і спрабуе каб застацца на бягучай лініі на працягу паўторнага прымянення каманд перамяшчэння па вертыкалі слова.

Паколькі код ня пакет сюсюкаюць пакуль каманду руху па вертыкалі словы абавязкова карыстальнік зарэзерваваныя паслядоўнасці клавіш. <�Код> VWM ўніз слова звязаны з Cc ш ↓ і VWM ўверх слова звязаны з Cc ш ↑ .

Код працуе з асноўнымі ідэямі з адказаў https://emacs.stackexchange.com/a/39168/2370 (1).

;;; vertical word motion: wvm
(defvar-local vwm-current-column nil
  "Current column for vertical word motion commands.")

(defconst vwm-commands '(vwm-down-word vwm-up-word)
  "Vertical word motion commands keeping `vwm-current-column'.")

(defmacro vwm-repeat-command (arg neg-fun pos-fun &rest body)
  "If ARG is negative call NEG-FUN with ARG.
If ARG is larger than 1 call POS-FUN with 1 ARG times.
If ARG is 1 eval BODY like `progn'.
Also takes care of `wvm-current-column'."
  (declare (debug (integerp symbolp symbolp body)) (indent 3))
  `(progn
     (message "Last command: %s" last-command)
     (unless (and (memq last-command vwm-commands)
                  (numberp vwm-current-column))
       (setq vwm-current-column (current-column)))
     (unless arg
       (setq arg 1))
     (cl-assert (integerp arg) nil
                "Expected integer number as argument of `down-word'")
     (prog1
         (cond
          ((< arg 0)
           (,neg-fun (- arg)))
          ((> arg 1)
           (while (and (> arg 0)
                       (,pos-fun 1))
             (cl-decf arg))
           (eq arg 0))
          ((eq arg 1)
           ,@body)
          (t ;; case arg == 0 does nothing
           nil))
       (when (numberp vwm-current-column)
         (line-move-to-column vwm-current-column)))))

(defun vwm-down-one-word (arg)
  "Move down one word if ARG is positive.
Move up one word if ARG is negative."
  (cl-assert (and (numberp arg)
                  (/= arg 0))
             nil "Argument of `down-one-word' must be a non-zero number")
  (setq arg (cl-signum arg))
  (let ((ret t))
    ;; skip whitespace
    (while (and (null (looking-at-p "\\sw"))
                (condition-case nil
                    (progn
                      (when (numberp vwm-current-column)
                        (line-move-to-column vwm-current-column))
                      (line-move-visual arg)
                      t)
                  (error (setq ret nil)))))
    ;; move downwards to end of word
    (when ret
      (while (and (looking-at-p "\\sw")
                  (condition-case nil
                      (progn
                        (when (numberp vwm-current-column)
                          (line-move-to-column vwm-current-column))
                        (line-move-visual arg)
                        t)
                    (error nil)))))
    ret))

(defun vwm-down-word (&optional arg)
  "Move point downwards ARG vertical words (upwards if ARG is negative).
If ARG is omitted or nil, move point downwards one word.
Normally returns t.
If the bottom of the buffer is reached, point is
left there and the function returns nil.

The word boundaries are normally by the buffer’s syntax
table."
  (interactive "p")
  (vwm-repeat-command arg vwm-up-word vwm-down-word
    (vwm-down-one-word 1)))

(defun vwm-up-word (&optional arg)
  "Move upwards until encountering the beginning of a vertical word.
With argument ARG, do this that many times.
If ARG is omitted or nil, move point backward one word.

The word boundaries are determined by the buffer’s syntax
table."
  (interactive "p")
  (vwm-repeat-command arg vwm-down-word vwm-up-word
    (vwm-down-one-word -1)))

(global-set-key (kbd "C-c w ") 'vwm-down-word)
(global-set-key (kbd "C-c w ") 'vwm-up-word)
1
дададзена
+1. Выбачайце за позні каментар, я ўчора атрымаў ступень і за апошнія некалькі дзён былі даволі інтэнсіўнымі. Гэта працуе ў асноўным добра, за выключэннем двух рэчаў: першы, ён перамяшчаецца на адзін радок за жаданай «мэты», другі, яна прапускае дужкі і іншыя сімвалы (я павінен быў быць больш дакладным і сказаў, што ён павінен скакаць праз прабел ці не- пробельные блокі, больш Ws/тэкставых блокаў).
дададзена аўтар Arch Stanton, крыніца

Я думаю, што гэта ў значнай ступені робіць тое, што вы просіце, нават калі ён мае некалькі іншы густ. Для гэтага вам трэба бібліятэка ISearch + ( ISearch + .el ).

  1. Select the text for that column:

    a. Set the region corners before the 0 in the first line and after the 2 in the last line.

    b. Use C-x SPC, to turn on rectangle-mark-mode.

  2. Use C-M-s to search for the regexp [[:digit:]] (or whatever else you want to match in that column). Repeat C-M-s to search forward; repeat C-M-r to search backward.

Пры ўмове, опцыя <�моцны> isearchp-абмежавання да рэгіёну сцяг не з'яўляецца нулявым, што гэта па змаўчанні, калі вобласць з'яўляецца актыўным ISearch + абмяжоўвае пошук у рэгіёне. (Вы можаце таксама шукаць толькі па-за вобласць.) Калі вобласць мае прастакутную форму (гэта значыць, яна задавальняе вобласць-несумежных-р ), пошук абмяжоўваецца прамавугольнай вобласці.

У гэтым выпадку прастакутная вобласць уяўляе сабой адзін слупок знакаў.


З іншага боку, калі вы не хочаце, каб выбраць бягучы слупок як прастакутнік, вы можаце выкарыстоўваць <�моцны> Cz з ць ISearch сказаць яму, каб абмежаваць пошук паміж двума калонамі - у гэтым выпадак значэнне (бягучы слупок) і (1+ (бягучы слупок)) . Вам будуць прапанаваны для значэнняў слупкоў, так што вы спачатку выкарыстоўваць M-: (ток-слупок) , каб атрымаць нумар слупка.

У вашым выпадку гэта слупок 2, які вы хочаце знайсці, так што ў радку з Cz з трэба ўвесці 2 і 3 для мін і не больш за слупкоў для пошуку.

Ці вы маглі б вызначыць сваю ўласную ISearch каманду фільтр-прэдыкатаў-складання для гэтага, і прывязаць яго да ключа (напрыклад C-Z C ) у раскладцы клавіятуры isearchp фільтр-карта :

(defun isearchp-this-column (&optional flip-read-name-p flip-read-prefix-p msgp)
  "Add predicate that restricts search to this column.
You might be prompted for a predicate name or an Isearch prompt
prefix.  See `isearchp-add-filter-predicate' for info about this and
about the use of a prefix argument."
  (interactive
    (list (and current-prefix-arg  (<= (prefix-numeric-value current-prefix-arg) 0))
          (and current-prefix-arg  (>= (prefix-numeric-value current-prefix-arg) 0))
          t))
  (let ((col  (current-column)))
    (isearchp-add-filter-predicate
      `(lambda (beg end)
          (and (= (save-excursion (goto-char beg) (current-column)) ,(1- col))
               (= (save-excursion (goto-char end) (current-column)) ,col)))
          flip-read-name-p flip-read-prefix-p msgp)))

(define-key isearchp-filter-map (kbd "C") 'isearchp-this-column) ; `C-z C'

Ці, калі вы на самой справе не клапаціцца пра дадання і выдалення фільтра прэдыкаты дынамічна (і вы, верагодна, дон «т, тут), то вы можаце проста вызначыць сваю ўласную каманду пошуку для гэтага, выкарыстоўваючы прэдыкатаў фільтра, вызначаны для слупка, у якім вы пачынаеце пошук. (А потым шукаць [[: лічба]] , як і ў іншых выпадках, названых вышэй.)

(defun search-this-column ()
  "Regexp-search current column only, using filter predicate `this-col-p'."
  (interactive)
  (let ((isearch-filter-predicate  (this-col-p (current-column))))
    (isearch-forward-regexp)))

(defun this-col-p (column)
  "Return filter predicate that returns non-nil if search hit is in COLUMN."
  `(lambda (beg end)
     (and (= (save-excursion (goto-char beg) (current-column)) ,column)
          (= (save-excursion (goto-char end) (current-column)) ,(1+ column)))))
0
дададзена

Калі вы хочаце знайсці цэлую радок па вертыкалі, то рэчы складаней. Emacs на самай справе не вельмі паддаецца гэтаму. З аднаго боку, што рабіць лініі, якая карацей, чым калонкі, якую вы спрабуеце знайсці? Гэта можа быць праігнаравана ці гэта можа азначаць, што пошук не ўдаецца.

Гэта чытае шаблон пошуку (літаральнае або з прэфіксам ARG, рэгулярных выразаў) і выконвае пошук ўніз бягучага слупка для яго. Regexp адпаведнасці з'яўляецца не сквапны - самы кароткі матч заканчвае пошук. І кароткія радкі, якія сустракаюцца на ўвазе пошук трывае няўдачу.

(defun search-downward (pattern &optional regexp-p)
  "Seach for PATTERN vertically downward.
With a prefix arg, search for PATTERN as a regexp.
Otherwise, search for it literally."
  (interactive (let ((prompt  (if current-prefix-arg "Regexp search: " "Search: ")))
                 (list (read-string prompt) current-prefix-arg)))
  (unless regexp-p (setq pattern  (regexp-quote pattern)))
  (let ((opoint  (point))
        (col     (current-column))
        (chrs    "")
        chr fail)
    (setq fail  (catch 'search-downward
                  (while (not (= (line-end-position) (point-max)))
                    (line-move-visual 1)
                    (when (and (< (current-column) col)  (not (eobp)))
                      (throw 'search-downward "- short line encountered"))
                    (setq chr   (char-after))
                    (when chr (setq chrs  (concat chrs (list chr))))
                    (when (string-match-p pattern chrs) (throw 'search-downward nil)))
                  ""))
    (when fail
      (goto-char opoint)
      (message "No match%s" fail))))
0
дададзена
Дзякуй Дрю за дапамогу мне. Што мне трэба, хоць гэта тое, што хутка рухаецца над тэкстам/пробельные блокам. Ён павінен паводзіць сябе як каманда руху, а не як каманду пошуку (яна не павінна запытваць для пошукавага запыту). Адказ на Як скакаць уверх ці ўніз да першага знаку ў той жа калонцы фактычна робіць палову правы працы: ён прапускае блокі прабелаў, але не блокі тэксту.
дададзена аўтар Arch Stanton, крыніца
Калі радок карацей, ён павінен прапусціць. Гэта спрэчнае пытанне, што ён павінен рабіць, калі ёсць прабелы ў радку роўна ў той жа калонцы, я знаходжуся, але тэкст па абодва бакі ад яго (як гэта можа адбыцца па кароткай лініі з каментаром далей справа: блаблабла | #comment , дзе | паказвае на слупок курсора). Я б сказаў, што ён павінен спыніцца на ім.
дададзена аўтар Arch Stanton, крыніца