Есть ли способ скопировать всю строку до символа остановки в Emacs? - PullRequest
5 голосов
/ 13 октября 2010

Сегодня в VI я увидел функцию аккуратного копирования, в которой можно копировать всю строку до символа остановки.

например. if( copy == this );

С VI он мог скопировать все в круглых скобках. Интересно, можно ли сделать это и с emacs? (Без использования ctrl + пробел и ручной маркировки того, что я хочу убить)

Ответы [ 5 ]

13 голосов
/ 13 октября 2010

Попробуйте

M-z CHAR

Который убивает текст через следующее вхождение CHAR. Ака М-х Зап-к-чар . Представляет интерес документация для Другие команды убийства .

Отредактировано, чтобы добавить: По запросу вот zap-to-before-char, который просто взял исходный код для zap-to-char и удалил комментарий (и обновленную строку документа):

(defun zap-to-before-char (arg char)
  "Kill up to and ARGth occurrence of CHAR.
Case is ignored if `case-fold-search' is non-nil in the current buffer.
Goes backward if ARG is negative; error if CHAR not found."
  (interactive "p\ncZap to char: ")
  ;; Avoid "obsolete" warnings for translation-table-for-input.
  (with-no-warnings
    (if (char-table-p translation-table-for-input)
        (setq char (or (aref translation-table-for-input char) char))))
  (kill-region (point) (progn
                         (search-forward (char-to-string char) nil nil arg)
                         (goto-char (if (> arg 0) (1- (point)) (1+ (point))))
                         (point))))
2 голосов
/ 13 октября 2010

Если курсор находится в скобках, самая короткая последовательность, которую я могу придумать для копирования всей группы в скобках (включая скобки), равна C-M-u C-M-SPC M-w (backward-up-list, mark-sexp, kill-ring-save). Если вы хотите убить этот текст, C-M-u C-M-k (backward-up-sexp, kill-sexp). Команды sexp, как правило, являются самым простым способом работы с группами в скобках; другие важные команды: C-M-b (backward-sexp) и C-M-f (forward-sexp) (обратите внимание на тему C-M-).

0 голосов
/ 16 октября 2010

Прелесть Emacs в том, что написать элисп очень легко, чтобы заставить его делать то, что вы хотите:

(defun mark-inside-delimiters ()
"Mark all chars inside the balanced expression point is in"
  (interactive)
  (let (p start pairs stop)
    (skip-chars-backward "^<({[\"'")
    (setq p (point))
    (setq start (char-to-string (preceding-char)))
    (setq pairs '(("<" . ">")("(" . ")")("{" . "}")
                  ("[" . "]")("\"" . "\"")("'" . "'")))
    (setq stop (cdr (assoc start pairs)))
    (skip-chars-forward (concat"^" stop))
    (set-mark p)))

(global-set-key (kbd "C-c m") 'mark-inside-delimiters)

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

0 голосов
/ 13 октября 2010

Emacs имеет команды gazillion, поэтому вполне может быть такая, которая делает именно это.

Что я делаю в такой ситуации, это отмечаю мое место (ctrl-пробел), затем выполняю поиск вперед (ctrl-s) и введите то, что я ищу (в вашем случае это конечный член, но это может быть что-то более подробное, например, «конец My_Procedure_Name;» Паскаля).Это выделит весь текст от того, где я размечен, до того, где он нашел шаблон поиска.Затем я ctrl-k, чтобы вырезать текст в буфере уничтожения.

Короче говоря:

ctrl-space
ctrl-s
) return
ctrl-k

ctrl-_, если вы хотите сохранить текст там, где он тоже).

Там может быть быстрее / лучше / и т.д.пути, но это подмножество команд emacs, которые я знаю достаточно хорошо, чтобы обойтись без необходимости думать об этом.

0 голосов
/ 13 октября 2010

Конечно, определите макрос. Начните запись макроса, набрав c-x (. Затем выполните последовательность команд, которую вы хотите повторить:

c-s (
c-space
c-s )
M-w

Затем закончите свой макрос с c-x ). Используйте это с c-x e.

Что-то в этом роде ... Возможно, у него проблемы с забором. Если вы не хотите, чтобы он перемещал вашу метку, сохраните его и восстановите в начале макроса.

Подробнее о макросах (например, как сохранить привязку их к другим ключам) здесь:

http://www.emacswiki.org/emacs/KeyboardMacros

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...