Ubuntu

PSQL複製粘貼製表符完成並插入錯誤的括號

  • October 8, 2019

**注意,我使用標籤。**通常,當我在這個站點上寫答案時,我會在vim-surround的幫助下用 vim 編寫它們,尤其是當我將固定寬度的表格/網格遷移到 DDL 時。以下是此類遷移的範例:

CREATE TABLE foo (man_id,subgroup,power,grp)
AS VALUES
   ( 1, 'sub_A', 'positive', 'Group_A' );

現在將渲染的程式碼複製並粘貼到psql其中,它將起作用。但這就是問題所在。編輯這個問題(但不要錯誤地更改任何內容),然後複製程式碼塊的原始降價。這是正常工作流程的一部分,尤其是在存在已知錯誤或拼寫錯誤並且您想修復它們的情況下。將原始 Markdown 粘貼到 psql 中,然後神奇地得到,

test=#     CREATE TABLE foo (man_id,subgroup,power,grp)
test-#     AS VALUES
test-#     ( ( 1, 'sub_A', 'positive', 'Group_A' );
test(# 

您會看到選項卡消失了,並且您還擁有無法輕易刪除的其他括號。更糟糕的是,您幾乎必須猜測字元序列才能從提示中擺脫出來,

test(# )
test-# ;
ERROR:  syntax error at or near "test"
LINE 1: test=#     CREATE TABLE foo (man_id,subgroup,power,grp)

   ^

有沒有辦法告訴 psql 不要在這裡做任何特別的事情,或者在這些情況下(複製和粘貼)保持理智?似乎是選項卡的結果,StackExchange 在 Markdown Rendering 上混淆了空格,使我的複制和粘貼更容易,但調試起來更混亂。

我的版本psql是用libedit,

libedit.so.2 => /usr/lib/x86_64-linux-gnu/libedit.so.2 (0x00007f294453f000)

Debian 實際上並沒有使用libedit,他們只是連結它以規避 GPL。他們所做的是 PRELOAD libreadline,它是 GPL 而不是 LGPL 庫。理想情況下,libreadline不會在沒有非空白字元的換行符上完成製表符,您可以修復它來做到這一點。

括號粘貼

當我研究修補這個時,libreadline已經有了那個功能

enable-bracketed-paste當設置為“開”時,Readline 將配置終端,使其能夠將每個粘貼作為單個字元串插入到編輯緩衝區中,而不是將每個字元視為從鍵盤讀取的。這可以防止粘貼的字元被解釋為編輯命令。預設值為“關閉”。

您需要做的就是將其添加到~/.inputrc.

echo 'set enable-bracketed-paste on' >> ~/.inputrc

現在,當您在終端中粘貼時,終端將發送libreadline控製字元,它將解釋為在粘貼期間禁用製表符補全。您可以在下面閱讀有關此內容的更多資訊,

這也出現在psql 列表中

引用自:https://dba.stackexchange.com/questions/209974