Как заменить символ в курсоре в шепелявости emacs

Это поведение легко объяснено через размер буфера вывода и настройки окна TCP.

Во-первых, при получении данных, у Вас или есть биты, или Вы не делаете. Ваше локальное scp знает, сколько это ожидает и сколько это получило до сих пор, таким образом, это может дать Вам точную оценку прогресса и оцененное время, оставаясь.

При отправке данных у Вас нет информации о том, сколько из тех данных на самом деле достигло получателя все же. Ваша локальная машина будет иметь буфер вывода, который содержит данные после того, как это было "отправлено" приложением (scp) и прежде чем это будет на самом деле передано в сети. Кроме того, TCP позволяет определенному количеству данных быть "в полете" между отправителем и получателем.

При отправке данных, scp только видит, сколько это передало к ОС для возможной передачи. Заполнение буферов вывода происходит действительно быстро, так вот почему scp измеряет высокую скорость передачи первоначально. В то время как передача прогрессирует, это значение сходится к реальной скорости передачи. После того, как Вы передали все данные к своей ОС, они все еще должны достигнуть другой стороны, и вот почему это, кажется, застревает в 100% в течение нескольких секунд в конце.

Современные сети OSes и TCP увеличили размер окна TCP (см., что окно TCP масштабирует опцию), составлять "длинные толстые сети" и с широкой полосой пропускания и с высокой задержкой. Именно поэтому можно видеть, что это поведение чаще, чем Вы имеет в прошлом.

3
20.07.2014, 19:36
1 ответ

(replace-string «o» «ô») заменяет следующее вхождение o после курсора¹, за исключением режима временной метки, на активная метка, и в этом случае она заменяет первое вхождение в отмеченной области.

Это работает для замены символа после курсора, но, конечно, если это не или , тогда он может заменить символ и дальше. Вы можете использовать аргументы START и END для replace-string , чтобы ограничить степень замены, но это не масштабируется. Используйте char-after , чтобы получить символ после курсора, и char-before , чтобы получить символ перед курсором. Эта функция выглядит так, как будто она предназначена для использования после ввода o , поэтому я думаю, что char-before - это то, что вы ищете.

(require 'cl)
(defun thai-add-tone ()
  (interactive "*")
  (case (char-before)
   ((?o)
    (delete-backward-char 1)
    (insert "ô"))
   ((?u)
    (delete-backward-char 1)
    (insert "û"))))

Альтернативный подход состоит в том, чтобы провести тест (или серию тестов) с просмотром (для текста, начинающегося с курсора) или просмотром назад (для текста, заканчивающегося под курсором). Затем вы можете вызвать replace-match , чтобы заменить текст; это допускает некоторую автоматизацию, например, Emacs может позаботиться о замене строчных букв строчными и прописных на прописные.

(defvar thai-tone-conversion-list
    '(("o" . "ô") ("u" . "û")))
(defun thai-add-tone ()
  (interactive "*")
  (when (let ((case-fold-search t))
          (looking-back "[ou]"))
    (replace-match (cdr (assoc (match-string 0) thai-tone-conversion-list)))))

Обратите внимание, что Emacs уже имеет некоторую поддержку тайского языка, возможно, будет проще использовать его, чем изобретать велосипед. Вы можете выбрать один из двух тайских методов ввода с помощью set-input-method ( C-x RET C - \ ). Похоже, что нет никакой документации на английском языке, кроме исходного кода .

¹ В терминологии Emacs «курсор» в позиции, в которой производится редактирование, называется точкой . Слово курсор зарезервировано для визуального артефакта на экране, который отмечает положение точки.

2
27.01.2020, 21:28

Теги

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